From de4712f3213dfe7bab2c060917e8ff2dbda38a27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 8 May 2025 13:30:06 +0200 Subject: [PATCH 001/422] feat(fmt): run goimports on format make command (#733) --- Makefile | 1 + go.mod | 9 ++++++--- go.sum | 4 ++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e7b1abba0..171d9864d 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ build: fmt: @gofmt -s -w . + @go tool goimports -w . # Lint lint-golangci-lint: diff --git a/go.mod b/go.mod index 115e36520..3e5f0a4b2 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( ) require ( - golang.org/x/net v0.39.0 // indirect + golang.org/x/net v0.40.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -206,7 +206,7 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.14.0 // indirect - golang.org/x/tools v0.32.0 // indirect + golang.org/x/tools v0.33.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.6.1 // indirect @@ -254,4 +254,7 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -tool github.com/golangci/golangci-lint/cmd/golangci-lint +tool ( + github.com/golangci/golangci-lint/cmd/golangci-lint + golang.org/x/tools/cmd/goimports +) diff --git a/go.sum b/go.sum index babf8358f..43889808a 100644 --- a/go.sum +++ b/go.sum @@ -794,6 +794,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -961,6 +963,8 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= 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= From 8622b5f04964a8ba4ff18e39724884420c89ed04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 9 May 2025 15:25:58 +0200 Subject: [PATCH 002/422] refactor(cli): pass parameter struct to cmd factories (#735) relates to STACKITCLI-180 --- .github/docs/contribution-guide/client.go | 35 ++++ .github/docs/contribution-guide/cmd.go | 156 +++++++++++++++ CONTRIBUTION.md | 177 +----------------- .../cmd/affinity-groups/affinity-groups.go | 16 +- internal/cmd/affinity-groups/create/create.go | 11 +- .../cmd/affinity-groups/create/create_test.go | 5 +- internal/cmd/affinity-groups/delete/delete.go | 17 +- .../cmd/affinity-groups/delete/delete_test.go | 3 +- .../cmd/affinity-groups/describe/describe.go | 9 +- .../affinity-groups/describe/describe_test.go | 5 +- internal/cmd/affinity-groups/list/list.go | 11 +- .../cmd/affinity-groups/list/list_test.go | 5 +- .../activate_service_account.go | 13 +- .../activate_service_account_test.go | 3 +- internal/cmd/auth/auth.go | 16 +- .../auth/get-access-token/get_access_token.go | 6 +- internal/cmd/auth/login/login.go | 8 +- internal/cmd/auth/logout/logout.go | 6 +- internal/cmd/beta/alb/alb.go | 28 +-- internal/cmd/beta/alb/create/create.go | 17 +- internal/cmd/beta/alb/create/create_test.go | 5 +- internal/cmd/beta/alb/delete/delete.go | 15 +- internal/cmd/beta/alb/delete/delete_test.go | 3 +- internal/cmd/beta/alb/describe/describe.go | 11 +- .../cmd/beta/alb/describe/describe_test.go | 5 +- internal/cmd/beta/alb/list/list.go | 15 +- internal/cmd/beta/alb/list/list_test.go | 5 +- .../alb/observability-credentials/add/add.go | 11 +- .../observability-credentials/add/add_test.go | 5 +- .../delete/delete.go | 11 +- .../delete/delete_test.go | 3 +- .../describe/describe.go | 11 +- .../describe/describe_test.go | 5 +- .../observability-credentials/list/list.go | 11 +- .../list/list_test.go | 5 +- .../observability-credentials.go | 18 +- .../update/update.go | 15 +- .../update/update_test.go | 5 +- internal/cmd/beta/alb/plans/plans.go | 15 +- internal/cmd/beta/alb/plans/plans_test.go | 5 +- internal/cmd/beta/alb/pool/pool.go | 10 +- internal/cmd/beta/alb/pool/update/update.go | 15 +- .../cmd/beta/alb/pool/update/update_test.go | 5 +- internal/cmd/beta/alb/quotas/quotas.go | 11 +- internal/cmd/beta/alb/quotas/quotas_test.go | 5 +- internal/cmd/beta/alb/template/template.go | 7 +- .../cmd/beta/alb/template/template_test.go | 3 +- internal/cmd/beta/alb/update/update.go | 17 +- internal/cmd/beta/alb/update/update_test.go | 5 +- internal/cmd/beta/beta.go | 12 +- .../sqlserverflex/database/create/create.go | 13 +- .../database/create/create_test.go | 5 +- .../beta/sqlserverflex/database/database.go | 16 +- .../sqlserverflex/database/delete/delete.go | 13 +- .../database/delete/delete_test.go | 3 +- .../database/describe/describe.go | 9 +- .../database/describe/describe_test.go | 5 +- .../beta/sqlserverflex/database/list/list.go | 15 +- .../sqlserverflex/database/list/list_test.go | 3 +- .../sqlserverflex/instance/create/create.go | 17 +- .../instance/create/create_test.go | 5 +- .../sqlserverflex/instance/delete/delete.go | 15 +- .../instance/delete/delete_test.go | 3 +- .../instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- .../beta/sqlserverflex/instance/instance.go | 18 +- .../beta/sqlserverflex/instance/list/list.go | 15 +- .../sqlserverflex/instance/list/list_test.go | 3 +- .../sqlserverflex/instance/update/update.go | 15 +- .../instance/update/update_test.go | 5 +- .../cmd/beta/sqlserverflex/options/options.go | 9 +- .../sqlserverflex/options/options_test.go | 7 +- .../cmd/beta/sqlserverflex/sqlserverflex.go | 16 +- .../beta/sqlserverflex/user/create/create.go | 13 +- .../sqlserverflex/user/create/create_test.go | 3 +- .../beta/sqlserverflex/user/delete/delete.go | 15 +- .../sqlserverflex/user/delete/delete_test.go | 3 +- .../sqlserverflex/user/describe/describe.go | 9 +- .../user/describe/describe_test.go | 5 +- .../cmd/beta/sqlserverflex/user/list/list.go | 13 +- .../beta/sqlserverflex/user/list/list_test.go | 3 +- .../user/reset-password/reset_password.go | 15 +- .../reset-password/reset_password_test.go | 5 +- internal/cmd/beta/sqlserverflex/user/user.go | 18 +- internal/cmd/config/config.go | 16 +- internal/cmd/config/list/list.go | 7 +- internal/cmd/config/list/list_test.go | 3 +- internal/cmd/config/profile/create/create.go | 17 +- .../cmd/config/profile/create/create_test.go | 3 +- internal/cmd/config/profile/delete/delete.go | 13 +- .../cmd/config/profile/delete/delete_test.go | 3 +- internal/cmd/config/profile/export/export.go | 9 +- .../cmd/config/profile/export/export_test.go | 3 +- internal/cmd/config/profile/import/import.go | 9 +- .../cmd/config/profile/import/import_test.go | 3 +- internal/cmd/config/profile/list/list.go | 7 +- internal/cmd/config/profile/list/list_test.go | 3 +- internal/cmd/config/profile/profile.go | 22 +-- internal/cmd/config/profile/set/set.go | 15 +- internal/cmd/config/profile/set/set_test.go | 3 +- internal/cmd/config/profile/unset/unset.go | 13 +- internal/cmd/config/set/set.go | 7 +- internal/cmd/config/set/set_test.go | 3 +- internal/cmd/config/unset/unset.go | 5 +- internal/cmd/config/unset/unset_test.go | 3 +- internal/cmd/curl/curl.go | 9 +- internal/cmd/curl/curl_test.go | 5 +- internal/cmd/dns/dns.go | 12 +- internal/cmd/dns/record-set/create/create.go | 15 +- .../cmd/dns/record-set/create/create_test.go | 5 +- internal/cmd/dns/record-set/delete/delete.go | 17 +- .../cmd/dns/record-set/delete/delete_test.go | 3 +- .../cmd/dns/record-set/describe/describe.go | 9 +- .../dns/record-set/describe/describe_test.go | 5 +- internal/cmd/dns/record-set/list/list.go | 13 +- internal/cmd/dns/record-set/list/list_test.go | 5 +- internal/cmd/dns/record-set/record_set.go | 18 +- internal/cmd/dns/record-set/update/update.go | 19 +- .../cmd/dns/record-set/update/update_test.go | 3 +- internal/cmd/dns/zone/clone/clone.go | 15 +- internal/cmd/dns/zone/clone/clone_test.go | 5 +- internal/cmd/dns/zone/create/create.go | 17 +- internal/cmd/dns/zone/create/create_test.go | 5 +- internal/cmd/dns/zone/delete/delete.go | 15 +- internal/cmd/dns/zone/delete/delete_test.go | 3 +- internal/cmd/dns/zone/describe/describe.go | 9 +- .../cmd/dns/zone/describe/describe_test.go | 5 +- internal/cmd/dns/zone/list/list.go | 15 +- internal/cmd/dns/zone/list/list_test.go | 5 +- internal/cmd/dns/zone/update/update.go | 15 +- internal/cmd/dns/zone/update/update_test.go | 3 +- internal/cmd/dns/zone/zone.go | 20 +- internal/cmd/image/create/create.go | 13 +- internal/cmd/image/create/create_test.go | 5 +- internal/cmd/image/delete/delete.go | 17 +- internal/cmd/image/delete/delete_test.go | 3 +- internal/cmd/image/describe/describe.go | 9 +- internal/cmd/image/describe/describe_test.go | 5 +- internal/cmd/image/image.go | 18 +- internal/cmd/image/list/list.go | 15 +- internal/cmd/image/list/list_test.go | 5 +- internal/cmd/image/update/update.go | 17 +- internal/cmd/image/update/update_test.go | 3 +- internal/cmd/key-pair/create/create.go | 11 +- internal/cmd/key-pair/create/create_test.go | 5 +- internal/cmd/key-pair/delete/delete.go | 11 +- internal/cmd/key-pair/delete/delete_test.go | 3 +- internal/cmd/key-pair/describe/describe.go | 11 +- .../cmd/key-pair/describe/describe_test.go | 5 +- internal/cmd/key-pair/key-pair.go | 18 +- internal/cmd/key-pair/list/list.go | 11 +- internal/cmd/key-pair/list/list_test.go | 5 +- internal/cmd/key-pair/update/update.go | 11 +- internal/cmd/key-pair/update/update_test.go | 5 +- internal/cmd/load-balancer/create/create.go | 17 +- .../cmd/load-balancer/create/create_test.go | 3 +- internal/cmd/load-balancer/delete/delete.go | 13 +- .../cmd/load-balancer/delete/delete_test.go | 3 +- .../cmd/load-balancer/describe/describe.go | 9 +- .../load-balancer/describe/describe_test.go | 5 +- .../generate-payload/generate_payload.go | 11 +- .../generate-payload/generate_payload_test.go | 7 +- internal/cmd/load-balancer/list/list.go | 15 +- internal/cmd/load-balancer/list/list_test.go | 5 +- internal/cmd/load-balancer/load_balancer.go | 26 +-- .../observability-credentials/add/add.go | 17 +- .../observability-credentials/add/add_test.go | 5 +- .../cleanup/cleanup.go | 17 +- .../cleanup/cleanup_test.go | 3 +- .../delete/delete.go | 17 +- .../delete/delete_test.go | 3 +- .../describe/describe.go | 9 +- .../describe/describe_test.go | 5 +- .../observability-credentials/list/list.go | 15 +- .../list/list_test.go | 5 +- .../observability-credentials.go | 20 +- .../update/update.go | 19 +- .../update/update_test.go | 3 +- internal/cmd/load-balancer/quota/quota.go | 9 +- .../cmd/load-balancer/quota/quota_test.go | 5 +- .../target-pool/add-target/add_target.go | 11 +- .../target-pool/add-target/add_target_test.go | 3 +- .../target-pool/describe/describe.go | 9 +- .../target-pool/describe/describe_test.go | 5 +- .../remove-target/remove_target.go | 13 +- .../remove-target/remove_target_test.go | 3 +- .../load-balancer/target-pool/target_pool.go | 14 +- internal/cmd/load-balancer/update/update.go | 11 +- .../cmd/load-balancer/update/update_test.go | 3 +- .../cmd/logme/credentials/create/create.go | 13 +- .../logme/credentials/create/create_test.go | 5 +- internal/cmd/logme/credentials/credentials.go | 16 +- .../cmd/logme/credentials/delete/delete.go | 15 +- .../logme/credentials/delete/delete_test.go | 3 +- .../logme/credentials/describe/describe.go | 9 +- .../credentials/describe/describe_test.go | 5 +- internal/cmd/logme/credentials/list/list.go | 13 +- .../cmd/logme/credentials/list/list_test.go | 5 +- internal/cmd/logme/instance/create/create.go | 17 +- .../cmd/logme/instance/create/create_test.go | 5 +- internal/cmd/logme/instance/delete/delete.go | 15 +- .../cmd/logme/instance/delete/delete_test.go | 3 +- .../cmd/logme/instance/describe/describe.go | 9 +- .../logme/instance/describe/describe_test.go | 5 +- internal/cmd/logme/instance/instance.go | 18 +- internal/cmd/logme/instance/list/list.go | 15 +- internal/cmd/logme/instance/list/list_test.go | 3 +- internal/cmd/logme/instance/update/update.go | 15 +- .../cmd/logme/instance/update/update_test.go | 3 +- internal/cmd/logme/logme.go | 14 +- internal/cmd/logme/plans/plans.go | 15 +- internal/cmd/logme/plans/plans_test.go | 3 +- .../cmd/mariadb/credentials/create/create.go | 13 +- .../mariadb/credentials/create/create_test.go | 5 +- .../cmd/mariadb/credentials/credentials.go | 16 +- .../cmd/mariadb/credentials/delete/delete.go | 15 +- .../mariadb/credentials/delete/delete_test.go | 3 +- .../mariadb/credentials/describe/describe.go | 9 +- .../credentials/describe/describe_test.go | 5 +- internal/cmd/mariadb/credentials/list/list.go | 13 +- .../cmd/mariadb/credentials/list/list_test.go | 5 +- .../cmd/mariadb/instance/create/create.go | 17 +- .../mariadb/instance/create/create_test.go | 5 +- .../cmd/mariadb/instance/delete/delete.go | 15 +- .../mariadb/instance/delete/delete_test.go | 3 +- .../cmd/mariadb/instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/mariadb/instance/instance.go | 18 +- internal/cmd/mariadb/instance/list/list.go | 15 +- .../cmd/mariadb/instance/list/list_test.go | 3 +- .../cmd/mariadb/instance/update/update.go | 15 +- .../mariadb/instance/update/update_test.go | 3 +- internal/cmd/mariadb/mariadb.go | 14 +- internal/cmd/mariadb/plans/plans.go | 15 +- internal/cmd/mariadb/plans/plans_test.go | 3 +- internal/cmd/mongodbflex/backup/backup.go | 20 +- .../mongodbflex/backup/describe/describe.go | 11 +- .../backup/describe/describe_test.go | 5 +- internal/cmd/mongodbflex/backup/list/list.go | 11 +- .../cmd/mongodbflex/backup/list/list_test.go | 5 +- .../backup/restore-jobs/restore_jobs.go | 11 +- .../backup/restore-jobs/restore_jobs_test.go | 5 +- .../cmd/mongodbflex/backup/restore/restore.go | 19 +- .../backup/restore/restore_test.go | 3 +- .../mongodbflex/backup/schedule/schedule.go | 9 +- .../backup/schedule/schedule_test.go | 3 +- .../backup/update-schedule/update_schedule.go | 11 +- .../cmd/mongodbflex/instance/create/create.go | 17 +- .../instance/create/create_test.go | 5 +- .../cmd/mongodbflex/instance/delete/delete.go | 15 +- .../instance/delete/delete_test.go | 3 +- .../mongodbflex/instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/mongodbflex/instance/instance.go | 18 +- .../cmd/mongodbflex/instance/list/list.go | 15 +- .../mongodbflex/instance/list/list_test.go | 3 +- .../cmd/mongodbflex/instance/update/update.go | 15 +- .../instance/update/update_test.go | 5 +- internal/cmd/mongodbflex/mongodbflex.go | 16 +- internal/cmd/mongodbflex/options/options.go | 10 +- .../cmd/mongodbflex/options/options_test.go | 9 +- .../cmd/mongodbflex/user/create/create.go | 13 +- .../mongodbflex/user/create/create_test.go | 3 +- .../cmd/mongodbflex/user/delete/delete.go | 15 +- .../mongodbflex/user/delete/delete_test.go | 3 +- .../cmd/mongodbflex/user/describe/describe.go | 9 +- .../user/describe/describe_test.go | 5 +- internal/cmd/mongodbflex/user/list/list.go | 13 +- .../cmd/mongodbflex/user/list/list_test.go | 3 +- .../user/reset-password/reset_password.go | 15 +- .../reset-password/reset_password_test.go | 5 +- .../cmd/mongodbflex/user/update/update.go | 15 +- .../mongodbflex/user/update/update_test.go | 3 +- internal/cmd/mongodbflex/user/user.go | 20 +- internal/cmd/network-area/create/create.go | 17 +- .../cmd/network-area/create/create_test.go | 5 +- internal/cmd/network-area/delete/delete.go | 15 +- .../cmd/network-area/delete/delete_test.go | 3 +- .../cmd/network-area/describe/describe.go | 9 +- .../network-area/describe/describe_test.go | 5 +- internal/cmd/network-area/list/list.go | 17 +- internal/cmd/network-area/list/list_test.go | 5 +- .../network-range/create/create.go | 13 +- .../network-range/create/create_test.go | 5 +- .../network-range/delete/delete.go | 15 +- .../network-range/delete/delete_test.go | 3 +- .../network-range/describe/describe.go | 9 +- .../network-range/describe/describe_test.go | 5 +- .../network-area/network-range/list/list.go | 13 +- .../network-range/list/list_test.go | 5 +- .../network-range/network_range.go | 16 +- internal/cmd/network-area/network_area.go | 22 +-- .../cmd/network-area/route/create/create.go | 13 +- .../network-area/route/create/create_test.go | 5 +- .../cmd/network-area/route/delete/delete.go | 13 +- .../network-area/route/delete/delete_test.go | 3 +- .../network-area/route/describe/describe.go | 9 +- .../route/describe/describe_test.go | 5 +- internal/cmd/network-area/route/list/list.go | 13 +- .../cmd/network-area/route/list/list_test.go | 5 +- internal/cmd/network-area/route/routes.go | 18 +- .../cmd/network-area/route/update/update.go | 11 +- .../network-area/route/update/update_test.go | 5 +- internal/cmd/network-area/update/update.go | 17 +- .../cmd/network-area/update/update_test.go | 5 +- .../cmd/network-interface/create/create.go | 15 +- .../network-interface/create/create_test.go | 5 +- .../cmd/network-interface/delete/delete.go | 11 +- .../network-interface/delete/delete_test.go | 3 +- .../network-interface/describe/describe.go | 9 +- .../describe/describe_test.go | 5 +- internal/cmd/network-interface/list/list.go | 13 +- .../cmd/network-interface/list/list_test.go | 5 +- .../network-interface/network-interface.go | 18 +- .../cmd/network-interface/update/update.go | 11 +- .../network-interface/update/update_test.go | 5 +- internal/cmd/network/create/create.go | 17 +- internal/cmd/network/create/create_test.go | 5 +- internal/cmd/network/delete/delete.go | 15 +- internal/cmd/network/delete/delete_test.go | 3 +- internal/cmd/network/describe/describe.go | 9 +- .../cmd/network/describe/describe_test.go | 5 +- internal/cmd/network/list/list.go | 15 +- internal/cmd/network/list/list_test.go | 5 +- internal/cmd/network/network.go | 18 +- internal/cmd/network/update/update.go | 15 +- internal/cmd/network/update/update_test.go | 3 +- internal/cmd/object-storage/bucket/bucket.go | 16 +- .../object-storage/bucket/create/create.go | 13 +- .../bucket/create/create_test.go | 5 +- .../object-storage/bucket/delete/delete.go | 13 +- .../bucket/delete/delete_test.go | 3 +- .../bucket/describe/describe.go | 9 +- .../bucket/describe/describe_test.go | 5 +- .../cmd/object-storage/bucket/list/list.go | 15 +- .../object-storage/bucket/list/list_test.go | 3 +- .../credentials-group/create/create.go | 11 +- .../credentials-group/create/create_test.go | 5 +- .../credentials-group/credentials_group.go | 14 +- .../credentials-group/delete/delete.go | 13 +- .../credentials-group/delete/delete_test.go | 3 +- .../credentials-group/list/list.go | 11 +- .../credentials-group/list/list_test.go | 5 +- .../credentials/create/create.go | 13 +- .../credentials/create/create_test.go | 5 +- .../object-storage/credentials/credentials.go | 14 +- .../credentials/delete/delete.go | 15 +- .../credentials/delete/delete_test.go | 3 +- .../object-storage/credentials/list/list.go | 13 +- .../credentials/list/list_test.go | 5 +- .../cmd/object-storage/disable/disable.go | 15 +- internal/cmd/object-storage/enable/enable.go | 15 +- internal/cmd/object-storage/object_storage.go | 18 +- .../credentials/create/create.go | 13 +- .../credentials/create/create_test.go | 3 +- .../observability/credentials/credentials.go | 14 +- .../credentials/delete/delete.go | 13 +- .../observability/credentials/list/list.go | 13 +- .../credentials/list/list_test.go | 3 +- .../grafana/describe/describe.go | 9 +- .../grafana/describe/describe_test.go | 5 +- internal/cmd/observability/grafana/grafana.go | 14 +- .../public-read-access/disable/disable.go | 11 +- .../disable/disable_test.go | 3 +- .../public-read-access/enable/enable.go | 11 +- .../public-read-access/enable/enable_test.go | 3 +- .../public-read-access/public_read_access.go | 12 +- .../grafana/single-sign-on/disable/disable.go | 11 +- .../single-sign-on/disable/disable_test.go | 3 +- .../grafana/single-sign-on/enable/enable.go | 11 +- .../single-sign-on/enable/enable_test.go | 3 +- .../grafana/single-sign-on/single_sign_on.go | 12 +- .../observability/instance/create/create.go | 17 +- .../instance/create/create_test.go | 5 +- .../observability/instance/delete/delete.go | 15 +- .../instance/delete/delete_test.go | 3 +- .../instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- .../cmd/observability/instance/instance.go | 18 +- .../cmd/observability/instance/list/list.go | 15 +- .../observability/instance/list/list_test.go | 3 +- .../observability/instance/update/update.go | 15 +- .../instance/update/update_test.go | 3 +- internal/cmd/observability/observability.go | 18 +- internal/cmd/observability/plans/plans.go | 15 +- .../cmd/observability/plans/plans_test.go | 3 +- .../scrape-config/create/create.go | 15 +- .../scrape-config/delete/delete.go | 15 +- .../scrape-config/describe/describe.go | 9 +- .../scrape-config/describe/describe_test.go | 3 +- .../generate-payload/generate_payload.go | 11 +- .../generate-payload/generate_payload_test.go | 5 +- .../observability/scrape-config/list/list.go | 13 +- .../scrape-config/list/list_test.go | 3 +- .../scrape-config/scrape_config.go | 20 +- .../scrape-config/update/update.go | 11 +- .../opensearch/credentials/create/create.go | 13 +- .../credentials/create/create_test.go | 5 +- .../cmd/opensearch/credentials/credentials.go | 16 +- .../opensearch/credentials/delete/delete.go | 15 +- .../credentials/delete/delete_test.go | 3 +- .../credentials/describe/describe.go | 9 +- .../credentials/describe/describe_test.go | 5 +- .../cmd/opensearch/credentials/list/list.go | 13 +- .../opensearch/credentials/list/list_test.go | 5 +- .../cmd/opensearch/instance/create/create.go | 17 +- .../opensearch/instance/create/create_test.go | 5 +- .../cmd/opensearch/instance/delete/delete.go | 15 +- .../opensearch/instance/delete/delete_test.go | 3 +- .../opensearch/instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/opensearch/instance/instance.go | 18 +- internal/cmd/opensearch/instance/list/list.go | 15 +- .../cmd/opensearch/instance/list/list_test.go | 3 +- .../cmd/opensearch/instance/update/update.go | 15 +- .../opensearch/instance/update/update_test.go | 3 +- internal/cmd/opensearch/opensearch.go | 14 +- internal/cmd/opensearch/plans/plans.go | 15 +- internal/cmd/opensearch/plans/plans_test.go | 3 +- internal/cmd/organization/member/add/add.go | 11 +- .../cmd/organization/member/add/add_test.go | 3 +- internal/cmd/organization/member/list/list.go | 11 +- .../cmd/organization/member/list/list_test.go | 3 +- internal/cmd/organization/member/member.go | 14 +- .../cmd/organization/member/remove/remove.go | 11 +- .../organization/member/remove/remove_test.go | 3 +- internal/cmd/organization/organization.go | 12 +- internal/cmd/organization/role/list/list.go | 11 +- .../cmd/organization/role/list/list_test.go | 3 +- internal/cmd/organization/role/role.go | 10 +- internal/cmd/params/cmd_params.go | 10 + internal/cmd/postgresflex/backup/backup.go | 14 +- .../postgresflex/backup/describe/describe.go | 9 +- .../backup/describe/describe_test.go | 3 +- internal/cmd/postgresflex/backup/list/list.go | 11 +- .../cmd/postgresflex/backup/list/list_test.go | 3 +- .../backup/update-schedule/update_schedule.go | 11 +- .../cmd/postgresflex/instance/clone/clone.go | 15 +- .../postgresflex/instance/clone/clone_test.go | 5 +- .../postgresflex/instance/create/create.go | 17 +- .../instance/create/create_test.go | 5 +- .../postgresflex/instance/delete/delete.go | 17 +- .../instance/delete/delete_test.go | 3 +- .../instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- .../cmd/postgresflex/instance/instance.go | 20 +- .../cmd/postgresflex/instance/list/list.go | 15 +- .../postgresflex/instance/list/list_test.go | 3 +- .../postgresflex/instance/update/update.go | 15 +- .../instance/update/update_test.go | 5 +- internal/cmd/postgresflex/options/options.go | 10 +- .../cmd/postgresflex/options/options_test.go | 7 +- internal/cmd/postgresflex/postgresflex.go | 16 +- .../cmd/postgresflex/user/create/create.go | 13 +- .../postgresflex/user/create/create_test.go | 3 +- .../cmd/postgresflex/user/delete/delete.go | 15 +- .../postgresflex/user/delete/delete_test.go | 3 +- .../postgresflex/user/describe/describe.go | 9 +- .../user/describe/describe_test.go | 5 +- internal/cmd/postgresflex/user/list/list.go | 13 +- .../cmd/postgresflex/user/list/list_test.go | 3 +- .../user/reset-password/reset_password.go | 15 +- .../reset-password/reset_password_test.go | 5 +- .../cmd/postgresflex/user/update/update.go | 15 +- .../postgresflex/user/update/update_test.go | 3 +- internal/cmd/postgresflex/user/user.go | 20 +- internal/cmd/project/create/create.go | 11 +- internal/cmd/project/create/create_test.go | 5 +- internal/cmd/project/delete/delete.go | 17 +- internal/cmd/project/describe/describe.go | 9 +- .../cmd/project/describe/describe_test.go | 5 +- internal/cmd/project/list/list.go | 11 +- internal/cmd/project/list/list_test.go | 5 +- internal/cmd/project/member/add/add.go | 15 +- internal/cmd/project/member/add/add_test.go | 3 +- internal/cmd/project/member/list/list.go | 15 +- internal/cmd/project/member/list/list_test.go | 3 +- internal/cmd/project/member/member.go | 14 +- internal/cmd/project/member/remove/remove.go | 15 +- .../cmd/project/member/remove/remove_test.go | 3 +- internal/cmd/project/project.go | 22 +-- internal/cmd/project/role/list/list.go | 15 +- internal/cmd/project/role/list/list_test.go | 3 +- internal/cmd/project/role/role.go | 10 +- internal/cmd/project/update/update.go | 15 +- internal/cmd/project/update/update_test.go | 3 +- internal/cmd/public-ip/associate/associate.go | 13 +- .../cmd/public-ip/associate/associate_test.go | 3 +- internal/cmd/public-ip/create/create.go | 15 +- internal/cmd/public-ip/create/create_test.go | 5 +- internal/cmd/public-ip/delete/delete.go | 13 +- internal/cmd/public-ip/delete/delete_test.go | 3 +- internal/cmd/public-ip/describe/describe.go | 9 +- .../cmd/public-ip/describe/describe_test.go | 5 +- .../public-ip/disassociate/disassociate.go | 13 +- .../disassociate/disassociate_test.go | 3 +- internal/cmd/public-ip/list/list.go | 15 +- internal/cmd/public-ip/list/list_test.go | 5 +- internal/cmd/public-ip/public-ip.go | 22 +-- internal/cmd/public-ip/update/update.go | 13 +- internal/cmd/public-ip/update/update_test.go | 3 +- internal/cmd/quota/list/list.go | 15 +- internal/cmd/quota/list/list_test.go | 5 +- internal/cmd/quota/quota.go | 10 +- .../cmd/rabbitmq/credentials/create/create.go | 13 +- .../credentials/create/create_test.go | 5 +- .../cmd/rabbitmq/credentials/credentials.go | 16 +- .../cmd/rabbitmq/credentials/delete/delete.go | 15 +- .../credentials/delete/delete_test.go | 3 +- .../rabbitmq/credentials/describe/describe.go | 9 +- .../credentials/describe/describe_test.go | 5 +- .../cmd/rabbitmq/credentials/list/list.go | 13 +- .../rabbitmq/credentials/list/list_test.go | 5 +- .../cmd/rabbitmq/instance/create/create.go | 17 +- .../rabbitmq/instance/create/create_test.go | 5 +- .../cmd/rabbitmq/instance/delete/delete.go | 15 +- .../rabbitmq/instance/delete/delete_test.go | 3 +- .../rabbitmq/instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/rabbitmq/instance/instance.go | 18 +- internal/cmd/rabbitmq/instance/list/list.go | 15 +- .../cmd/rabbitmq/instance/list/list_test.go | 3 +- .../cmd/rabbitmq/instance/update/update.go | 15 +- .../rabbitmq/instance/update/update_test.go | 3 +- internal/cmd/rabbitmq/plans/plans.go | 15 +- internal/cmd/rabbitmq/plans/plans_test.go | 3 +- internal/cmd/rabbitmq/rabbitmq.go | 14 +- .../cmd/redis/credentials/create/create.go | 13 +- .../redis/credentials/create/create_test.go | 5 +- internal/cmd/redis/credentials/credentials.go | 16 +- .../cmd/redis/credentials/delete/delete.go | 15 +- .../redis/credentials/delete/delete_test.go | 3 +- .../redis/credentials/describe/describe.go | 9 +- .../credentials/describe/describe_test.go | 5 +- internal/cmd/redis/credentials/list/list.go | 13 +- .../cmd/redis/credentials/list/list_test.go | 5 +- internal/cmd/redis/instance/create/create.go | 17 +- .../cmd/redis/instance/create/create_test.go | 5 +- internal/cmd/redis/instance/delete/delete.go | 15 +- .../cmd/redis/instance/delete/delete_test.go | 3 +- .../cmd/redis/instance/describe/describe.go | 9 +- .../redis/instance/describe/describe_test.go | 5 +- internal/cmd/redis/instance/instance.go | 18 +- internal/cmd/redis/instance/list/list.go | 15 +- internal/cmd/redis/instance/list/list_test.go | 3 +- internal/cmd/redis/instance/update/update.go | 15 +- .../cmd/redis/instance/update/update_test.go | 3 +- internal/cmd/redis/plans/plans.go | 15 +- internal/cmd/redis/plans/plans_test.go | 3 +- internal/cmd/redis/redis.go | 14 +- internal/cmd/root.go | 71 +++---- .../secrets-manager/instance/create/create.go | 15 +- .../instance/create/create_test.go | 5 +- .../secrets-manager/instance/delete/delete.go | 13 +- .../instance/delete/delete_test.go | 3 +- .../instance/describe/describe.go | 9 +- .../instance/describe/describe_test.go | 5 +- .../cmd/secrets-manager/instance/instance.go | 18 +- .../cmd/secrets-manager/instance/list/list.go | 15 +- .../instance/list/list_test.go | 3 +- .../secrets-manager/instance/update/update.go | 13 +- .../instance/update/update_test.go | 3 +- .../cmd/secrets-manager/secrets_manager.go | 12 +- .../cmd/secrets-manager/user/create/create.go | 13 +- .../user/create/create_test.go | 3 +- .../cmd/secrets-manager/user/delete/delete.go | 15 +- .../user/delete/delete_test.go | 3 +- .../secrets-manager/user/describe/describe.go | 9 +- .../user/describe/describe_test.go | 5 +- .../cmd/secrets-manager/user/list/list.go | 13 +- .../secrets-manager/user/list/list_test.go | 3 +- .../cmd/secrets-manager/user/update/update.go | 15 +- .../user/update/update_test.go | 3 +- internal/cmd/secrets-manager/user/user.go | 18 +- internal/cmd/security-group/create/create.go | 11 +- .../cmd/security-group/create/create_test.go | 5 +- internal/cmd/security-group/delete/delete.go | 17 +- .../cmd/security-group/delete/delete_test.go | 3 +- .../cmd/security-group/describe/describe.go | 9 +- .../security-group/describe/describe_test.go | 5 +- internal/cmd/security-group/list/list.go | 15 +- internal/cmd/security-group/list/list_test.go | 5 +- .../cmd/security-group/rule/create/create.go | 17 +- .../security-group/rule/create/create_test.go | 5 +- .../cmd/security-group/rule/delete/delete.go | 15 +- .../security-group/rule/delete/delete_test.go | 3 +- .../security-group/rule/describe/describe.go | 9 +- .../rule/describe/describe_test.go | 5 +- internal/cmd/security-group/rule/list/list.go | 17 +- .../cmd/security-group/rule/list/list_test.go | 5 +- .../rule/security_group_rule.go | 16 +- internal/cmd/security-group/security_group.go | 20 +- internal/cmd/security-group/update/update.go | 17 +- .../cmd/security-group/update/update_test.go | 3 +- internal/cmd/server/backup/backup.go | 26 +-- internal/cmd/server/backup/create/create.go | 15 +- .../cmd/server/backup/create/create_test.go | 5 +- internal/cmd/server/backup/delete/delete.go | 11 +- .../cmd/server/backup/delete/delete_test.go | 3 +- .../cmd/server/backup/describe/describe.go | 9 +- .../server/backup/describe/describe_test.go | 5 +- internal/cmd/server/backup/disable/disable.go | 17 +- internal/cmd/server/backup/enable/enable.go | 15 +- internal/cmd/server/backup/list/list.go | 15 +- internal/cmd/server/backup/list/list_test.go | 5 +- internal/cmd/server/backup/restore/restore.go | 11 +- .../cmd/server/backup/restore/restore_test.go | 3 +- .../server/backup/schedule/create/create.go | 15 +- .../backup/schedule/create/create_test.go | 5 +- .../server/backup/schedule/delete/delete.go | 15 +- .../backup/schedule/delete/delete_test.go | 3 +- .../backup/schedule/describe/describe.go | 9 +- .../backup/schedule/describe/describe_test.go | 5 +- .../cmd/server/backup/schedule/list/list.go | 15 +- .../server/backup/schedule/list/list_test.go | 5 +- .../cmd/server/backup/schedule/schedule.go | 18 +- .../server/backup/schedule/update/update.go | 13 +- .../backup/schedule/update/update_test.go | 5 +- .../backup/volume-backup/delete/delete.go | 11 +- .../volume-backup/delete/delete_test.go | 3 +- .../backup/volume-backup/restore/restore.go | 11 +- .../volume-backup/restore/restore_test.go | 3 +- .../backup/volume-backup/volumebackup.go | 12 +- internal/cmd/server/command/command.go | 16 +- internal/cmd/server/command/create/create.go | 15 +- .../cmd/server/command/create/create_test.go | 5 +- .../cmd/server/command/describe/describe.go | 9 +- .../server/command/describe/describe_test.go | 5 +- internal/cmd/server/command/list/list.go | 15 +- internal/cmd/server/command/list/list_test.go | 5 +- .../command/template/describe/describe.go | 9 +- .../template/describe/describe_test.go | 5 +- .../cmd/server/command/template/list/list.go | 11 +- .../server/command/template/list/list_test.go | 5 +- .../cmd/server/command/template/template.go | 12 +- internal/cmd/server/console/console.go | 11 +- internal/cmd/server/console/console_test.go | 5 +- internal/cmd/server/create/create.go | 17 +- internal/cmd/server/create/create_test.go | 5 +- internal/cmd/server/deallocate/deallocate.go | 15 +- .../cmd/server/deallocate/deallocate_test.go | 3 +- internal/cmd/server/delete/delete.go | 15 +- internal/cmd/server/delete/delete_test.go | 3 +- internal/cmd/server/describe/describe.go | 9 +- internal/cmd/server/describe/describe_test.go | 5 +- internal/cmd/server/list/list.go | 15 +- internal/cmd/server/list/list_test.go | 5 +- internal/cmd/server/log/log.go | 13 +- internal/cmd/server/log/log_test.go | 5 +- .../server/machine-type/describe/describe.go | 9 +- .../machine-type/describe/describe_test.go | 5 +- internal/cmd/server/machine-type/list/list.go | 15 +- .../cmd/server/machine-type/list/list_test.go | 5 +- .../cmd/server/machine-type/machine-type.go | 12 +- .../server/network-interface/attach/attach.go | 19 +- .../network-interface/attach/attach_test.go | 3 +- .../server/network-interface/detach/detach.go | 19 +- .../network-interface/detach/detach_test.go | 3 +- .../cmd/server/network-interface/list/list.go | 13 +- .../network-interface/list/list_test.go | 5 +- .../network-interface/network-interface.go | 14 +- .../cmd/server/os-update/create/create.go | 15 +- .../server/os-update/create/create_test.go | 5 +- .../cmd/server/os-update/describe/describe.go | 9 +- .../os-update/describe/describe_test.go | 5 +- .../cmd/server/os-update/disable/disable.go | 15 +- .../cmd/server/os-update/enable/enable.go | 15 +- internal/cmd/server/os-update/list/list.go | 15 +- .../cmd/server/os-update/list/list_test.go | 5 +- internal/cmd/server/os-update/os-update.go | 20 +- .../os-update/schedule/create/create.go | 15 +- .../os-update/schedule/create/create_test.go | 5 +- .../os-update/schedule/delete/delete.go | 11 +- .../os-update/schedule/delete/delete_test.go | 3 +- .../os-update/schedule/describe/describe.go | 9 +- .../schedule/describe/describe_test.go | 5 +- .../server/os-update/schedule/list/list.go | 15 +- .../os-update/schedule/list/list_test.go | 5 +- .../cmd/server/os-update/schedule/schedule.go | 18 +- .../os-update/schedule/update/update.go | 13 +- .../os-update/schedule/update/update_test.go | 5 +- .../cmd/server/public-ip/attach/attach.go | 15 +- .../server/public-ip/attach/attach_test.go | 3 +- .../cmd/server/public-ip/detach/detach.go | 15 +- .../server/public-ip/detach/detach_test.go | 3 +- internal/cmd/server/public-ip/public_ip.go | 12 +- internal/cmd/server/reboot/reboot.go | 13 +- internal/cmd/server/reboot/reboot_test.go | 3 +- internal/cmd/server/rescue/rescue.go | 15 +- internal/cmd/server/rescue/rescue_test.go | 3 +- internal/cmd/server/resize/resize.go | 15 +- internal/cmd/server/resize/resize_test.go | 3 +- internal/cmd/server/server.go | 52 ++--- .../server/service-account/attach/attach.go | 13 +- .../service-account/attach/attach_test.go | 5 +- .../server/service-account/detach/detach.go | 13 +- .../service-account/detach/detach_test.go | 5 +- .../cmd/server/service-account/list/list.go | 13 +- .../server/service-account/list/list_test.go | 5 +- .../server/service-account/service-account.go | 14 +- internal/cmd/server/start/start.go | 13 +- internal/cmd/server/start/start_test.go | 3 +- internal/cmd/server/stop/stop.go | 15 +- internal/cmd/server/stop/stop_test.go | 3 +- internal/cmd/server/unrescue/unrescue.go | 15 +- internal/cmd/server/unrescue/unrescue_test.go | 3 +- internal/cmd/server/update/update.go | 13 +- internal/cmd/server/update/update_test.go | 5 +- internal/cmd/server/volume/attach/attach.go | 15 +- .../cmd/server/volume/attach/attach_test.go | 5 +- .../cmd/server/volume/describe/describe.go | 13 +- .../server/volume/describe/describe_test.go | 5 +- internal/cmd/server/volume/detach/detach.go | 15 +- .../cmd/server/volume/detach/detach_test.go | 3 +- internal/cmd/server/volume/list/list.go | 15 +- internal/cmd/server/volume/list/list_test.go | 5 +- internal/cmd/server/volume/update/update.go | 15 +- .../cmd/server/volume/update/update_test.go | 5 +- internal/cmd/server/volume/volume.go | 18 +- internal/cmd/service-account/create/create.go | 15 +- .../cmd/service-account/create/create_test.go | 5 +- internal/cmd/service-account/delete/delete.go | 11 +- .../cmd/service-account/delete/delete_test.go | 3 +- .../cmd/service-account/get-jwks/get_jwks.go | 11 +- .../service-account/get-jwks/get_jwks_test.go | 5 +- .../cmd/service-account/key/create/create.go | 13 +- .../service-account/key/create/create_test.go | 3 +- .../cmd/service-account/key/delete/delete.go | 11 +- .../service-account/key/delete/delete_test.go | 3 +- .../service-account/key/describe/describe.go | 9 +- .../key/describe/describe_test.go | 5 +- internal/cmd/service-account/key/key.go | 18 +- internal/cmd/service-account/key/list/list.go | 11 +- .../cmd/service-account/key/list/list_test.go | 3 +- .../cmd/service-account/key/update/update.go | 11 +- .../service-account/key/update/update_test.go | 3 +- internal/cmd/service-account/list/list.go | 15 +- .../cmd/service-account/list/list_test.go | 3 +- .../cmd/service-account/service_account.go | 20 +- .../service-account/token/create/create.go | 11 +- .../token/create/create_test.go | 5 +- .../cmd/service-account/token/list/list.go | 11 +- .../service-account/token/list/list_test.go | 3 +- .../service-account/token/revoke/revoke.go | 11 +- .../token/revoke/revoke_test.go | 3 +- internal/cmd/service-account/token/token.go | 14 +- internal/cmd/ske/cluster/cluster.go | 20 +- internal/cmd/ske/cluster/create/create.go | 19 +- .../cmd/ske/cluster/create/create_test.go | 5 +- internal/cmd/ske/cluster/delete/delete.go | 13 +- .../cmd/ske/cluster/delete/delete_test.go | 3 +- internal/cmd/ske/cluster/describe/describe.go | 9 +- .../cmd/ske/cluster/describe/describe_test.go | 5 +- .../generate-payload/generate_payload.go | 9 +- .../generate-payload/generate_payload_test.go | 5 +- internal/cmd/ske/cluster/list/list.go | 17 +- internal/cmd/ske/cluster/list/list_test.go | 3 +- internal/cmd/ske/cluster/update/update.go | 13 +- .../cmd/ske/cluster/update/update_test.go | 5 +- .../complete-rotation/complete_rotation.go | 15 +- .../complete_rotation_test.go | 3 +- internal/cmd/ske/credentials/credentials.go | 12 +- .../start-rotation/start_rotation.go | 15 +- .../start-rotation/start_rotation_test.go | 3 +- internal/cmd/ske/describe/describe.go | 9 +- internal/cmd/ske/describe/describe_test.go | 3 +- internal/cmd/ske/disable/disable.go | 17 +- internal/cmd/ske/enable/enable.go | 17 +- internal/cmd/ske/kubeconfig/create/create.go | 13 +- .../cmd/ske/kubeconfig/create/create_test.go | 5 +- internal/cmd/ske/kubeconfig/kubeconfig.go | 12 +- internal/cmd/ske/kubeconfig/login/login.go | 17 +- internal/cmd/ske/options/options.go | 9 +- internal/cmd/ske/options/options_test.go | 7 +- internal/cmd/ske/ske.go | 22 +-- internal/cmd/volume/create/create.go | 17 +- internal/cmd/volume/create/create_test.go | 5 +- internal/cmd/volume/delete/delete.go | 15 +- internal/cmd/volume/delete/delete_test.go | 3 +- internal/cmd/volume/describe/describe.go | 9 +- internal/cmd/volume/describe/describe_test.go | 5 +- internal/cmd/volume/list/list.go | 15 +- internal/cmd/volume/list/list_test.go | 5 +- .../performance-class/describe/describe.go | 9 +- .../describe/describe_test.go | 5 +- .../cmd/volume/performance-class/list/list.go | 15 +- .../performance-class/list/list_test.go | 5 +- .../performance-class/performance_class.go | 12 +- internal/cmd/volume/resize/resize.go | 13 +- internal/cmd/volume/resize/resize_test.go | 3 +- internal/cmd/volume/update/update.go | 13 +- internal/cmd/volume/update/update_test.go | 5 +- internal/cmd/volume/volume.go | 22 +-- 793 files changed, 4407 insertions(+), 3681 deletions(-) create mode 100644 .github/docs/contribution-guide/client.go create mode 100644 .github/docs/contribution-guide/cmd.go create mode 100644 internal/cmd/params/cmd_params.go diff --git a/.github/docs/contribution-guide/client.go b/.github/docs/contribution-guide/client.go new file mode 100644 index 000000000..4b84a6538 --- /dev/null +++ b/.github/docs/contribution-guide/client.go @@ -0,0 +1,35 @@ +package client + +import ( + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-sdk-go/services/foo" + // (...) +) + +func ConfigureClient(cmd *cobra.Command) (*foo.APIClient, error) { + var err error + var apiClient foo.APIClient + var cfgOptions []sdkConfig.ConfigurationOption + + authCfgOption, err := auth.AuthenticationConfig(cmd, auth.AuthorizeUser) + if err != nil { + return nil, &errors.AuthError{} + } + cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion("eu01")) // Configuring region is needed if "foo" is a regional API + + customEndpoint := viper.GetString(config.fooCustomEndpointKey) + + if customEndpoint != "" { + cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) + } + + apiClient, err = foo.NewAPIClient(cfgOptions...) + if err != nil { + return nil, &errors.AuthError{} + } + + return apiClient, nil +} diff --git a/.github/docs/contribution-guide/cmd.go b/.github/docs/contribution-guide/cmd.go new file mode 100644 index 000000000..5fb05d2f4 --- /dev/null +++ b/.github/docs/contribution-guide/cmd.go @@ -0,0 +1,156 @@ +package bar + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "gopkg.in/yaml.v2" + // (...) +) + +// Define consts for command flags +const ( + someArg = "MY_ARG" + someFlag = "my-flag" +) + +// Struct to model user input (arguments and/or flags) +type inputModel struct { + *globalflags.GlobalFlagModel + MyArg string + MyFlag *string +} + +// "bar" command constructor +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "bar", + Short: "Short description of the command (is shown in the help of parent command)", + Long: "Long description of the command. Can contain some more information about the command usage. It is shown in the help of the current command.", + Args: args.SingleArg(someArg, utils.ValidateUUID), // Validate argument, with an optional validation function + Example: examples.Build( + examples.NewExample( + `Do something with command "bar"`, + "$ stackit foo bar arg-value --my-flag flag-value"), + //... + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, cmd) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("(...): %w", err) + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + if err != nil { + projectLabel = model.ProjectId + } + + // Check API response "resp" and output accordingly + if resp.Item == nil { + params.Printer.Info("(...)", projectLabel) + return nil + } + return outputResult(params.Printer, cmd, model.OutputFormat, instances) + }, + } + + configureFlags(cmd) + return cmd +} + +// Configure command flags (type, default value, and description) +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(myFlag, "defaultValue", "My flag description") +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + myArg := inputArgs[0] + + globalFlags := globalflags.Parse(cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + MyArg: myArg, + MyFlag: flags.FlagToStringPointer(cmd, myFlag), + } + + // Write the input model to the debug logs + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +// Build request to the API +func buildRequest(ctx context.Context, model *inputModel, apiClient *foo.APIClient) foo.ApiListInstancesRequest { + req := apiClient.GetBar(ctx, model.ProjectId, model.MyArg, someParam) + return req +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, cmd *cobra.Command, outputFormat string, resources []foo.Resource) error { + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resources, "", " ") + if err != nil { + return fmt.Errorf("marshal resource list: %w", err) + } + p.Outputln(string(details)) + return nil + case print.YAMLOutputFormat: + details, err := yaml.Marshal(resources) + if err != nil { + return fmt.Errorf("marshal resource list: %w", err) + } + p.Outputln(string(details)) + return nil + default: + table := tables.NewTable() + table.SetHeader("ID", "NAME", "STATE") + for i := range resources { + resource := resources[i] + table.AddRow(*resource.ResourceId, *resource.Name, *resource.State) + } + err := table.Display(cmd) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + } +} diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index a73808087..d182c6534 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -53,148 +53,7 @@ Please remember to run `make generate-docs` after your changes to keep the comma Below is a typical structure of a CLI command: -```go -package bar - -import ( - (...) -) - -// Define consts for command flags -const ( - someArg = "MY_ARG" - someFlag = "my-flag" -) - -// Struct to model user input (arguments and/or flags) -type inputModel struct { - *globalflags.GlobalFlagModel - MyArg string - MyFlag *string -} - -// "bar" command constructor -func NewCmd(p *print.Printer) *cobra.Command { - cmd := &cobra.Command{ - Use: "bar", - Short: "Short description of the command (is shown in the help of parent command)", - Long: "Long description of the command. Can contain some more information about the command usage. It is shown in the help of the current command.", - Args: args.SingleArg(someArg, utils.ValidateUUID), // Validate argument, with an optional validation function - Example: examples.Build( - examples.NewExample( - `Do something with command "bar"`, - "$ stackit foo bar arg-value --my-flag flag-value"), - ... - ), - RunE: func(cmd *cobra.Command, args []string) error { - ctx := context.Background() - model, err := parseInput(p, cmd, args) - if err != nil { - return err - } - - // Configure API client - apiClient, err := client.ConfigureClient(p, cmd) - if err != nil { - return err - } - - // Call API - req := buildRequest(ctx, model, apiClient) - resp, err := req.Execute() - if err != nil { - return fmt.Errorf("(...): %w", err) - } - - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) - if err != nil { - projectLabel = model.ProjectId - } - - // Check API response "resp" and output accordingly - if resp.Item == nil { - p.Info("(...)", projectLabel) - return nil - } - return outputResult(p, cmd, model.OutputFormat, instances) - }, - } - - configureFlags(cmd) - return cmd -} - -// Configure command flags (type, default value, and description) -func configureFlags(cmd *cobra.Command) { - cmd.Flags().StringP(myFlag, "defaultValue", "My flag description") -} - -// Parse user input (arguments and/or flags) -func parseInput(cmd *cobra.Command, inputArgs []string) (*inputModel, error) { - myArg := inputArgs[0] - - globalFlags := globalflags.Parse(cmd) - if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} - } - - model := inputModel{ - GlobalFlagModel: globalFlags, - MyArg myArg, - MyFlag: flags.FlagToStringPointer(cmd, myFlag), - }, nil - - // Write the input model to the debug logs - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - - return &model, nil -} - -// Build request to the API -func buildRequest(ctx context.Context, model *inputModel, apiClient *foo.APIClient) foo.ApiListInstancesRequest { - req := apiClient.GetBar(ctx, model.ProjectId, model.MyArg, someParam) - return req -} - -// Output result based on the configured output format -func outputResult(p *print.Printer, cmd *cobra.Command, outputFormat string, resources []foo.Resource) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resources, "", " ") - if err != nil { - return fmt.Errorf("marshal resource list: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.Marshal(resources) - if err != nil { - return fmt.Errorf("marshal resource list: %w", err) - } - p.Outputln(string(details)) - return nil - default: - table := tables.NewTable() - table.SetHeader("ID", "NAME", "STATE") - for i := range resources { - resource := resources[i] - table.AddRow(*resource.ResourceId, *resource.Name, *resource.State) - } - err := table.Display(cmd) - if err != nil { - return fmt.Errorf("render table: %w", err) - } - return nil - } -} -``` +https://github.com/stackitcloud/stackit-cli/blob/6f762bd56407ed232080efabc4d2bf87f260b71d/.github/docs/contribution-guide/cmd.go#L23-L156 Please remember to always add unit tests for `parseInput`, `buildRequest` (in `bar_test.go`), and any other util functions used. @@ -224,39 +83,7 @@ If you want to add a command that uses a STACKIT service `foo` that was not yet 1. This is done in `internal/pkg/services/foo/client/client.go` 2. Below is an example of a typical `client.go` file structure: - ```go - package client - - import ( - (...) - "github.com/stackitcloud/stackit-sdk-go/services/foo" - ) - - func ConfigureClient(cmd *cobra.Command) (*foo.APIClient, error) { - var err error - var apiClient foo.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - - authCfgOption, err := auth.AuthenticationConfig(cmd, auth.AuthorizeUser) - if err != nil { - return nil, &errors.AuthError{} - } - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion("eu01")) // Configuring region is needed if "foo" is a regional API - - customEndpoint := viper.GetString(config.fooCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - apiClient, err = foo.NewAPIClient(cfgOptions...) - if err != nil { - return nil, &errors.AuthError{} - } - - return apiClient, nil - } - ``` +https://github.com/stackitcloud/stackit-cli/blob/6f762bd56407ed232080efabc4d2bf87f260b71d/.github/docs/contribution-guide/client.go#L12-L35 ### Local development diff --git a/internal/cmd/affinity-groups/affinity-groups.go b/internal/cmd/affinity-groups/affinity-groups.go index 57f44f65e..a750b2047 100644 --- a/internal/cmd/affinity-groups/affinity-groups.go +++ b/internal/cmd/affinity-groups/affinity-groups.go @@ -6,12 +6,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "affinity-group", Short: "Manage server affinity groups", @@ -19,15 +19,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand( - create.NewCmd(p), - delete.NewCmd(p), - describe.NewCmd(p), - list.NewCmd(p), + create.NewCmd(params), + delete.NewCmd(params), + describe.NewCmd(params), + list.NewCmd(params), ) } diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index ab1f48d3a..fc8482ea8 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Policy string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an affinity groups", @@ -43,20 +44,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create the affinity group %q?", model.Name) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create affinity group: %w", err) } if resp := result; resp != nil { - return outputResult(p, *model, *resp) + return outputResult(params.Printer, *model, *resp) } return fmt.Errorf("create affinity group: nil result") }, diff --git a/internal/cmd/affinity-groups/create/create_test.go b/internal/cmd/affinity-groups/create/create_test.go index 3ab7db59f..0f71d31db 100644 --- a/internal/cmd/affinity-groups/create/create_test.go +++ b/internal/cmd/affinity-groups/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -120,7 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Fatalf("configure global flags: %v", err) } @@ -212,7 +213,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.response) diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index 195b4539d..f36371648 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ const ( affinityGroupIdArg = "AFFINITY_GROUP" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", affinityGroupIdArg), Short: "Deletes an affinity group", @@ -40,32 +41,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } affinityGroupLabel, err := iaasUtils.GetAffinityGroupName(ctx, apiClient, model.ProjectId, model.AffinityGroupId) if err != nil { - p.Debug(print.ErrorLevel, "get affinity group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get affinity group name: %v", err) affinityGroupLabel = model.AffinityGroupId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete affinity group %q?", affinityGroupLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("delete affinity group: %w", err) } - p.Info("Deleted affinity group %q for %q\n", affinityGroupLabel, projectLabel) + params.Printer.Info("Deleted affinity group %q for %q\n", affinityGroupLabel, projectLabel) return nil }, diff --git a/internal/cmd/affinity-groups/delete/delete_test.go b/internal/cmd/affinity-groups/delete/delete_test.go index 71f2b84a7..e3df49cbb 100644 --- a/internal/cmd/affinity-groups/delete/delete_test.go +++ b/internal/cmd/affinity-groups/delete/delete_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -97,7 +98,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 410937fb1..566e42d5e 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ const ( affinityGroupId = "AFFINITY_GROUP_ID" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", affinityGroupId), Short: "Show details of an affinity group", @@ -41,13 +42,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -59,7 +60,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get affinity group: %w", err) } - if err := outputResult(p, *model, *result); err != nil { + if err := outputResult(params.Printer, *model, *result); err != nil { return err } return nil diff --git a/internal/cmd/affinity-groups/describe/describe_test.go b/internal/cmd/affinity-groups/describe/describe_test.go index 1d8a1f23b..530319c96 100644 --- a/internal/cmd/affinity-groups/describe/describe_test.go +++ b/internal/cmd/affinity-groups/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -98,7 +99,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -191,7 +192,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 3c270bcdb..cb06a6612 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -27,7 +28,7 @@ type inputModel struct { const limitFlag = "limit" -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists affinity groups", @@ -45,13 +46,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,10 +68,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(*items) > int(*model.Limit) { *items = (*items)[:*model.Limit] } - return outputResult(p, *model, *items) + return outputResult(params.Printer, *model, *items) } - p.Outputln("No affinity groups found") + params.Printer.Outputln("No affinity groups found") return nil }, } diff --git a/internal/cmd/affinity-groups/list/list_test.go b/internal/cmd/affinity-groups/list/list_test.go index da35b5778..b44af626c 100644 --- a/internal/cmd/affinity-groups/list/list_test.go +++ b/internal/cmd/affinity-groups/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -105,7 +106,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Fatalf("configure global flags: %v", err) } @@ -186,7 +187,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.response) diff --git a/internal/cmd/auth/activate-service-account/activate_service_account.go b/internal/cmd/auth/activate-service-account/activate_service_account.go index 46922720a..5ddc73f29 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -32,7 +33,7 @@ type inputModel struct { OnlyPrintAccessToken bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "activate-service-account", Short: "Authenticates using a service account", @@ -58,7 +59,7 @@ func NewCmd(p *print.Printer) *cobra.Command { ), ), RunE: func(cmd *cobra.Command, _ []string) error { - model := parseInput(p, cmd) + model := parseInput(params.Printer, cmd) tokenCustomEndpoint := viper.GetString(config.TokenCustomEndpointKey) if !model.OnlyPrintAccessToken { @@ -78,12 +79,12 @@ func NewCmd(p *print.Printer) *cobra.Command { // Initializes the authentication flow rt, err := sdkAuth.SetupAuth(cfg) if err != nil { - p.Debug(print.ErrorLevel, "setup auth: %v", err) + params.Printer.Debug(print.ErrorLevel, "setup auth: %v", err) return &cliErr.ActivateServiceAccountError{} } // Authenticates the service account and stores credentials - email, accessToken, err := auth.AuthenticateServiceAccount(p, rt, model.OnlyPrintAccessToken) + email, accessToken, err := auth.AuthenticateServiceAccount(params.Printer, rt, model.OnlyPrintAccessToken) if err != nil { var activateServiceAccountError *cliErr.ActivateServiceAccountError if !errors.As(err, &activateServiceAccountError) { @@ -94,9 +95,9 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.OnlyPrintAccessToken { // Only output is the access token - p.Outputf("%s\n", accessToken) + params.Printer.Outputf("%s\n", accessToken) } else { - p.Outputf("You have been successfully authenticated to the STACKIT CLI!\nService account email: %s\n", email) + params.Printer.Outputf("You have been successfully authenticated to the STACKIT CLI!\nService account email: %s\n", email) } return nil }, diff --git a/internal/cmd/auth/activate-service-account/activate_service_account_test.go b/internal/cmd/auth/activate-service-account/activate_service_account_test.go index 9dcbb22b7..84532195c 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account_test.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -106,7 +107,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/auth/auth.go b/internal/cmd/auth/auth.go index 2a8b3a7f2..7e1c020cf 100644 --- a/internal/cmd/auth/auth.go +++ b/internal/cmd/auth/auth.go @@ -5,14 +5,14 @@ import ( getaccesstoken "github.com/stackitcloud/stackit-cli/internal/cmd/auth/get-access-token" "github.com/stackitcloud/stackit-cli/internal/cmd/auth/login" "github.com/stackitcloud/stackit-cli/internal/cmd/auth/logout" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "auth", Short: "Authenticates the STACKIT CLI", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(login.NewCmd(p)) - cmd.AddCommand(logout.NewCmd(p)) - cmd.AddCommand(activateserviceaccount.NewCmd(p)) - cmd.AddCommand(getaccesstoken.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(login.NewCmd(params)) + cmd.AddCommand(logout.NewCmd(params)) + cmd.AddCommand(activateserviceaccount.NewCmd(params)) + cmd.AddCommand(getaccesstoken.NewCmd(params)) } diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 85fc9247c..0b13fd2fa 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -2,14 +2,14 @@ package getaccesstoken import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "get-access-token", Short: "Prints a short-lived access token.", @@ -42,7 +42,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return &cliErr.AccessTokenExpiredError{} } - p.Outputf("%s\n", accessToken) + params.Printer.Outputf("%s\n", accessToken) return nil }, } diff --git a/internal/cmd/auth/login/login.go b/internal/cmd/auth/login/login.go index 06531f706..8740fead7 100644 --- a/internal/cmd/auth/login/login.go +++ b/internal/cmd/auth/login/login.go @@ -3,15 +3,15 @@ package login import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "login", Short: "Logs in to the STACKIT CLI", @@ -25,12 +25,12 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit auth login"), ), RunE: func(_ *cobra.Command, _ []string) error { - err := auth.AuthorizeUser(p, false) + err := auth.AuthorizeUser(params.Printer, false) if err != nil { return fmt.Errorf("authorization failed: %w", err) } - p.Outputln("Successfully logged into STACKIT CLI.\n") + params.Printer.Outputln("Successfully logged into STACKIT CLI.\n") return nil }, diff --git a/internal/cmd/auth/logout/logout.go b/internal/cmd/auth/logout/logout.go index adc6f7069..4b318b2e7 100644 --- a/internal/cmd/auth/logout/logout.go +++ b/internal/cmd/auth/logout/logout.go @@ -3,15 +3,15 @@ package logout import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "logout", Short: "Logs the user account out of the STACKIT CLI", @@ -28,7 +28,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("log out failed: %w", err) } - p.Info("Successfully logged out of the STACKIT CLI.\n") + params.Printer.Info("Successfully logged out of the STACKIT CLI.\n") return nil }, } diff --git a/internal/cmd/beta/alb/alb.go b/internal/cmd/beta/alb/alb.go index 94f082da8..fde1da311 100644 --- a/internal/cmd/beta/alb/alb.go +++ b/internal/cmd/beta/alb/alb.go @@ -11,15 +11,15 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/quotas" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/template" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "alb", Short: "Manages application loadbalancers", @@ -27,21 +27,21 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand( - list.NewCmd(p), - template.NewCmd(p), - create.NewCmd(p), - update.NewCmd(p), - observabilitycredentials.NewCmd(p), - describe.NewCmd(p), - delete.NewCmd(p), - pool.NewCmd(p), - plans.NewCmd(p), - quotas.NewCmd(p), + list.NewCmd(params), + template.NewCmd(params), + create.NewCmd(params), + update.NewCmd(params), + observabilitycredentials.NewCmd(params), + describe.NewCmd(params), + delete.NewCmd(params), + pool.NewCmd(params), + plans.NewCmd(params), + quotas.NewCmd(params), ) } diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index 462d4e381..4d5abe3c1 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Configuration *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an application loadbalancer", @@ -47,26 +48,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create an application loadbalancer for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating loadbalancer") _, err = wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Name).WaitWithContext(ctx) if err != nil { @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(params.Printer, model, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/create/create_test.go b/internal/cmd/beta/alb/create/create_test.go index d77fb2022..82517b0f5 100644 --- a/internal/cmd/beta/alb/create/create_test.go +++ b/internal/cmd/beta/alb/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -134,7 +135,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -248,7 +249,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/delete/delete.go b/internal/cmd/beta/alb/delete/delete.go index c3709e8a9..0c443d593 100644 --- a/internal/cmd/beta/alb/delete/delete.go +++ b/internal/cmd/beta/alb/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -24,7 +25,7 @@ type inputModel struct { Name string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", loadbalancerNameArg), Short: "Deletes an application loadbalancer", @@ -38,26 +39,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete the application loadbalancer %q for project %q?", model.Name, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete loadbalancer: %w", err) } - p.Outputf("Load balancer %q deleted.", model.Name) + params.Printer.Outputf("Load balancer %q deleted.", model.Name) return nil }, } diff --git a/internal/cmd/beta/alb/delete/delete_test.go b/internal/cmd/beta/alb/delete/delete_test.go index 3bc65bfd1..ce6808fbd 100644 --- a/internal/cmd/beta/alb/delete/delete_test.go +++ b/internal/cmd/beta/alb/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -112,7 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/alb/describe/describe.go b/internal/cmd/beta/alb/describe/describe.go index 8a1403585..db4418ddf 100644 --- a/internal/cmd/beta/alb/describe/describe.go +++ b/internal/cmd/beta/alb/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -29,7 +30,7 @@ type inputModel struct { Name string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", loadbalancerNameArg), Short: "Describes an application loadbalancer", @@ -43,13 +44,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -62,9 +63,9 @@ func NewCmd(p *print.Printer) *cobra.Command { } if loadbalancer := resp; loadbalancer != nil { - return outputResult(p, model.OutputFormat, loadbalancer) + return outputResult(params.Printer, model.OutputFormat, loadbalancer) } - p.Outputln("No load balancer found.") + params.Printer.Outputln("No load balancer found.") return nil }, } diff --git a/internal/cmd/beta/alb/describe/describe_test.go b/internal/cmd/beta/alb/describe/describe_test.go index 0f621c72e..4d1195313 100644 --- a/internal/cmd/beta/alb/describe/describe_test.go +++ b/internal/cmd/beta/alb/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -112,7 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -213,7 +214,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index 4050e8791..cf1d478c5 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ const ( limitFlag = "limit" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists albs", @@ -48,20 +49,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -76,12 +77,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if items := response.LoadBalancers; items == nil || len(*items) == 0 { - p.Info("No load balancers found for project %q", projectLabel) + params.Printer.Info("No load balancers found for project %q", projectLabel) } else { if model.Limit != nil && len(*items) > int(*model.Limit) { *items = (*items)[:*model.Limit] } - if err := outputResult(p, model.OutputFormat, *items); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, *items); err != nil { return fmt.Errorf("output loadbalancers: %w", err) } } diff --git a/internal/cmd/beta/alb/list/list_test.go b/internal/cmd/beta/alb/list/list_test.go index 77c915266..547787166 100644 --- a/internal/cmd/beta/alb/list/list_test.go +++ b/internal/cmd/beta/alb/list/list_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -99,7 +100,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -196,7 +197,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index 806af5e13..e0eff7449 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -30,7 +31,7 @@ type inputModel struct { Password *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "add", Short: "Adds observability credentials to an application load balancer", @@ -44,20 +45,20 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := "Are your sure you want to add credentials?" - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("add credential: %w", err) } - return outputResult(p, model.GlobalFlagModel.OutputFormat, resp) + return outputResult(params.Printer, model.GlobalFlagModel.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/observability-credentials/add/add_test.go b/internal/cmd/beta/alb/observability-credentials/add/add_test.go index a84b1405b..b5fa2bac6 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add_test.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -101,7 +102,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -202,7 +203,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.item); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete.go b/internal/cmd/beta/alb/observability-credentials/delete/delete.go index e71a6fee4..df9f462f0 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -23,7 +24,7 @@ type inputModel struct { CredentialsRef string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialRefArg), Short: "Deletes credentials", @@ -37,20 +38,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %q?", model.CredentialsRef) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete credential: %w", err) } - p.Info("Deleted credential %q\n", model.CredentialsRef) + params.Printer.Info("Deleted credential %q\n", model.CredentialsRef) return nil }, diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go b/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go index 6f5ff0dd8..09ecaa532 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/alb" @@ -112,7 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe.go b/internal/cmd/beta/alb/observability-credentials/describe/describe.go index 091d08ef2..4081421ca 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -28,7 +29,7 @@ type inputModel struct { CredentialRef string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialRefArg), Short: "Describes observability credentials for the Application Load Balancer", @@ -42,13 +43,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -61,9 +62,9 @@ func NewCmd(p *print.Printer) *cobra.Command { } if credential := resp; credential != nil && credential.Credential != nil { - return outputResult(p, model.OutputFormat, *credential.Credential) + return outputResult(params.Printer, model.OutputFormat, *credential.Credential) } - p.Outputln("No credentials found.") + params.Printer.Outputln("No credentials found.") return nil }, } diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go b/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go index 1d4f201a5..79412281b 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -112,7 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -213,7 +214,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index d08a9026e..bbbdd6db4 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Credentials == nil || len(*resp.Credentials) == 0 { - p.Info("No credentials found\n") + params.Printer.Info("No credentials found\n") return nil } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/observability-credentials/list/list_test.go b/internal/cmd/beta/alb/observability-credentials/list/list_test.go index f3c305298..77863ded8 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list_test.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -120,7 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -216,7 +217,7 @@ func Test_outputResult(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/cmd/beta/alb/observability-credentials/observability-credentials.go b/internal/cmd/beta/alb/observability-credentials/observability-credentials.go index 04dee2407..3d18486ee 100644 --- a/internal/cmd/beta/alb/observability-credentials/observability-credentials.go +++ b/internal/cmd/beta/alb/observability-credentials/observability-credentials.go @@ -8,11 +8,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/update" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "observability-credentials", Short: "Provides functionality for application loadbalancer credentials", @@ -20,14 +20,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: cobra.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(add.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(add.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/beta/alb/observability-credentials/update/update.go b/internal/cmd/beta/alb/observability-credentials/update/update.go index 03a9fe8ad..3231f0d95 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -34,7 +35,7 @@ type inputModel struct { CredentialsRef *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", credentialRefArg), Short: "Update credentials", @@ -47,10 +48,10 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model := parseInput(p, cmd, args) + model := parseInput(params.Printer, cmd, args) // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -59,14 +60,14 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update credential %q for %q?", *model.CredentialsRef, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return fmt.Errorf("update credential: %w", err) } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("response is nil") } - return outputResult(p, model, resp) + return outputResult(params.Printer, model, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/observability-credentials/update/update_test.go b/internal/cmd/beta/alb/observability-credentials/update/update_test.go index bdfab0080..4d3780ba1 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update_test.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -216,7 +217,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.item); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index 13719baac..f7d09bec6 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,7 +24,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists the application load balancer plans", @@ -37,20 +38,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -65,9 +66,9 @@ func NewCmd(p *print.Printer) *cobra.Command { } if items := response.ValidPlans; items == nil || len(*items) == 0 { - p.Info("No plans found for project %q", projectLabel) + params.Printer.Info("No plans found for project %q", projectLabel) } else { - if err := outputResult(p, model.OutputFormat, *items); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, *items); err != nil { return fmt.Errorf("output plans: %w", err) } } diff --git a/internal/cmd/beta/alb/plans/plans_test.go b/internal/cmd/beta/alb/plans/plans_test.go index 3184f5696..bfbda8586 100644 --- a/internal/cmd/beta/alb/plans/plans_test.go +++ b/internal/cmd/beta/alb/plans/plans_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -95,7 +96,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -192,7 +193,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/pool/pool.go b/internal/cmd/beta/alb/pool/pool.go index 5d8d5fd41..d40f8733a 100644 --- a/internal/cmd/beta/alb/pool/pool.go +++ b/internal/cmd/beta/alb/pool/pool.go @@ -2,15 +2,15 @@ package pool import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/pool/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "pool", Short: "Manages target pools for application loadbalancers", @@ -18,10 +18,10 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index e8b2aa2fa..94bdd2872 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { AlbName *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates an application target pool", @@ -47,26 +48,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update an application target pool for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update application target pool: %w", err) } - return outputResult(p, model, projectLabel, resp) + return outputResult(params.Printer, model, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/pool/update/update_test.go b/internal/cmd/beta/alb/pool/update/update_test.go index b9b9ec080..f279c1f01 100644 --- a/internal/cmd/beta/alb/pool/update/update_test.go +++ b/internal/cmd/beta/alb/pool/update/update_test.go @@ -10,6 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -257,7 +258,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index 07bc2eb21..09735a914 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,7 +23,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "quotas", Short: "Shows the application load balancer quotas", @@ -36,13 +37,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -56,11 +57,11 @@ func NewCmd(p *print.Printer) *cobra.Command { } if response == nil { - p.Outputln("no quotas found") + params.Printer.Outputln("no quotas found") return nil } - if err := outputResult(p, model.OutputFormat, *response); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, *response); err != nil { return fmt.Errorf("output loadbalancers: %w", err) } diff --git a/internal/cmd/beta/alb/quotas/quotas_test.go b/internal/cmd/beta/alb/quotas/quotas_test.go index b840d9ef0..1ff2aaacd 100644 --- a/internal/cmd/beta/alb/quotas/quotas_test.go +++ b/internal/cmd/beta/alb/quotas/quotas_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -95,7 +96,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -192,7 +193,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/template/template.go b/internal/cmd/beta/alb/template/template.go index 18d0cd427..c33ca2846 100644 --- a/internal/cmd/beta/alb/template/template.go +++ b/internal/cmd/beta/alb/template/template.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ var ( templatePool string ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "template", Short: "creates configuration templates to use for resource creation", @@ -53,7 +54,7 @@ func NewCmd(p *print.Printer) *cobra.Command { ), ), RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } @@ -73,7 +74,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } if model.Format == nil || *model.Format == "yaml" { - p.Outputln(template) + params.Printer.Outputln(template) } else if *model.Format == "json" { if err := yaml.Unmarshal([]byte(template), &target); err != nil { return fmt.Errorf("cannot unmarshal template: %w", err) diff --git a/internal/cmd/beta/alb/template/template_test.go b/internal/cmd/beta/alb/template/template_test.go index 3ca5404e8..be7bed72d 100644 --- a/internal/cmd/beta/alb/template/template_test.go +++ b/internal/cmd/beta/alb/template/template_test.go @@ -3,6 +3,7 @@ package template import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 546f89990..10e0b9bc5 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Version *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates an application loadbalancer", @@ -48,26 +49,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update an application loadbalancer for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("updating loadbalancer") _, err = wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Name). WaitWithContext(ctx) @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(params.Printer, model, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/update/update_test.go b/internal/cmd/beta/alb/update/update_test.go index 176a130a3..5749b8b86 100644 --- a/internal/cmd/beta/alb/update/update_test.go +++ b/internal/cmd/beta/alb/update/update_test.go @@ -10,6 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -251,7 +252,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index 37b5e4bd9..5a007b87e 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -5,15 +5,15 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "beta", Short: "Contains beta STACKIT CLI commands", @@ -31,11 +31,11 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit beta MY_COMMAND"), ), } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(sqlserverflex.NewCmd(p)) - cmd.AddCommand(alb.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(sqlserverflex.NewCmd(params)) + cmd.AddCommand(alb.NewCmd(params)) } diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index fe137c435..ac7e345a8 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Owner string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", databaseNameArg), Short: "Creates a SQLServer Flex database", @@ -49,20 +50,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create database %q? (This cannot be undone)", model.DatabaseName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Call API req := buildRequest(ctx, model, apiClient) - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating database") resp, err := req.Execute() if err != nil { @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } s.Stop() - return outputResult(p, model.OutputFormat, model.DatabaseName, resp) + return outputResult(params.Printer, model.OutputFormat, model.DatabaseName, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/sqlserverflex/database/create/create_test.go b/internal/cmd/beta/sqlserverflex/database/create/create_test.go index ada824cb6..c6359313e 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" @@ -177,7 +178,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -281,7 +282,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.databaseName, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/database/database.go b/internal/cmd/beta/sqlserverflex/database/database.go index 3fbd641ce..f11cf2bd0 100644 --- a/internal/cmd/beta/sqlserverflex/database/database.go +++ b/internal/cmd/beta/sqlserverflex/database/database.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "database", Short: "Provides functionality for SQLServer Flex databases", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index d47633cf3..b1950aa86 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", databaseNameArg), Short: "Deletes a SQLServer Flex database", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete database %q? (This cannot be undone)", model.DatabaseName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Call API req := buildRequest(ctx, model, apiClient) - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting database") err = req.Execute() if err != nil { @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } s.Stop() - p.Info("Deleted database %q\n", model.DatabaseName) + params.Printer.Info("Deleted database %q\n", model.DatabaseName) return nil }, } diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go index 315341040..53a099f48 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" @@ -160,7 +161,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index ed2caecf7..3ddbfa086 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", databaseNameArg), Short: "Shows details of an SQLServer Flex database", @@ -47,12 +48,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read SQLServer Flex database: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go index b55faf4a2..919b1e3c5 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" @@ -159,7 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -269,7 +270,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index 6d660f8a1..ba22c593e 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SQLServer Flex databases", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,12 +69,12 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get SQLServer Flex databases: %w", err) } if resp.Databases == nil || len(*resp.Databases) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No databases found for instance %s on project %s\n", model.InstanceId, projectLabel) + params.Printer.Info("No databases found for instance %s on project %s\n", model.InstanceId, projectLabel) return nil } databases := *resp.Databases @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { databases = databases[:*model.Limit] } - return outputResult(p, model.OutputFormat, databases) + return outputResult(params.Printer, model.OutputFormat, databases) }, } diff --git a/internal/cmd/beta/sqlserverflex/database/list/list_test.go b/internal/cmd/beta/sqlserverflex/database/list/list_test.go index 1b10b22a8..0aa4979f7 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -235,7 +236,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.databases); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 904b2f6f8..9003de50b 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -65,7 +66,7 @@ type inputModel struct { RetentionDays *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a SQLServer Flex instance", @@ -86,26 +87,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a SQLServer Flex instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -124,7 +125,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) if err != nil { @@ -133,7 +134,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(params.Printer, model, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go index eaf4a5463..851d3d1fd 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -251,7 +252,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -524,7 +525,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index c0456b08d..2b5723c50 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a SQLServer Flex instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go index 753379175..ae971f31d 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -139,7 +140,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go index c5d8e68e1..7dec66a7d 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a SQLServer Flex instance", @@ -45,12 +46,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -62,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read SQLServer Flex instance: %w", err) } - return outputResult(p, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp.Item) }, } return cmd diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go index 29edcede2..7412418c6 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/instance.go b/internal/cmd/beta/sqlserverflex/instance/instance.go index a74e41085..4ed452eb1 100644 --- a/internal/cmd/beta/sqlserverflex/instance/instance.go +++ b/internal/cmd/beta/sqlserverflex/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for SQLServer Flex instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 18666a7d5..3f9abdb22 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SQLServer Flex instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,12 +67,12 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get SQLServer Flex instances: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } instances := *resp.Items @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go index 094774724..be4b5debe 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -211,7 +212,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index 39c5989dc..53921ea75 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -60,7 +61,7 @@ type inputModel struct { Version *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a SQLServer Flex instance", @@ -77,26 +78,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -115,7 +116,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) if err != nil { @@ -124,7 +125,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, instanceLabel, resp) + return outputResult(params.Printer, model, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go index 4c9c92dd5..5db0655ba 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -281,7 +282,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -520,7 +521,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index a4b815a44..d66f082c9 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -87,7 +88,7 @@ type instanceDBCompatibilities struct { DBCompatibilities []sqlserverflex.MssqlDatabaseCompatibility `json:"dbCompatibilities"` } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists SQL Server Flex options", @@ -109,19 +110,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } // Call API - err = buildAndExecuteRequest(ctx, p, model, apiClient) + err = buildAndExecuteRequest(ctx, params.Printer, model, apiClient) if err != nil { return fmt.Errorf("get SQL Server Flex options: %w", err) } diff --git a/internal/cmd/beta/sqlserverflex/options/options_test.go b/internal/cmd/beta/sqlserverflex/options/options_test.go index 5e76ad539..1f527d85e 100644 --- a/internal/cmd/beta/sqlserverflex/options/options_test.go +++ b/internal/cmd/beta/sqlserverflex/options/options_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -263,7 +264,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -472,7 +473,7 @@ func TestBuildAndExecuteRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) p.Cmd = cmd client := &sqlServerFlexClientMocked{ listFlavorsFails: tt.listFlavorsFails, @@ -544,7 +545,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.flavors, tt.args.versions, tt.args.storages, tt.args.userRoles, tt.args.dbCollations, tt.args.dbCompatibilities); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/sqlserverflex.go b/internal/cmd/beta/sqlserverflex/sqlserverflex.go index a65ca22e8..51c93beb8 100644 --- a/internal/cmd/beta/sqlserverflex/sqlserverflex.go +++ b/internal/cmd/beta/sqlserverflex/sqlserverflex.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/options" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "sqlserverflex", Short: "Provides functionality for SQLServer Flex", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(database.NewCmd(p)) - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(options.NewCmd(p)) - cmd.AddCommand(user.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(database.NewCmd(params)) + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(options.NewCmd(params)) + cmd.AddCommand(user.NewCmd(params)) } diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 0cd99180c..501746b1e 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a SQLServer Flex user", @@ -58,26 +59,26 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } user := resp.Item - return outputResult(p, model, instanceLabel, user) + return outputResult(params.Printer, model, instanceLabel, user) }, } diff --git a/internal/cmd/beta/sqlserverflex/user/create/create_test.go b/internal/cmd/beta/sqlserverflex/user/create/create_test.go index a53878b3d..4c294d6d9 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -247,7 +248,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete.go b/internal/cmd/beta/sqlserverflex/user/delete/delete.go index b85272ba3..dea859e97 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a SQLServer Flex user", @@ -46,32 +47,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := sqlserverflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete SQLServer Flex user: %w", err) } - p.Info("Deleted user %q of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Deleted user %q of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go index 79053edf7..c4345ba6a 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -154,7 +155,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe.go b/internal/cmd/beta/sqlserverflex/user/describe/describe.go index e9822bdd0..7ccba07f1 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a SQLServer Flex user", @@ -54,13 +55,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get SQLServer Flex user: %w", err) } - return outputResult(p, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp.Item) }, } diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go index c0d6be049..8f44c6db7 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" @@ -153,7 +154,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -256,7 +257,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index c4fcd2152..29e2c803c 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SQLServer Flex users of an instance", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,10 +72,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } - p.Info("No users found for instance %q\n", instanceLabel) + params.Printer.Info("No users found for instance %q\n", instanceLabel) return nil } users := *resp.Items @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { users = users[:*model.Limit] } - return outputResult(p, model.OutputFormat, users) + return outputResult(params.Printer, model.OutputFormat, users) }, } diff --git a/internal/cmd/beta/sqlserverflex/user/list/list_test.go b/internal/cmd/beta/sqlserverflex/user/list/list_test.go index cc3dabc34..7ec60722f 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -228,7 +229,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.users); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index 182a9e147..ff560a2cf 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reset-password %s", userIdArg), Short: "Resets the password of a SQLServer Flex user", @@ -49,32 +50,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := sqlserverflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("reset SQLServer Flex user password: %w", err) } - return outputResult(p, model.OutputFormat, userLabel, instanceLabel, user.Item) + return outputResult(params.Printer, model.OutputFormat, userLabel, instanceLabel, user.Item) }, } diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go index 8eda0631f..eeeb230a1 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" @@ -153,7 +154,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -258,7 +259,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.userLabel, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/user.go b/internal/cmd/beta/sqlserverflex/user/user.go index 9426f3bbf..0c83d54e4 100644 --- a/internal/cmd/beta/sqlserverflex/user/user.go +++ b/internal/cmd/beta/sqlserverflex/user/user.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user/list" resetpassword "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user/reset-password" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for SQLServer Flex users", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(resetpassword.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(resetpassword.NewCmd(params)) } diff --git a/internal/cmd/config/config.go b/internal/cmd/config/config.go index a96355a54..46b21b96a 100644 --- a/internal/cmd/config/config.go +++ b/internal/cmd/config/config.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile" "github.com/stackitcloud/stackit-cli/internal/cmd/config/set" "github.com/stackitcloud/stackit-cli/internal/cmd/config/unset" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "config", Short: "Provides functionality for CLI configuration options", @@ -28,13 +28,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(set.NewCmd(p)) - cmd.AddCommand(unset.NewCmd(p)) - cmd.AddCommand(profile.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(set.NewCmd(params)) + cmd.AddCommand(unset.NewCmd(params)) + cmd.AddCommand(profile.NewCmd(params)) } diff --git a/internal/cmd/config/list/list.go b/internal/cmd/config/list/list.go index 7fd7b51ce..6dbc78e7e 100644 --- a/internal/cmd/config/list/list.go +++ b/internal/cmd/config/list/list.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists the current CLI configuration values", @@ -50,14 +51,14 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { configData := viper.AllSettings() - model := parseInput(p, cmd) + model := parseInput(params.Printer, cmd) activeProfile, err := config.GetProfile() if err != nil { return fmt.Errorf("get profile: %w", err) } - return outputResult(p, model.OutputFormat, configData, activeProfile) + return outputResult(params.Printer, model.OutputFormat, configData, activeProfile) }, } return cmd diff --git a/internal/cmd/config/list/list_test.go b/internal/cmd/config/list/list_test.go index d32d5d76a..936e5a76d 100644 --- a/internal/cmd/config/list/list_test.go +++ b/internal/cmd/config/list/list_test.go @@ -3,6 +3,7 @@ package list import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) @@ -24,7 +25,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.configData, tt.args.activeProfile); (err != nil) != tt.wantErr { diff --git a/internal/cmd/config/profile/create/create.go b/internal/cmd/config/profile/create/create.go index ceec4ee04..8ab83f574 100644 --- a/internal/cmd/config/profile/create/create.go +++ b/internal/cmd/config/profile/create/create.go @@ -3,6 +3,7 @@ package create import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -28,7 +29,7 @@ type inputModel struct { Profile string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", profileArg), Short: "Creates a CLI configuration profile", @@ -49,30 +50,30 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config profile create my-profile --empty --no-set"), ), RunE: func(cmd *cobra.Command, args []string) error { - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } - err = config.CreateProfile(p, model.Profile, !model.NoSet, model.FromEmptyProfile) + err = config.CreateProfile(params.Printer, model.Profile, !model.NoSet, model.FromEmptyProfile) if err != nil { return fmt.Errorf("create profile: %w", err) } if model.NoSet { - p.Info("Successfully created profile %q\n", model.Profile) + params.Printer.Info("Successfully created profile %q\n", model.Profile) return nil } - p.Info("Successfully created and set active profile to %q\n", model.Profile) + params.Printer.Info("Successfully created and set active profile to %q\n", model.Profile) flow, err := auth.GetAuthFlow() if err != nil { - p.Debug(print.WarningLevel, "both keyring and text file storage failed to find a valid authentication flow for the active profile") - p.Warn("The active profile %q is not authenticated, please login using the 'stackit auth login' command.\n", model.Profile) + params.Printer.Debug(print.WarningLevel, "both keyring and text file storage failed to find a valid authentication flow for the active profile") + params.Printer.Warn("The active profile %q is not authenticated, please login using the 'stackit auth login' command.\n", model.Profile) return nil } - p.Debug(print.DebugLevel, "found valid authentication flow for active profile: %s", flow) + params.Printer.Debug(print.DebugLevel, "found valid authentication flow for active profile: %s", flow) return nil }, diff --git a/internal/cmd/config/profile/create/create_test.go b/internal/cmd/config/profile/create/create_test.go index 0cc32cc9d..097071947 100644 --- a/internal/cmd/config/profile/create/create_test.go +++ b/internal/cmd/config/profile/create/create_test.go @@ -3,6 +3,7 @@ package create import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -104,7 +105,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/config/profile/delete/delete.go b/internal/cmd/config/profile/delete/delete.go index 992750c29..88d00907f 100644 --- a/internal/cmd/config/profile/delete/delete.go +++ b/internal/cmd/config/profile/delete/delete.go @@ -3,6 +3,7 @@ package delete import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -23,7 +24,7 @@ type inputModel struct { Profile string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", profileArg), Short: "Delete a CLI configuration profile", @@ -38,7 +39,7 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config profile delete my-profile"), ), RunE: func(cmd *cobra.Command, args []string) error { - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -60,18 +61,18 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get profile: %w", err) } if activeProfile == model.Profile { - p.Warn("The profile you are trying to delete is the active profile. The default profile will be set to active.\n") + params.Printer.Warn("The profile you are trying to delete is the active profile. The default profile will be set to active.\n") } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete profile %q? (This cannot be undone)", model.Profile) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } } - err = config.DeleteProfile(p, model.Profile) + err = config.DeleteProfile(params.Printer, model.Profile) if err != nil { return fmt.Errorf("delete profile: %w", err) } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete profile authentication: %w", err) } - p.Info("Successfully deleted profile %q\n", model.Profile) + params.Printer.Info("Successfully deleted profile %q\n", model.Profile) return nil }, diff --git a/internal/cmd/config/profile/delete/delete_test.go b/internal/cmd/config/profile/delete/delete_test.go index 3919460b7..018ded22a 100644 --- a/internal/cmd/config/profile/delete/delete_test.go +++ b/internal/cmd/config/profile/delete/delete_test.go @@ -3,6 +3,7 @@ package delete import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -80,7 +81,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/config/profile/export/export.go b/internal/cmd/config/profile/export/export.go index 9aa585971..59389b47a 100644 --- a/internal/cmd/config/profile/export/export.go +++ b/internal/cmd/config/profile/export/export.go @@ -4,6 +4,7 @@ import ( "fmt" "path/filepath" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { FilePath string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("export %s", profileNameArg), Short: "Exports a CLI configuration profile", @@ -45,17 +46,17 @@ func NewCmd(p *print.Printer) *cobra.Command { ), Args: args.SingleArg(profileNameArg, nil), RunE: func(cmd *cobra.Command, args []string) error { - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } - err = config.ExportProfile(p, model.ProfileName, model.FilePath) + err = config.ExportProfile(params.Printer, model.ProfileName, model.FilePath) if err != nil { return fmt.Errorf("could not export profile: %w", err) } - p.Info("Exported profile %q to %q\n", model.ProfileName, model.FilePath) + params.Printer.Info("Exported profile %q to %q\n", model.ProfileName, model.FilePath) return nil }, diff --git a/internal/cmd/config/profile/export/export_test.go b/internal/cmd/config/profile/export/export_test.go index 4dffd3a22..d15885813 100644 --- a/internal/cmd/config/profile/export/export_test.go +++ b/internal/cmd/config/profile/export/export_test.go @@ -4,6 +4,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -102,7 +103,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/config/profile/import/import.go b/internal/cmd/config/profile/import/import.go index d57cb1929..84bd9b3aa 100644 --- a/internal/cmd/config/profile/import/import.go +++ b/internal/cmd/config/profile/import/import.go @@ -2,6 +2,7 @@ package importProfile import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -24,7 +25,7 @@ type inputModel struct { NoSet bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "import", Short: "Imports a CLI configuration profile", @@ -41,17 +42,17 @@ func NewCmd(p *print.Printer) *cobra.Command { ), Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } - err = config.ImportProfile(p, model.ProfileName, model.Config, !model.NoSet) + err = config.ImportProfile(params.Printer, model.ProfileName, model.Config, !model.NoSet) if err != nil { return err } - p.Info("Successfully imported profile %q\n", model.ProfileName) + params.Printer.Info("Successfully imported profile %q\n", model.ProfileName) return nil }, diff --git a/internal/cmd/config/profile/import/import_test.go b/internal/cmd/config/profile/import/import_test.go index 7e028ab59..121b7adb9 100644 --- a/internal/cmd/config/profile/import/import_test.go +++ b/internal/cmd/config/profile/import/import_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -75,7 +76,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/config/profile/list/list.go b/internal/cmd/config/profile/list/list.go index 10f2e239b..2a43aa417 100644 --- a/internal/cmd/config/profile/list/list.go +++ b/internal/cmd/config/profile/list/list.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -20,7 +21,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all CLI configuration profiles", @@ -35,7 +36,7 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config profile list --output-format json"), ), RunE: func(cmd *cobra.Command, _ []string) error { - model := parseInput(p, cmd) + model := parseInput(params.Printer, cmd) profiles, err := config.ListProfiles() if err != nil { @@ -49,7 +50,7 @@ func NewCmd(p *print.Printer) *cobra.Command { outputProfiles := buildOutput(profiles, activeProfile) - return outputResult(p, model.OutputFormat, outputProfiles) + return outputResult(params.Printer, model.OutputFormat, outputProfiles) }, } return cmd diff --git a/internal/cmd/config/profile/list/list_test.go b/internal/cmd/config/profile/list/list_test.go index 80e080c56..8016b6071 100644 --- a/internal/cmd/config/profile/list/list_test.go +++ b/internal/cmd/config/profile/list/list_test.go @@ -3,6 +3,7 @@ package list import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) @@ -23,7 +24,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.profiles); (err != nil) != tt.wantErr { diff --git a/internal/cmd/config/profile/profile.go b/internal/cmd/config/profile/profile.go index 848a60382..f6ad03ece 100644 --- a/internal/cmd/config/profile/profile.go +++ b/internal/cmd/config/profile/profile.go @@ -10,14 +10,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/list" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/set" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/unset" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "profile", Short: "Manage the CLI configuration profiles", @@ -30,16 +30,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(set.NewCmd(p)) - cmd.AddCommand(unset.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(importProfile.NewCmd(p)) - cmd.AddCommand(export.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(set.NewCmd(params)) + cmd.AddCommand(unset.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(importProfile.NewCmd(params)) + cmd.AddCommand(export.NewCmd(params)) } diff --git a/internal/cmd/config/profile/set/set.go b/internal/cmd/config/profile/set/set.go index ac43977b3..0784d4654 100644 --- a/internal/cmd/config/profile/set/set.go +++ b/internal/cmd/config/profile/set/set.go @@ -3,6 +3,7 @@ package set import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -23,7 +24,7 @@ type inputModel struct { Profile string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("set %s", profileArg), Short: "Set a CLI configuration profile", @@ -40,7 +41,7 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config profile set my-profile"), ), RunE: func(cmd *cobra.Command, args []string) error { - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { return &errors.SetInexistentProfile{Profile: model.Profile} } - err = config.SetProfile(p, model.Profile) + err = config.SetProfile(params.Printer, model.Profile) if err != nil { return fmt.Errorf("set profile: %w", err) } - p.Info("Successfully set active profile to %q\n", model.Profile) + params.Printer.Info("Successfully set active profile to %q\n", model.Profile) flow, err := auth.GetAuthFlow() if err != nil { - p.Debug(print.WarningLevel, "both keyring and text file storage failed to find a valid authentication flow for the active profile") - p.Warn("The active profile %q is not authenticated, please login using the 'stackit auth login' command.\n", model.Profile) + params.Printer.Debug(print.WarningLevel, "both keyring and text file storage failed to find a valid authentication flow for the active profile") + params.Printer.Warn("The active profile %q is not authenticated, please login using the 'stackit auth login' command.\n", model.Profile) return nil } - p.Debug(print.DebugLevel, "found valid authentication flow for active profile: %s", flow) + params.Printer.Debug(print.DebugLevel, "found valid authentication flow for active profile: %s", flow) return nil }, diff --git a/internal/cmd/config/profile/set/set_test.go b/internal/cmd/config/profile/set/set_test.go index 47f56ca0b..a12b0f328 100644 --- a/internal/cmd/config/profile/set/set_test.go +++ b/internal/cmd/config/profile/set/set_test.go @@ -3,6 +3,7 @@ package set import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -80,7 +81,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/config/profile/unset/unset.go b/internal/cmd/config/profile/unset/unset.go index 4c06edb60..9c7f923cd 100644 --- a/internal/cmd/config/profile/unset/unset.go +++ b/internal/cmd/config/profile/unset/unset.go @@ -3,6 +3,7 @@ package unset import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -12,7 +13,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "unset", Short: "Unset the current active CLI configuration profile", @@ -27,20 +28,20 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config profile unset"), ), RunE: func(_ *cobra.Command, _ []string) error { - err := config.UnsetProfile(p) + err := config.UnsetProfile(params.Printer) if err != nil { return fmt.Errorf("unset profile: %w", err) } - p.Info("Profile unset successfully. The default profile will be used.\n") + params.Printer.Info("Profile unset successfully. The default profile will be used.\n") flow, err := auth.GetAuthFlow() if err != nil { - p.Debug(print.WarningLevel, "both keyring and text file storage failed to find a valid authentication flow for the active profile") - p.Warn("The default profile is not authenticated, please login using the 'stackit auth login' command.\n") + params.Printer.Debug(print.WarningLevel, "both keyring and text file storage failed to find a valid authentication flow for the active profile") + params.Printer.Warn("The default profile is not authenticated, please login using the 'stackit auth login' command.\n") return nil } - p.Debug(print.DebugLevel, "found valid authentication flow for active profile: %s", flow) + params.Printer.Debug(print.DebugLevel, "found valid authentication flow for active profile: %s", flow) return nil }, diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index b8defa692..54f9f527d 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -53,7 +54,7 @@ type inputModel struct { ProjectIdSet bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "set", Short: "Sets CLI configuration options", @@ -76,13 +77,13 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config set --dns-custom-endpoint https://dns.stackit.cloud"), ), RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } if model.SessionTimeLimit != nil { - p.Warn("Authenticate again to apply changes to session time limit\n") + params.Printer.Warn("Authenticate again to apply changes to session time limit\n") viper.Set(config.SessionTimeLimitKey, *model.SessionTimeLimit) } diff --git a/internal/cmd/config/set/set_test.go b/internal/cmd/config/set/set_test.go index 9b317b5ad..e9647e268 100644 --- a/internal/cmd/config/set/set_test.go +++ b/internal/cmd/config/set/set_test.go @@ -3,6 +3,7 @@ package set import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -122,7 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index 72d79aeb3..a288be6a3 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -3,6 +3,7 @@ package unset import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -88,7 +89,7 @@ type inputModel struct { TokenCustomEndpoint bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "unset", Short: "Unsets CLI configuration options", @@ -106,7 +107,7 @@ func NewCmd(p *print.Printer) *cobra.Command { "$ stackit config unset --dns-custom-endpoint"), ), RunE: func(cmd *cobra.Command, _ []string) error { - model := parseInput(p, cmd) + model := parseInput(params.Printer, cmd) if model.Async { viper.Set(config.AsyncKey, config.AsyncDefault) diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index bc262c002..a977f8aa2 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -4,6 +4,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/google/go-cmp/cmp" @@ -291,7 +292,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) for flag, value := range tt.flagValues { stringBool := fmt.Sprintf("%v", value) diff --git a/internal/cmd/curl/curl.go b/internal/cmd/curl/curl.go index 9959e50f1..15b79627a 100644 --- a/internal/cmd/curl/curl.go +++ b/internal/cmd/curl/curl.go @@ -11,6 +11,7 @@ import ( "strings" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -45,7 +46,7 @@ type inputModel struct { OutputFile *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("curl %s", urlArg), Short: "Executes an authenticated HTTP request to an endpoint", @@ -70,12 +71,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), Args: args.SingleArg(urlArg, utils.ValidateURLDomain), RunE: func(cmd *cobra.Command, args []string) (err error) { - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } - bearerToken, err := getBearerToken(p) + bearerToken, err := getBearerToken(params.Printer) if err != nil { return err } @@ -99,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } }() - err = outputResponse(p, model, resp) + err = outputResponse(params.Printer, model, resp) if err != nil { return err } diff --git a/internal/cmd/curl/curl_test.go b/internal/cmd/curl/curl_test.go index c7b4dcf4b..3fbab3cf4 100644 --- a/internal/cmd/curl/curl_test.go +++ b/internal/cmd/curl/curl_test.go @@ -13,6 +13,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -216,7 +217,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -447,7 +448,7 @@ func TestOutputResponse(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResponse(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/dns.go b/internal/cmd/dns/dns.go index a89e959c5..ccba3b66d 100644 --- a/internal/cmd/dns/dns.go +++ b/internal/cmd/dns/dns.go @@ -3,14 +3,14 @@ package dns import ( recordset "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "dns", Short: "Provides functionality for DNS", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(zone.NewCmd(p)) - cmd.AddCommand(recordset.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(zone.NewCmd(params)) + cmd.AddCommand(recordset.NewCmd(params)) } diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 65ea58911..8441db8ac 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -43,7 +44,7 @@ type inputModel struct { Type string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a DNS record set", @@ -56,26 +57,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a record set for zone %s?", zoneLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating record set") _, err = wait.CreateRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, recordSetId).WaitWithContext(ctx) if err != nil { @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, zoneLabel, resp) + return outputResult(params.Printer, model, zoneLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/dns/record-set/create/create_test.go b/internal/cmd/dns/record-set/create/create_test.go index eed9f9424..99a216aeb 100644 --- a/internal/cmd/dns/record-set/create/create_test.go +++ b/internal/cmd/dns/record-set/create/create_test.go @@ -9,6 +9,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -267,7 +268,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -395,7 +396,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.zoneLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/record-set/delete/delete.go b/internal/cmd/dns/record-set/delete/delete.go index 4bb3a1c88..a4026478f 100644 --- a/internal/cmd/dns/record-set/delete/delete.go +++ b/internal/cmd/dns/record-set/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { RecordSetId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", recordSetIdArg), Short: "Deletes a DNS record set", @@ -45,32 +46,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } recordSetLabel, err := dnsUtils.GetRecordSetName(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId) if err != nil { - p.Debug(print.ErrorLevel, "get record set name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get record set name: %v", err) recordSetLabel = model.RecordSetId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete record set %s of zone %s? (This cannot be undone)", recordSetLabel, zoneLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting record set") _, err = wait.DeleteRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId).WaitWithContext(ctx) if err != nil { @@ -101,7 +102,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s record set %s of zone %s\n", operationState, recordSetLabel, zoneLabel) + params.Printer.Info("%s record set %s of zone %s\n", operationState, recordSetLabel, zoneLabel) return nil }, } diff --git a/internal/cmd/dns/record-set/delete/delete_test.go b/internal/cmd/dns/record-set/delete/delete_test.go index 137c85267..55b534fde 100644 --- a/internal/cmd/dns/record-set/delete/delete_test.go +++ b/internal/cmd/dns/record-set/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/dns/record-set/describe/describe.go b/internal/cmd/dns/record-set/describe/describe.go index 03a757a7a..8f80674b8 100644 --- a/internal/cmd/dns/record-set/describe/describe.go +++ b/internal/cmd/dns/record-set/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { RecordSetId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", recordSetIdArg), Short: "Shows details of a DNS record set", @@ -49,13 +50,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,7 +69,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } recordSet := resp.Rrset - return outputResult(p, model.OutputFormat, recordSet) + return outputResult(params.Printer, model.OutputFormat, recordSet) }, } configureFlags(cmd) diff --git a/internal/cmd/dns/record-set/describe/describe_test.go b/internal/cmd/dns/record-set/describe/describe_test.go index a2cbc48e7..55a032bd8 100644 --- a/internal/cmd/dns/record-set/describe/describe_test.go +++ b/internal/cmd/dns/record-set/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/dns" @@ -164,7 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -269,7 +270,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.recordSet); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index 2062a7c84..99a07bb5a 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -9,6 +9,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -50,7 +51,7 @@ type inputModel struct { PageSize int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists DNS record sets", @@ -75,13 +76,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -94,13 +95,13 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(recordSets) == 0 { zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } - p.Info("No record sets found for zone %s matching the criteria\n", zoneLabel) + params.Printer.Info("No record sets found for zone %s matching the criteria\n", zoneLabel) return nil } - return outputResult(p, model.OutputFormat, recordSets) + return outputResult(params.Printer, model.OutputFormat, recordSets) }, } diff --git a/internal/cmd/dns/record-set/list/list_test.go b/internal/cmd/dns/record-set/list/list_test.go index d41e1f304..122a2b29d 100644 --- a/internal/cmd/dns/record-set/list/list_test.go +++ b/internal/cmd/dns/record-set/list/list_test.go @@ -11,6 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -214,7 +215,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -518,7 +519,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.recordSets); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/record-set/record_set.go b/internal/cmd/dns/record-set/record_set.go index 698750f4b..d00152da0 100644 --- a/internal/cmd/dns/record-set/record_set.go +++ b/internal/cmd/dns/record-set/record_set.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set/list" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "record-set", Short: "Provides functionality for DNS record set", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/dns/record-set/update/update.go b/internal/cmd/dns/record-set/update/update.go index 2b3d258aa..6d2a7ea06 100644 --- a/internal/cmd/dns/record-set/update/update.go +++ b/internal/cmd/dns/record-set/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -42,7 +43,7 @@ type inputModel struct { Type *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", recordSetIdArg), Short: "Updates a DNS record set", @@ -55,32 +56,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } recordSetLabel, err := dnsUtils.GetRecordSetName(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId) if err != nil { - p.Debug(print.ErrorLevel, "get record set name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get record set name: %v", err) recordSetLabel = model.RecordSetId } typeLabel, err := dnsUtils.GetRecordSetType(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId) if err != nil { - p.Debug(print.ErrorLevel, "get record set type: %v", err) + params.Printer.Debug(print.ErrorLevel, "get record set type: %v", err) } model.Type = typeLabel @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update record set %s of zone %s?", recordSetLabel, zoneLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -108,7 +109,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating record set") _, err = wait.PartialUpdateRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId).WaitWithContext(ctx) if err != nil { @@ -121,7 +122,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s record set %s of zone %s\n", operationState, recordSetLabel, zoneLabel) + params.Printer.Info("%s record set %s of zone %s\n", operationState, recordSetLabel, zoneLabel) return nil }, } diff --git a/internal/cmd/dns/record-set/update/update_test.go b/internal/cmd/dns/record-set/update/update_test.go index 9b07ffabb..99e32d0f9 100644 --- a/internal/cmd/dns/record-set/update/update_test.go +++ b/internal/cmd/dns/record-set/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -253,7 +254,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index a7a4e42a0..1894b2291 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { ZoneId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("clone %s", zoneIdArg), Short: "Clones a DNS zone", @@ -58,26 +59,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to clone the zone %q?", zoneLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Cloning zone") _, err = wait.CreateZoneWaitHandler(ctx, apiClient, model.ProjectId, zoneId).WaitWithContext(ctx) if err != nil { @@ -102,7 +103,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, zoneLabel, resp) + return outputResult(params.Printer, model, zoneLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/dns/zone/clone/clone_test.go b/internal/cmd/dns/zone/clone/clone_test.go index ea4f0621b..01f738f3a 100644 --- a/internal/cmd/dns/zone/clone/clone_test.go +++ b/internal/cmd/dns/zone/clone/clone_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -169,7 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -291,7 +292,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index fadfbd183..d23d35f39 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { ContactEmail *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a DNS zone", @@ -71,26 +72,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a zone for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -106,7 +107,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating zone") _, err = wait.CreateZoneWaitHandler(ctx, apiClient, model.ProjectId, zoneId).WaitWithContext(ctx) if err != nil { @@ -115,7 +116,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(params.Printer, model, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/dns/zone/create/create_test.go b/internal/cmd/dns/zone/create/create_test.go index 5bcc8728a..39412b8ac 100644 --- a/internal/cmd/dns/zone/create/create_test.go +++ b/internal/cmd/dns/zone/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -216,7 +217,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -339,7 +340,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/delete/delete.go b/internal/cmd/dns/zone/delete/delete.go index 2ad4373dd..8c5b01bd9 100644 --- a/internal/cmd/dns/zone/delete/delete.go +++ b/internal/cmd/dns/zone/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ZoneId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", zoneIdArg), Short: "Deletes a DNS zone", @@ -41,25 +42,25 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete zone %q? (This cannot be undone)", zoneLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting zone") _, err = wait.DeleteZoneWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId).WaitWithContext(ctx) if err != nil { @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s zone %s\n", operationState, zoneLabel) + params.Printer.Info("%s zone %s\n", operationState, zoneLabel) return nil }, } diff --git a/internal/cmd/dns/zone/delete/delete_test.go b/internal/cmd/dns/zone/delete/delete_test.go index 38c534910..77cb37649 100644 --- a/internal/cmd/dns/zone/delete/delete_test.go +++ b/internal/cmd/dns/zone/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/dns/zone/describe/describe.go b/internal/cmd/dns/zone/describe/describe.go index bd6ada66d..b97ba0445 100644 --- a/internal/cmd/dns/zone/describe/describe.go +++ b/internal/cmd/dns/zone/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ZoneId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", zoneIdArg), Short: "Shows details of a DNS zone", @@ -44,12 +45,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -62,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } zone := resp.Zone - return outputResult(p, model.OutputFormat, zone) + return outputResult(params.Printer, model.OutputFormat, zone) }, } return cmd diff --git a/internal/cmd/dns/zone/describe/describe_test.go b/internal/cmd/dns/zone/describe/describe_test.go index e97810889..ed58cbb14 100644 --- a/internal/cmd/dns/zone/describe/describe_test.go +++ b/internal/cmd/dns/zone/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/dns" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -242,7 +243,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.zone); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index 73239b2c3..017a171df 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -49,7 +50,7 @@ type inputModel struct { PageSize int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists DNS zones", @@ -71,13 +72,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -88,16 +89,16 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } if len(zones) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No zones found for project %q matching the criteria\n", projectLabel) + params.Printer.Info("No zones found for project %q matching the criteria\n", projectLabel) return nil } - return outputResult(p, model.OutputFormat, zones) + return outputResult(params.Printer, model.OutputFormat, zones) }, } configureFlags(cmd) diff --git a/internal/cmd/dns/zone/list/list_test.go b/internal/cmd/dns/zone/list/list_test.go index d96b980d7..844c2afa6 100644 --- a/internal/cmd/dns/zone/list/list_test.go +++ b/internal/cmd/dns/zone/list/list_test.go @@ -11,6 +11,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -209,7 +210,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -512,7 +513,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.zones); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/update/update.go b/internal/cmd/dns/zone/update/update.go index 0e0a6b628..09c4036fd 100644 --- a/internal/cmd/dns/zone/update/update.go +++ b/internal/cmd/dns/zone/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -50,7 +51,7 @@ type inputModel struct { ContactEmail *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", zoneIdArg), Short: "Updates a DNS zone", @@ -63,26 +64,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) if err != nil { - p.Debug(print.ErrorLevel, "get zone name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update zone %s?", zoneLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating zone") _, err = wait.PartialUpdateZoneWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId).WaitWithContext(ctx) if err != nil { @@ -113,7 +114,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s zone %s\n", operationState, zoneLabel) + params.Printer.Info("%s zone %s\n", operationState, zoneLabel) return nil }, } diff --git a/internal/cmd/dns/zone/update/update_test.go b/internal/cmd/dns/zone/update/update_test.go index 82222ad5d..adea3637d 100644 --- a/internal/cmd/dns/zone/update/update_test.go +++ b/internal/cmd/dns/zone/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -246,7 +247,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/dns/zone/zone.go b/internal/cmd/dns/zone/zone.go index 77247e3c4..b81a143ff 100644 --- a/internal/cmd/dns/zone/zone.go +++ b/internal/cmd/dns/zone/zone.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone/list" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "zone", Short: "Provides functionality for DNS zones", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(clone.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(clone.NewCmd(params)) } diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index b29048efb..704872c11 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -13,6 +13,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -81,7 +82,7 @@ type inputModel struct { NoProgressIndicator *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates images", @@ -99,13 +100,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) (err error) { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -123,7 +124,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create the image %q?", model.Name) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -141,11 +142,11 @@ func NewCmd(p *print.Printer) *cobra.Command { if !ok { return fmt.Errorf("create image: no upload URL has been provided") } - if err := uploadAsync(ctx, p, model, file, url); err != nil { + if err := uploadAsync(ctx, params.Printer, model, file, url); err != nil { return err } - if err := outputResult(p, model, result); err != nil { + if err := outputResult(params.Printer, model, result); err != nil { return err } diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index 262dc029e..cdf15ce81 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -9,6 +9,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -273,7 +274,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -422,7 +423,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index 57ae4f026..456867bdd 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -24,7 +25,7 @@ type inputModel struct { const imageIdArg = "IMAGE_ID" -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", imageIdArg), Short: "Deletes an image", @@ -35,26 +36,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } imageName, err := iaasUtils.GetImageName(ctx, apiClient, model.ProjectId, model.ImageId) if err != nil { - p.Debug(print.ErrorLevel, "get image name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get image name: %v", err) imageName = model.ImageId } else if imageName == "" { imageName = model.ImageId @@ -62,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete the image %q for %q?", imageName, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err := request.Execute(); err != nil { return fmt.Errorf("delete image: %w", err) } - p.Info("Deleted image %q for %q\n", imageName, projectLabel) + params.Printer.Info("Deleted image %q for %q\n", imageName, projectLabel) return nil }, diff --git a/internal/cmd/image/delete/delete_test.go b/internal/cmd/image/delete/delete_test.go index 1fa1ed5bc..93b2a656a 100644 --- a/internal/cmd/image/delete/delete_test.go +++ b/internal/cmd/image/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -105,7 +106,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index 20ab802fc..5c0b8a824 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { const imageIdArg = "IMAGE_ID" -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", imageIdArg), Short: "Describes image", @@ -37,13 +38,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -56,7 +57,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get image: %w", err) } - if err := outputResult(p, model.OutputFormat, image); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, image); err != nil { return err } diff --git a/internal/cmd/image/describe/describe_test.go b/internal/cmd/image/describe/describe_test.go index 036648fee..a5e421a9d 100644 --- a/internal/cmd/image/describe/describe_test.go +++ b/internal/cmd/image/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -120,7 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -217,7 +218,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/image.go b/internal/cmd/image/image.go index 899a62ce9..b722f2b91 100644 --- a/internal/cmd/image/image.go +++ b/internal/cmd/image/image.go @@ -6,15 +6,15 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/image/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/image/list" "github.com/stackitcloud/stackit-cli/internal/cmd/image/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "image", Short: "Manage server images", @@ -22,16 +22,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand( - create.NewCmd(p), - list.NewCmd(p), - delete.NewCmd(p), - describe.NewCmd(p), - update.NewCmd(p), + create.NewCmd(params), + list.NewCmd(params), + delete.NewCmd(params), + describe.NewCmd(params), + update.NewCmd(params), ) } diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index 47779fb83..eff221cba 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ const ( limitFlag = "limit" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists images", @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -81,12 +82,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if items := response.GetItems(); len(items) == 0 { - p.Info("No images found for project %q", projectLabel) + params.Printer.Info("No images found for project %q", projectLabel) } else { if model.Limit != nil && len(items) > int(*model.Limit) { items = (items)[:*model.Limit] } - if err := outputResult(p, model.OutputFormat, items); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, items); err != nil { return fmt.Errorf("output images: %w", err) } } diff --git a/internal/cmd/image/list/list_test.go b/internal/cmd/image/list/list_test.go index 49a27a16e..c357d3bc1 100644 --- a/internal/cmd/image/list/list_test.go +++ b/internal/cmd/image/list/list_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -124,7 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -239,7 +240,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index 8e6a8a2dd..e123d4fe1 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -101,7 +102,7 @@ const ( protectedFlag = "protected" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", imageIdArg), Short: "Updates an image", @@ -113,26 +114,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } imageLabel, err := iaasUtils.GetImageName(ctx, apiClient, model.ProjectId, model.Id) if err != nil { - p.Debug(print.WarningLevel, "cannot retrieve image name: %v", err) + params.Printer.Debug(print.WarningLevel, "cannot retrieve image name: %v", err) imageLabel = model.Id } else if imageLabel == "" { imageLabel = model.Id @@ -140,7 +141,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update the image %q?", imageLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -153,7 +154,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("update image: %w", err) } - p.Info("Updated image \"%v\" for %q\n", utils.PtrString(resp.Name), projectLabel) + params.Printer.Info("Updated image \"%v\" for %q\n", utils.PtrString(resp.Name), projectLabel) return nil }, diff --git a/internal/cmd/image/update/update_test.go b/internal/cmd/image/update/update_test.go index b08d3ceca..bb313b3c2 100644 --- a/internal/cmd/image/update/update_test.go +++ b/internal/cmd/image/update/update_test.go @@ -6,6 +6,7 @@ import ( "strings" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -302,7 +303,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index 0c96810ba..b59fe4fb0 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -30,7 +31,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a key pair", @@ -56,20 +57,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := "Are your sure you want to create a key pair?" - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create key pair: %w", err) } - return outputResult(p, model.GlobalFlagModel.OutputFormat, resp) + return outputResult(params.Printer, model.GlobalFlagModel.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/key-pair/create/create_test.go b/internal/cmd/key-pair/create/create_test.go index f912892d5..32a0516b6 100644 --- a/internal/cmd/key-pair/create/create_test.go +++ b/internal/cmd/key-pair/create/create_test.go @@ -5,6 +5,7 @@ import ( "os" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -123,7 +124,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -224,7 +225,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.item); (err != nil) != tt.wantErr { diff --git a/internal/cmd/key-pair/delete/delete.go b/internal/cmd/key-pair/delete/delete.go index ba9b5a9ce..8bccdd45d 100644 --- a/internal/cmd/key-pair/delete/delete.go +++ b/internal/cmd/key-pair/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -23,7 +24,7 @@ type inputModel struct { KeyPairName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", keyPairNameArg), Short: "Deletes a key pair", @@ -37,20 +38,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete key pair %q?", model.KeyPairName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete key pair: %w", err) } - p.Info("Deleted key pair %q\n", model.KeyPairName) + params.Printer.Info("Deleted key pair %q\n", model.KeyPairName) return nil }, diff --git a/internal/cmd/key-pair/delete/delete_test.go b/internal/cmd/key-pair/delete/delete_test.go index cfbcd29e8..c5c8dc913 100644 --- a/internal/cmd/key-pair/delete/delete_test.go +++ b/internal/cmd/key-pair/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -96,7 +97,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/key-pair/describe/describe.go b/internal/cmd/key-pair/describe/describe.go index f4ee01f94..b355e7433 100644 --- a/internal/cmd/key-pair/describe/describe.go +++ b/internal/cmd/key-pair/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -35,7 +36,7 @@ type inputModel struct { PublicKey bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", keyPairNameArg), Short: "Describes a key pair", @@ -53,13 +54,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,9 +73,9 @@ func NewCmd(p *print.Printer) *cobra.Command { } if keypair := resp; keypair != nil { - return outputResult(p, model.OutputFormat, model.PublicKey, *keypair) + return outputResult(params.Printer, model.OutputFormat, model.PublicKey, *keypair) } - p.Outputln("No keypair found.") + params.Printer.Outputln("No keypair found.") return nil }, } diff --git a/internal/cmd/key-pair/describe/describe_test.go b/internal/cmd/key-pair/describe/describe_test.go index 46374b3c8..c3dd4ffaa 100644 --- a/internal/cmd/key-pair/describe/describe_test.go +++ b/internal/cmd/key-pair/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -108,7 +109,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -209,7 +210,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showOnlyPublicKey, tt.args.keyPair); (err != nil) != tt.wantErr { diff --git a/internal/cmd/key-pair/key-pair.go b/internal/cmd/key-pair/key-pair.go index 90bbd648b..44cc1fef8 100644 --- a/internal/cmd/key-pair/key-pair.go +++ b/internal/cmd/key-pair/key-pair.go @@ -8,11 +8,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/list" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/update" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "key-pair", Short: "Provides functionality for SSH key pairs", @@ -20,14 +20,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: cobra.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/key-pair/list/list.go b/internal/cmd/key-pair/list/list.go index 8685edb36..980625695 100644 --- a/internal/cmd/key-pair/list/list.go +++ b/internal/cmd/key-pair/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -33,7 +34,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all key pairs", @@ -59,13 +60,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - p.Info("No key pairs found\n") + params.Printer.Info("No key pairs found\n") return nil } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/key-pair/list/list_test.go b/internal/cmd/key-pair/list/list_test.go index 8fa0a948f..6679cee0d 100644 --- a/internal/cmd/key-pair/list/list_test.go +++ b/internal/cmd/key-pair/list/list_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -116,7 +117,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -212,7 +213,7 @@ func Test_outputResult(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) if err := outputResult(p, tt.args.outputFormat, tt.args.keyPairs); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index 1a64875b5..3af038018 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -29,7 +30,7 @@ type inputModel struct { KeyPairName *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", keyPairNameArg), Short: "Updates a key pair", @@ -43,17 +44,17 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model := parseInput(p, cmd, args) + model := parseInput(params.Printer, cmd, args) // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update key pair %q?", *model.KeyPairName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return fmt.Errorf("update key pair: %w", err) } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("response is nil") } - return outputResult(p, model, *resp) + return outputResult(params.Printer, model, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/key-pair/update/update_test.go b/internal/cmd/key-pair/update/update_test.go index 5743e2d60..2f5432deb 100644 --- a/internal/cmd/key-pair/update/update_test.go +++ b/internal/cmd/key-pair/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -109,7 +110,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -208,7 +209,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.keyPair); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index a0600f66d..541293bc2 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ var ( xRequestId = uuid.NewString() ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Load Balancer", @@ -59,26 +60,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a load balancer for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating load balancer") _, err = wait.CreateLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *model.Payload.Name).WaitWithContext(ctx) if err != nil { @@ -106,7 +107,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered creation of" } - p.Outputf("%s load balancer with name %q \n", operationState, utils.PtrString(model.Payload.Name)) + params.Printer.Outputf("%s load balancer with name %q \n", operationState, utils.PtrString(model.Payload.Name)) return nil }, } diff --git a/internal/cmd/load-balancer/create/create_test.go b/internal/cmd/load-balancer/create/create_test.go index da7bfce83..eca1281a8 100644 --- a/internal/cmd/load-balancer/create/create_test.go +++ b/internal/cmd/load-balancer/create/create_test.go @@ -6,6 +6,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -277,7 +278,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index c2410db74..d5f3f6c75 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { LoadBalancerName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", loadBalancerNameArg), Short: "Deletes a Load Balancer", @@ -39,19 +40,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete load balancer %q? (This cannot be undone)", model.LoadBalancerName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting load balancer") _, err = wait.DeleteLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.LoadBalancerName).WaitWithContext(ctx) if err != nil { @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s load balancer %q\n", operationState, model.LoadBalancerName) + params.Printer.Info("%s load balancer %q\n", operationState, model.LoadBalancerName) return nil }, } diff --git a/internal/cmd/load-balancer/delete/delete_test.go b/internal/cmd/load-balancer/delete/delete_test.go index 621113c56..17cca82cb 100644 --- a/internal/cmd/load-balancer/delete/delete_test.go +++ b/internal/cmd/load-balancer/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/load-balancer/describe/describe.go b/internal/cmd/load-balancer/describe/describe.go index 603bfd185..fe8669864 100644 --- a/internal/cmd/load-balancer/describe/describe.go +++ b/internal/cmd/load-balancer/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { LoadBalancerName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", loadBalancerNameArg), Short: "Shows details of a Load Balancer", @@ -45,12 +46,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -62,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read load balancer: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/load-balancer/describe/describe_test.go b/internal/cmd/load-balancer/describe/describe_test.go index 821f942b7..2aebb5e61 100644 --- a/internal/cmd/load-balancer/describe/describe_test.go +++ b/internal/cmd/load-balancer/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -234,7 +235,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.loadBalancer); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index ba14de569..2fccfb37a 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -109,7 +110,7 @@ var ( } ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "generate-payload", Short: "Generates a payload to create/update a Load Balancer", @@ -135,20 +136,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if model.LoadBalancerName == nil { createPayload := DefaultCreateLoadBalancerPayload - return outputCreateResult(p, model.FilePath, &createPayload) + return outputCreateResult(params.Printer, model.FilePath, &createPayload) } req := buildRequest(ctx, model, apiClient) @@ -168,7 +169,7 @@ func NewCmd(p *print.Printer) *cobra.Command { TargetPools: resp.TargetPools, Version: resp.Version, } - return outputUpdateResult(p, model.FilePath, updatePayload) + return outputUpdateResult(params.Printer, model.FilePath, updatePayload) }, } configureFlags(cmd) diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index 0e2ee4beb..5943215b8 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -132,7 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -337,7 +338,7 @@ func TestOutputCreateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputCreateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { @@ -371,7 +372,7 @@ func TestOutputUpdateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputUpdateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index a9611e137..5d23c5d2a 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Load Balancers", @@ -49,13 +50,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,12 +69,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.LoadBalancers == nil || (resp.LoadBalancers != nil && len(*resp.LoadBalancers) == 0) { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No load balancers found for project %q\n", projectLabel) + params.Printer.Info("No load balancers found for project %q\n", projectLabel) return nil } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { loadBalancers = loadBalancers[:*model.Limit] } - return outputResult(p, model.OutputFormat, loadBalancers) + return outputResult(params.Printer, model.OutputFormat, loadBalancers) }, } diff --git a/internal/cmd/load-balancer/list/list_test.go b/internal/cmd/load-balancer/list/list_test.go index d0210b9cb..f43d4ae62 100644 --- a/internal/cmd/load-balancer/list/list_test.go +++ b/internal/cmd/load-balancer/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -116,7 +117,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.loadBalancers); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/load_balancer.go b/internal/cmd/load-balancer/load_balancer.go index c6f6be2f5..4a2876453 100644 --- a/internal/cmd/load-balancer/load_balancer.go +++ b/internal/cmd/load-balancer/load_balancer.go @@ -10,15 +10,15 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/quota" targetpool "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "load-balancer", Aliases: []string{"lb"}, @@ -27,18 +27,18 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(generatepayload.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(quota.NewCmd(p)) - cmd.AddCommand(observabilitycredentials.NewCmd(p)) - cmd.AddCommand(targetpool.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(generatepayload.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(quota.NewCmd(params)) + cmd.AddCommand(observabilitycredentials.NewCmd(params)) + cmd.AddCommand(targetpool.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index a75b5e064..abbbd36a0 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Password *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "add", Short: "Adds observability credentials to Load Balancer", @@ -50,26 +51,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } // Prompt for password if not passed in as a flag if model.Password == nil { - pwd, err := p.PromptForPassword("Enter user password: ") + pwd, err := params.Printer.PromptForPassword("Enter user password: ") if err != nil { return fmt.Errorf("prompt for password: %w", err) } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to add observability credentials for Load Balancer on project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("add Load Balancer observability credentials: %w", err) } - return outputResult(p, model.OutputFormat, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/load-balancer/observability-credentials/add/add_test.go b/internal/cmd/load-balancer/observability-credentials/add/add_test.go index 57557613a..5ee5523f8 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add_test.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -125,7 +126,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -229,7 +230,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index 28b560b2a..e69b3ae98 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +22,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "cleanup", Short: "Deletes observability credentials unused by any Load Balancer", @@ -34,20 +35,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } if len(credentials) == 0 { - p.Info("No unused observability credentials found on project %q\n", projectLabel) + params.Printer.Info("No unused observability credentials found on project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { prompt += fmt.Sprintf(" - %s (username: %q)\n", name, username) } prompt += fmt.Sprintf("Are you sure you want to delete unused observability credentials on project %q? (This cannot be undone)", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - p.Info("Deleted unused Load Balancer observability credentials on project %q\n", projectLabel) + params.Printer.Info("Deleted unused Load Balancer observability credentials on project %q\n", projectLabel) return nil }, } diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go index ae7b8e3c4..7154b55ee 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -116,7 +117,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete.go b/internal/cmd/load-balancer/observability-credentials/delete/delete.go index 73c9db46d..12b260489 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { CredentialsRef string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsRefArg), Short: "Deletes observability credentials for Load Balancer", @@ -39,32 +40,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } credentialsLabel, err := loadbalancerUtils.GetCredentialsDisplayName(ctx, apiClient, model.ProjectId, model.Region, model.CredentialsRef) if err != nil { - p.Debug(print.ErrorLevel, "get observability credentials display name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get observability credentials display name: %v", err) credentialsLabel = model.CredentialsRef } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete observability credentials %q on project %q?(This cannot be undone)", credentialsLabel, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Load Balancer observability credentials: %w", err) } - p.Info("Deleted observability credentials %q on project %q\n", credentialsLabel, projectLabel) + params.Printer.Info("Deleted observability credentials %q on project %q\n", credentialsLabel, projectLabel) return nil }, } diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go index d4f22f799..4730f6a31 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe.go b/internal/cmd/load-balancer/observability-credentials/describe/describe.go index 9f622f750..a09a94685 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { CredentialsRef string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsRefArg), Short: "Shows details of observability credentials for Load Balancer", @@ -41,13 +42,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -59,7 +60,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe Load Balancer observability credentials: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go index a67979219..55335f68b 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -135,7 +136,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -245,7 +246,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 87e149053..92dcb9602 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Unused bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists observability credentials for Load Balancer", @@ -60,20 +61,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } @@ -105,7 +106,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } else if model.Unused { opLabel += "unused" } - p.Info("%s observability credentials found for Load Balancer on project %q\n", opLabel, projectLabel) + params.Printer.Info("%s observability credentials found for Load Balancer on project %q\n", opLabel, projectLabel) return nil } @@ -113,7 +114,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/load-balancer/observability-credentials/list/list_test.go b/internal/cmd/load-balancer/observability-credentials/list/list_test.go index ddf04272e..00d107c2e 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list_test.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" @@ -145,7 +146,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -297,7 +298,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/observability-credentials/observability-credentials.go b/internal/cmd/load-balancer/observability-credentials/observability-credentials.go index 390b83caf..03613a8de 100644 --- a/internal/cmd/load-balancer/observability-credentials/observability-credentials.go +++ b/internal/cmd/load-balancer/observability-credentials/observability-credentials.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/observability-credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/observability-credentials/list" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/observability-credentials/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "observability-credentials", Short: "Provides functionality for Load Balancer observability credentials", @@ -23,15 +23,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Aliases: []string{"credentials"}, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(add.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(cleanup.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(add.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(cleanup.NewCmd(params)) } diff --git a/internal/cmd/load-balancer/observability-credentials/update/update.go b/internal/cmd/load-balancer/observability-credentials/update/update.go index 4c76da9f9..942c20131 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -45,7 +46,7 @@ type inputModel struct { Password *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", credentialsRefArg), Short: "Updates observability credentials for Load Balancer", @@ -61,32 +62,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } credentialsLabel, err := loadBalancerUtils.GetCredentialsDisplayName(ctx, apiClient, model.ProjectId, model.Region, model.CredentialsRef) if err != nil { - p.Debug(print.ErrorLevel, "get credentials display name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials display name: %v", err) credentialsLabel = model.CredentialsRef } // Prompt for password if not passed in as a flag if model.Password == nil { - pwd, err := p.PromptForPassword("Enter new password: ") + pwd, err := params.Printer.PromptForPassword("Enter new password: ") if err != nil { return fmt.Errorf("prompt for password: %w", err) } @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update observability credentials %q for Load Balancer on project %q?", credentialsLabel, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -112,7 +113,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Load Balancer observability credentials: %w", err) } - p.Info("Updated observability credentials %q for Load Balancer on project %q\n", credentialsLabel, projectLabel) + params.Printer.Info("Updated observability credentials %q for Load Balancer on project %q\n", credentialsLabel, projectLabel) return nil }, } diff --git a/internal/cmd/load-balancer/observability-credentials/update/update_test.go b/internal/cmd/load-balancer/observability-credentials/update/update_test.go index 87677fa86..5aa4faa50 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update_test.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -180,7 +181,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index 9c2fb2840..fdb173fb0 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,7 +23,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "quota", Short: "Shows the configured Load Balancer quota", @@ -35,12 +36,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -52,7 +53,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get load balancer quota: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/load-balancer/quota/quota_test.go b/internal/cmd/load-balancer/quota/quota_test.go index e1ba5a893..16c14e857 100644 --- a/internal/cmd/load-balancer/quota/quota_test.go +++ b/internal/cmd/load-balancer/quota/quota_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -94,7 +95,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -194,7 +195,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.quota); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 139dfda26..5dec7bfca 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { IP string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("add-target %s", ipArg), Short: "Adds a target to a target pool", @@ -49,20 +50,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to add a target with IP %q to target pool %q of load balancer %q?", model.IP, model.TargetPoolName, model.LBName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("add target to target pool: %w", err) } - p.Info("Added target to target pool of load balancer %q\n", model.LBName) + params.Printer.Info("Added target to target pool of load balancer %q\n", model.LBName) return nil }, } diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go index 6fd3da6c9..61d2fe4a6 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -260,7 +261,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index a4ffa6d65..b9699e7c0 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -9,6 +9,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { LBName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", targetPoolNameArg), Short: "Shows details of a target pool in a Load Balancer", @@ -50,12 +51,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { listener := lbUtils.FindLoadBalancerListenerByTargetPool(*resp.Listeners, *targetPool.Name) - return outputResult(p, model.OutputFormat, *targetPool, listener) + return outputResult(params.Printer, model.OutputFormat, *targetPool, listener) }, } configureFlags(cmd) diff --git a/internal/cmd/load-balancer/target-pool/describe/describe_test.go b/internal/cmd/load-balancer/target-pool/describe/describe_test.go index e1acadb53..d59a0fe6b 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe_test.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { @@ -244,7 +245,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.targetPool, tt.args.listener); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index 2fbb0c447..5d8297665 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { IP string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("remove-target %s", ipArg), Short: "Removes a target from a target pool", @@ -45,26 +46,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } targetLabel, err := utils.GetTargetName(ctx, apiClient, model.ProjectId, model.Region, model.LBName, model.TargetPoolName, model.IP) if err != nil { - p.Debug(print.ErrorLevel, "get target name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get target name: %v", err) targetLabel = model.IP } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to remove target %q from target pool %q of load balancer %q?", targetLabel, model.TargetPoolName, model.LBName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("remove target from target pool: %w", err) } - p.Info("Removed target from target pool of load balancer %q\n", model.LBName) + params.Printer.Info("Removed target from target pool of load balancer %q\n", model.LBName) return nil }, } diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go index e961447d2..d945f3c8e 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -249,7 +250,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { diff --git a/internal/cmd/load-balancer/target-pool/target_pool.go b/internal/cmd/load-balancer/target-pool/target_pool.go index 78a8d50c7..da2e0f7fa 100644 --- a/internal/cmd/load-balancer/target-pool/target_pool.go +++ b/internal/cmd/load-balancer/target-pool/target_pool.go @@ -4,14 +4,14 @@ import ( addtarget "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool/add-target" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool/describe" removetarget "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool/remove-target" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "target-pool", Short: "Provides functionality for target pools", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(addtarget.NewCmd(p)) - cmd.AddCommand(removetarget.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(addtarget.NewCmd(params)) + cmd.AddCommand(removetarget.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } diff --git a/internal/cmd/load-balancer/update/update.go b/internal/cmd/load-balancer/update/update.go index 154e9d992..ab2a82d88 100644 --- a/internal/cmd/load-balancer/update/update.go +++ b/internal/cmd/load-balancer/update/update.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Payload loadbalancer.UpdateLoadBalancerPayload } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", loadBalancerNameArg), Short: "Updates a Load Balancer", @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update load balancer %q?", model.LoadBalancerName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } // The API has no status to wait on, so async mode is default - p.Info("Updated load balancer with name %q\n", model.LoadBalancerName) + params.Printer.Info("Updated load balancer with name %q\n", model.LoadBalancerName) return nil }, } diff --git a/internal/cmd/load-balancer/update/update_test.go b/internal/cmd/load-balancer/update/update_test.go index b6c998138..9d97f07fc 100644 --- a/internal/cmd/load-balancer/update/update_test.go +++ b/internal/cmd/load-balancer/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -300,7 +301,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index 61df00f15..80783e6da 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a LogMe instance", @@ -46,26 +47,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create LogMe credentials: %w", err) } - return outputResult(p, model.OutputFormat, model.ShowPassword, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.ShowPassword, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/logme/credentials/create/create_test.go b/internal/cmd/logme/credentials/create/create_test.go index 3ad8aec16..d577d1422 100644 --- a/internal/cmd/logme/credentials/create/create_test.go +++ b/internal/cmd/logme/credentials/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -227,7 +228,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/credentials/credentials.go b/internal/cmd/logme/credentials/credentials.go index 1b884797a..9f7cd2d7e 100644 --- a/internal/cmd/logme/credentials/credentials.go +++ b/internal/cmd/logme/credentials/credentials.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for LogMe credentials", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/logme/credentials/delete/delete.go b/internal/cmd/logme/credentials/delete/delete.go index 2f884ac0e..2295be928 100644 --- a/internal/cmd/logme/credentials/delete/delete.go +++ b/internal/cmd/logme/credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a LogMe instance", @@ -43,32 +44,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } credentialsLabel, err := logmeUtils.GetCredentialsUsername(ctx, apiClient, model.ProjectId, model.InstanceId, model.CredentialsId) if err != nil { - p.Debug(print.ErrorLevel, "get credentials username: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials username: %v", err) credentialsLabel = model.CredentialsId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete LogMe credentials: %w", err) } - p.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) + params.Printer.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/logme/credentials/delete/delete_test.go b/internal/cmd/logme/credentials/delete/delete_test.go index ea6d637f2..96aff20b2 100644 --- a/internal/cmd/logme/credentials/delete/delete_test.go +++ b/internal/cmd/logme/credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/logme/credentials/describe/describe.go b/internal/cmd/logme/credentials/describe/describe.go index 2a73c9a15..faf1537b6 100644 --- a/internal/cmd/logme/credentials/describe/describe.go +++ b/internal/cmd/logme/credentials/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a LogMe instance", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe LogMe credentials: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/logme/credentials/describe/describe_test.go b/internal/cmd/logme/credentials/describe/describe_test.go index 3ef166834..ae7f38696 100644 --- a/internal/cmd/logme/credentials/describe/describe_test.go +++ b/internal/cmd/logme/credentials/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index a149a6090..107824d39 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a LogMe instance", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,10 +73,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No credentials found for instance %q\n", instanceLabel) + params.Printer.Info("No credentials found for instance %q\n", instanceLabel) return nil } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/logme/credentials/list/list_test.go b/internal/cmd/logme/credentials/list/list_test.go index dd9b71e66..55c522bbf 100644 --- a/internal/cmd/logme/credentials/list/list_test.go +++ b/internal/cmd/logme/credentials/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -239,7 +240,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index df11b20a2..89f2d9dc0 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a LogMe instance", @@ -74,26 +75,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a LogMe instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -116,7 +117,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -125,7 +126,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/logme/instance/create/create_test.go b/internal/cmd/logme/instance/create/create_test.go index ac8928edf..9f452d086 100644 --- a/internal/cmd/logme/instance/create/create_test.go +++ b/internal/cmd/logme/instance/create/create_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -262,7 +263,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -490,7 +491,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/delete/delete.go b/internal/cmd/logme/instance/delete/delete.go index 315a2b3be..25693c798 100644 --- a/internal/cmd/logme/instance/delete/delete.go +++ b/internal/cmd/logme/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a LogMe instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/logme/instance/delete/delete_test.go b/internal/cmd/logme/instance/delete/delete_test.go index 607bc9bd2..dde9637bb 100644 --- a/internal/cmd/logme/instance/delete/delete_test.go +++ b/internal/cmd/logme/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/logme/instance/describe/describe.go b/internal/cmd/logme/instance/describe/describe.go index d32944bdf..29b86a0a7 100644 --- a/internal/cmd/logme/instance/describe/describe.go +++ b/internal/cmd/logme/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a LogMe instance", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read LogMe instance: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/logme/instance/describe/describe_test.go b/internal/cmd/logme/instance/describe/describe_test.go index 3cc0b5e38..00041b4a9 100644 --- a/internal/cmd/logme/instance/describe/describe_test.go +++ b/internal/cmd/logme/instance/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/instance.go b/internal/cmd/logme/instance/instance.go index 534151d57..aa86b4f08 100644 --- a/internal/cmd/logme/instance/instance.go +++ b/internal/cmd/logme/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for LogMe instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index e59d09cb6..821727852 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all LogMe instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/logme/instance/list/list_test.go b/internal/cmd/logme/instance/list/list_test.go index 97df7394c..0168ee409 100644 --- a/internal/cmd/logme/instance/list/list_test.go +++ b/internal/cmd/logme/instance/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/update/update.go b/internal/cmd/logme/instance/update/update.go index 08972358e..79802ee58 100644 --- a/internal/cmd/logme/instance/update/update.go +++ b/internal/cmd/logme/instance/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a LogMe instance", @@ -71,26 +72,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -113,7 +114,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -126,7 +127,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/logme/instance/update/update_test.go b/internal/cmd/logme/instance/update/update_test.go index 4577de0ec..dc3518985 100644 --- a/internal/cmd/logme/instance/update/update_test.go +++ b/internal/cmd/logme/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -267,7 +268,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/logme/logme.go b/internal/cmd/logme/logme.go index 9dc8b77fd..a4e3f4715 100644 --- a/internal/cmd/logme/logme.go +++ b/internal/cmd/logme/logme.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/plans" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "logme", Short: "Provides functionality for LogMe", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(plans.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) } diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index ccfdc098b..2eb665d7e 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all LogMe service plans", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No plans found for project %q\n", projectLabel) + params.Printer.Info("No plans found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(p, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, plans) }, } diff --git a/internal/cmd/logme/plans/plans_test.go b/internal/cmd/logme/plans/plans_test.go index bc8c78bb7..6feb2a2a5 100644 --- a/internal/cmd/logme/plans/plans_test.go +++ b/internal/cmd/logme/plans/plans_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index 880444860..7e4a8a592 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a MariaDB instance", @@ -47,26 +48,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create MariaDB credentials: %w", err) } - return outputResult(p, model.OutputFormat, model.ShowPassword, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.ShowPassword, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/mariadb/credentials/create/create_test.go b/internal/cmd/mariadb/credentials/create/create_test.go index d3202e596..5516a2415 100644 --- a/internal/cmd/mariadb/credentials/create/create_test.go +++ b/internal/cmd/mariadb/credentials/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -228,7 +229,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/credentials/credentials.go b/internal/cmd/mariadb/credentials/credentials.go index f8fb1c5d2..e23c3887f 100644 --- a/internal/cmd/mariadb/credentials/credentials.go +++ b/internal/cmd/mariadb/credentials/credentials.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for MariaDB credentials", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/mariadb/credentials/delete/delete.go b/internal/cmd/mariadb/credentials/delete/delete.go index 4e8185624..5df7736dc 100644 --- a/internal/cmd/mariadb/credentials/delete/delete.go +++ b/internal/cmd/mariadb/credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a MariaDB instance", @@ -43,32 +44,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } credentialsLabel, err := mariadbUtils.GetCredentialsUsername(ctx, apiClient, model.ProjectId, model.InstanceId, model.CredentialsId) if err != nil { - p.Debug(print.ErrorLevel, "get credentials username: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials username: %v", err) credentialsLabel = model.CredentialsId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete MariaDB credentials: %w", err) } - p.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) + params.Printer.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/mariadb/credentials/delete/delete_test.go b/internal/cmd/mariadb/credentials/delete/delete_test.go index c1b2560e5..81da9d7b3 100644 --- a/internal/cmd/mariadb/credentials/delete/delete_test.go +++ b/internal/cmd/mariadb/credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mariadb/credentials/describe/describe.go b/internal/cmd/mariadb/credentials/describe/describe.go index 8e3e3f869..c868a7d60 100644 --- a/internal/cmd/mariadb/credentials/describe/describe.go +++ b/internal/cmd/mariadb/credentials/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a MariaDB instance", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe MariaDB credentials: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/mariadb/credentials/describe/describe_test.go b/internal/cmd/mariadb/credentials/describe/describe_test.go index f822d88f4..522049aec 100644 --- a/internal/cmd/mariadb/credentials/describe/describe_test.go +++ b/internal/cmd/mariadb/credentials/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -269,7 +270,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index b854d6c66..acb97d02f 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a MariaDB instance", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,10 +72,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No credentials found for instance %q\n", instanceLabel) + params.Printer.Info("No credentials found for instance %q\n", instanceLabel) return nil } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/mariadb/credentials/list/list_test.go b/internal/cmd/mariadb/credentials/list/list_test.go index 978210a9f..c4fbce7b2 100644 --- a/internal/cmd/mariadb/credentials/list/list_test.go +++ b/internal/cmd/mariadb/credentials/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -240,7 +241,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index 3a2a4e4fb..dae8ad6b3 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a MariaDB instance", @@ -74,26 +75,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a MariaDB instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -116,7 +117,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -125,7 +126,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/mariadb/instance/create/create_test.go b/internal/cmd/mariadb/instance/create/create_test.go index 0e797ff1e..33dedf860 100644 --- a/internal/cmd/mariadb/instance/create/create_test.go +++ b/internal/cmd/mariadb/instance/create/create_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -262,7 +263,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -491,7 +492,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/delete/delete.go b/internal/cmd/mariadb/instance/delete/delete.go index e28fb3593..7b7b2d6e5 100644 --- a/internal/cmd/mariadb/instance/delete/delete.go +++ b/internal/cmd/mariadb/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a MariaDB instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/mariadb/instance/delete/delete_test.go b/internal/cmd/mariadb/instance/delete/delete_test.go index 4dbac6693..737f2affc 100644 --- a/internal/cmd/mariadb/instance/delete/delete_test.go +++ b/internal/cmd/mariadb/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mariadb/instance/describe/describe.go b/internal/cmd/mariadb/instance/describe/describe.go index b3b8013a6..978cdcf24 100644 --- a/internal/cmd/mariadb/instance/describe/describe.go +++ b/internal/cmd/mariadb/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a MariaDB instance", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read MariaDB instance: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/mariadb/instance/describe/describe_test.go b/internal/cmd/mariadb/instance/describe/describe_test.go index 555f7bcbf..3d5cc03ec 100644 --- a/internal/cmd/mariadb/instance/describe/describe_test.go +++ b/internal/cmd/mariadb/instance/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -242,7 +243,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/instance.go b/internal/cmd/mariadb/instance/instance.go index 71e25309a..3b16f4864 100644 --- a/internal/cmd/mariadb/instance/instance.go +++ b/internal/cmd/mariadb/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for MariaDB instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 2b2dbe70c..3bba56507 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all MariaDB instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/mariadb/instance/list/list_test.go b/internal/cmd/mariadb/instance/list/list_test.go index a7b29714f..7f199d16c 100644 --- a/internal/cmd/mariadb/instance/list/list_test.go +++ b/internal/cmd/mariadb/instance/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -219,7 +220,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/update/update.go b/internal/cmd/mariadb/instance/update/update.go index a2b70759e..80cabdac5 100644 --- a/internal/cmd/mariadb/instance/update/update.go +++ b/internal/cmd/mariadb/instance/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -53,7 +54,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a MariaDB instance", @@ -69,26 +70,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -111,7 +112,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -124,7 +125,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/mariadb/instance/update/update_test.go b/internal/cmd/mariadb/instance/update/update_test.go index 514820867..5fb7369c5 100644 --- a/internal/cmd/mariadb/instance/update/update_test.go +++ b/internal/cmd/mariadb/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -278,7 +279,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mariadb/mariadb.go b/internal/cmd/mariadb/mariadb.go index 7058813f9..602949253 100644 --- a/internal/cmd/mariadb/mariadb.go +++ b/internal/cmd/mariadb/mariadb.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/plans" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "mariadb", Short: "Provides functionality for MariaDB", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(plans.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) } diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index e4d3bf021..5b342f29e 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all MariaDB service plans", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No plans found for project %q\n", projectLabel) + params.Printer.Info("No plans found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(p, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, plans) }, } diff --git a/internal/cmd/mariadb/plans/plans_test.go b/internal/cmd/mariadb/plans/plans_test.go index 3d8f56a28..f80f6c9cd 100644 --- a/internal/cmd/mariadb/plans/plans_test.go +++ b/internal/cmd/mariadb/plans/plans_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -219,7 +220,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/backup.go b/internal/cmd/mongodbflex/backup/backup.go index 738363d78..af716446b 100644 --- a/internal/cmd/mongodbflex/backup/backup.go +++ b/internal/cmd/mongodbflex/backup/backup.go @@ -7,14 +7,14 @@ import ( restorejobs "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/backup/restore-jobs" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/backup/schedule" updateschedule "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/backup/update-schedule" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for MongoDB Flex instance backups", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(updateschedule.NewCmd(p)) - cmd.AddCommand(schedule.NewCmd(p)) - cmd.AddCommand(restore.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(restorejobs.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(updateschedule.NewCmd(params)) + cmd.AddCommand(schedule.NewCmd(params)) + cmd.AddCommand(restore.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(restorejobs.NewCmd(params)) } diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index a30fb3f63..43e8a0b81 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { BackupId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Shows details of a backup for a MongoDB Flex instance", @@ -49,20 +50,20 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(backupIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongoUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } restoreJobState := mongoUtils.GetRestoreStatus(model.BackupId, restoreJobs) - return outputResult(p, model.OutputFormat, restoreJobState, *resp.Item) + return outputResult(params.Printer, model.OutputFormat, restoreJobState, *resp.Item) }, } configureFlags(cmd) diff --git a/internal/cmd/mongodbflex/backup/describe/describe_test.go b/internal/cmd/mongodbflex/backup/describe/describe_test.go index 0b761904d..914f27259 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe_test.go +++ b/internal/cmd/mongodbflex/backup/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -159,7 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -263,7 +264,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.restoreStatus, tt.args.backup); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index b145685fb..75ddca216 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all backups which are available for a MongoDB Flex instance", @@ -52,20 +53,20 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { backups = backups[:*model.Limit] } - return outputResult(p, model.OutputFormat, backups, restoreJobs) + return outputResult(params.Printer, model.OutputFormat, backups, restoreJobs) }, } diff --git a/internal/cmd/mongodbflex/backup/list/list_test.go b/internal/cmd/mongodbflex/backup/list/list_test.go index 362b35c78..3328c6030 100644 --- a/internal/cmd/mongodbflex/backup/list/list_test.go +++ b/internal/cmd/mongodbflex/backup/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -248,7 +249,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backups, tt.args.restoreJobs); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 30a48be34..7119dccbb 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "restore-jobs", Short: "Lists all restore jobs which have been run for a MongoDB Flex instance", @@ -51,20 +52,20 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { restoreJobs = restoreJobs[:*model.Limit] } - return outputResult(p, model.OutputFormat, restoreJobs) + return outputResult(params.Printer, model.OutputFormat, restoreJobs) }, } diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go index 5135be262..61f911ea7 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -239,7 +240,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.restoreJobs); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index c8de137fc..067c0e56e 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Timestamp string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "restore", Short: "Restores a MongoDB Flex instance from a backup", @@ -58,26 +59,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to restore MongoDB Flex instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -99,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Restoring instance") _, err = wait.RestoreInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.BackupId).WaitWithContext(ctx) if err != nil { @@ -108,7 +109,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - p.Outputf("Restored instance %q with backup %q\n", model.InstanceId, model.BackupId) + params.Printer.Outputf("Restored instance %q with backup %q\n", model.InstanceId, model.BackupId) return nil } @@ -120,7 +121,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Cloning instance") _, err = wait.CloneInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -129,7 +130,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - p.Outputf("Cloned instance %q from backup with timestamp %q\n", model.InstanceId, model.Timestamp) + params.Printer.Outputf("Cloned instance %q from backup with timestamp %q\n", model.InstanceId, model.Timestamp) return nil }, } diff --git a/internal/cmd/mongodbflex/backup/restore/restore_test.go b/internal/cmd/mongodbflex/backup/restore/restore_test.go index 63e06d9af..bffa02934 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore_test.go +++ b/internal/cmd/mongodbflex/backup/restore/restore_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -170,7 +171,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index b21167724..55272a544 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "schedule", Short: "Shows details of the backup schedule and retention policy of a MongoDB Flex instance", @@ -44,12 +45,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -61,7 +62,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read MongoDB Flex instance: %w", err) } - return outputResult(p, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp.Item) }, } configureFlags(cmd) diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go index 018cefc28..705bd7432 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index 8f75c6964..d417ccbf4 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -6,6 +6,7 @@ import ( "strconv" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -46,7 +47,7 @@ type inputModel struct { MonthlySnapshotRetentionMonths *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update-schedule", Short: "Updates the backup schedule and retention policy for a MongoDB Flex instance", @@ -69,26 +70,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongoDBflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update backup schedule of instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index c6c4d3322..2b8905364 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { Type *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a MongoDB Flex instance", @@ -76,26 +77,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a MongoDB Flex instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -123,7 +124,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -132,7 +133,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/mongodbflex/instance/create/create_test.go b/internal/cmd/mongodbflex/instance/create/create_test.go index 23fa109b7..72ab744b7 100644 --- a/internal/cmd/mongodbflex/instance/create/create_test.go +++ b/internal/cmd/mongodbflex/instance/create/create_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -250,7 +251,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -573,7 +574,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.createInstanceResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index 237681df0..86653c5a3 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a MongoDB Flex instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/mongodbflex/instance/delete/delete_test.go b/internal/cmd/mongodbflex/instance/delete/delete_test.go index ec3913381..1c02e7f87 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete_test.go +++ b/internal/cmd/mongodbflex/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index 79ca55b64..2b64e3432 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a MongoDB Flex instance", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read MongoDB Flex instance: %w", err) } - return outputResult(p, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp.Item) }, } return cmd diff --git a/internal/cmd/mongodbflex/instance/describe/describe_test.go b/internal/cmd/mongodbflex/instance/describe/describe_test.go index 1238f7bc0..c933d86e4 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe_test.go +++ b/internal/cmd/mongodbflex/instance/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/instance/instance.go b/internal/cmd/mongodbflex/instance/instance.go index 1a770bcc1..a4cc5b231 100644 --- a/internal/cmd/mongodbflex/instance/instance.go +++ b/internal/cmd/mongodbflex/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for MongoDB Flex instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index 5b65f8d5e..a016550cc 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all MongoDB Flex instances", @@ -49,13 +50,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get MongoDB Flex instances: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } instances := *resp.Items @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/mongodbflex/instance/list/list_test.go b/internal/cmd/mongodbflex/instance/list/list_test.go index e6a9c1416..e8a95d34c 100644 --- a/internal/cmd/mongodbflex/instance/list/list_test.go +++ b/internal/cmd/mongodbflex/instance/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceList); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index 5f854005c..e1882bfd9 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { Type *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a MongoDB Flex instance", @@ -71,26 +72,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -109,7 +110,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -118,7 +119,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/mongodbflex/instance/update/update_test.go b/internal/cmd/mongodbflex/instance/update/update_test.go index a36f33454..0379f2c0f 100644 --- a/internal/cmd/mongodbflex/instance/update/update_test.go +++ b/internal/cmd/mongodbflex/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -280,7 +281,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -617,7 +618,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/mongodbflex.go b/internal/cmd/mongodbflex/mongodbflex.go index e7373b9b9..50ba29f78 100644 --- a/internal/cmd/mongodbflex/mongodbflex.go +++ b/internal/cmd/mongodbflex/mongodbflex.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/options" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "mongodbflex", Short: "Provides functionality for MongoDB Flex", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(user.NewCmd(p)) - cmd.AddCommand(options.NewCmd(p)) - cmd.AddCommand(backup.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(user.NewCmd(params)) + cmd.AddCommand(options.NewCmd(params)) + cmd.AddCommand(backup.NewCmd(params)) } diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 82b43cbc5..92c6c55bb 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -45,7 +47,7 @@ type flavorStorages struct { Storages *mongodbflex.ListStoragesResponse `json:"storages"` } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists MongoDB Flex options", @@ -64,19 +66,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } // Call API - err = buildAndExecuteRequest(ctx, p, model, apiClient) + err = buildAndExecuteRequest(ctx, params.Printer, model, apiClient) if err != nil { return fmt.Errorf("get MongoDB Flex options: %w", err) } diff --git a/internal/cmd/mongodbflex/options/options_test.go b/internal/cmd/mongodbflex/options/options_test.go index 9b48a710b..dc1eb60c8 100644 --- a/internal/cmd/mongodbflex/options/options_test.go +++ b/internal/cmd/mongodbflex/options/options_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -167,7 +168,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -291,7 +292,7 @@ func TestBuildAndExecuteRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := &print.Printer{} - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) p.Cmd = cmd client := &mongoDBFlexClientMocked{ listFlavorsFails: tt.listFlavorsFails, @@ -406,7 +407,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.inputModel, tt.args.flavors, tt.args.versions, tt.args.storages); (err != nil) != tt.wantErr { @@ -455,7 +456,7 @@ func TestOutputResultAsTable(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResultAsTable(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index be494fcdb..afc26fe76 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a MongoDB Flex user", @@ -60,26 +61,26 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } user := resp.Item - return outputResult(p, model.OutputFormat, instanceLabel, user) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, user) }, } diff --git a/internal/cmd/mongodbflex/user/create/create_test.go b/internal/cmd/mongodbflex/user/create/create_test.go index 73f184a65..75e02fef0 100644 --- a/internal/cmd/mongodbflex/user/create/create_test.go +++ b/internal/cmd/mongodbflex/user/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -270,7 +271,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/delete/delete.go b/internal/cmd/mongodbflex/user/delete/delete.go index 7eec0fbd5..d57879062 100644 --- a/internal/cmd/mongodbflex/user/delete/delete.go +++ b/internal/cmd/mongodbflex/user/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a MongoDB Flex user", @@ -47,32 +48,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete MongoDB Flex user: %w", err) } - p.Info("Deleted user %q of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Deleted user %q of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/mongodbflex/user/delete/delete_test.go b/internal/cmd/mongodbflex/user/delete/delete_test.go index 36e356790..b373f7f56 100644 --- a/internal/cmd/mongodbflex/user/delete/delete_test.go +++ b/internal/cmd/mongodbflex/user/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mongodbflex/user/describe/describe.go b/internal/cmd/mongodbflex/user/describe/describe.go index b94f4b453..89f919f7b 100644 --- a/internal/cmd/mongodbflex/user/describe/describe.go +++ b/internal/cmd/mongodbflex/user/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a MongoDB Flex user", @@ -53,13 +54,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get MongoDB Flex user: %w", err) } - return outputResult(p, model.OutputFormat, *resp.Item) + return outputResult(params.Printer, model.OutputFormat, *resp.Item) }, } diff --git a/internal/cmd/mongodbflex/user/describe/describe_test.go b/internal/cmd/mongodbflex/user/describe/describe_test.go index 7d5201075..c151b4da0 100644 --- a/internal/cmd/mongodbflex/user/describe/describe_test.go +++ b/internal/cmd/mongodbflex/user/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceResponseUser); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index ae690568b..299319462 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all MongoDB Flex users of an instance", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,10 +73,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } - p.Info("No users found for instance %q\n", instanceLabel) + params.Printer.Info("No users found for instance %q\n", instanceLabel) return nil } users := *resp.Items @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { users = users[:*model.Limit] } - return outputResult(p, model.OutputFormat, users) + return outputResult(params.Printer, model.OutputFormat, users) }, } diff --git a/internal/cmd/mongodbflex/user/list/list_test.go b/internal/cmd/mongodbflex/user/list/list_test.go index 8cc901aef..18e9325f5 100644 --- a/internal/cmd/mongodbflex/user/list/list_test.go +++ b/internal/cmd/mongodbflex/user/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -235,7 +236,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.users); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index 5541b89a3..72d7ad9d4 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reset-password %s", userIdArg), Short: "Resets the password of a MongoDB Flex user", @@ -49,32 +50,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("reset MongoDB Flex user password: %w", err) } - return outputResult(p, model.OutputFormat, userLabel, instanceLabel, user) + return outputResult(params.Printer, model.OutputFormat, userLabel, instanceLabel, user) }, } diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go index 98abb2136..d86e57206 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -270,7 +271,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.userLabel, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index ee2a9ea1d..3ebdf4e6d 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", userIdArg), Short: "Updates a MongoDB Flex user", @@ -48,32 +49,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update user %q of instance %q?", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update MongoDB Flex user: %w", err) } - p.Info("Updated user %q of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Updated user %q of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/mongodbflex/user/update/update_test.go b/internal/cmd/mongodbflex/user/update/update_test.go index fc2872c2d..e4f74eb0f 100644 --- a/internal/cmd/mongodbflex/user/update/update_test.go +++ b/internal/cmd/mongodbflex/user/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -197,7 +198,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mongodbflex/user/user.go b/internal/cmd/mongodbflex/user/user.go index 614b7c2f9..0e0600ed6 100644 --- a/internal/cmd/mongodbflex/user/user.go +++ b/internal/cmd/mongodbflex/user/user.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user/list" resetpassword "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user/reset-password" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for MongoDB Flex users", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(resetpassword.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(resetpassword.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 4ce917af7..80c14dc37 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -45,7 +46,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a STACKIT Network Area (SNA)", @@ -71,34 +72,34 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } var orgLabel string - rmApiClient, err := rmClient.ConfigureClient(p) + rmApiClient, err := rmClient.ConfigureClient(params.Printer) if err == nil { orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) if err != nil { - p.Debug(print.ErrorLevel, "get organization name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get organization name: %v", err) orgLabel = *model.OrganizationId } else if orgLabel == "" { orgLabel = *model.OrganizationId } } else { - p.Debug(print.ErrorLevel, "configure resource manager client: %v", err) + params.Printer.Debug(print.ErrorLevel, "configure resource manager client: %v", err) } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a network area for organization %q?", orgLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -111,7 +112,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create network area: %w", err) } - return outputResult(p, model.OutputFormat, orgLabel, resp) + return outputResult(params.Printer, model.OutputFormat, orgLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/create/create_test.go b/internal/cmd/network-area/create/create_test.go index ee055ad5c..7b9d235cd 100644 --- a/internal/cmd/network-area/create/create_test.go +++ b/internal/cmd/network-area/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -193,7 +194,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -289,7 +290,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.orgLabel, tt.args.networkArea); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index d617d8496..49f618338 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -30,7 +31,7 @@ type inputModel struct { AreaId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", areaIdArg), Short: "Deletes a STACKIT Network Area (SNA)", @@ -47,20 +48,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, model.AreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = model.AreaId } else if networkAreaLabel == "" { networkAreaLabel = model.AreaId @@ -68,7 +69,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete network area %q?", networkAreaLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting network area") _, err = wait.DeleteNetworkAreaWaitHandler(ctx, apiClient, *model.OrganizationId, model.AreaId).WaitWithContext(ctx) if err != nil { @@ -96,7 +97,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s STACKIT Network Area %q\n", operationState, networkAreaLabel) + params.Printer.Info("%s STACKIT Network Area %q\n", operationState, networkAreaLabel) return nil }, } diff --git a/internal/cmd/network-area/delete/delete_test.go b/internal/cmd/network-area/delete/delete_test.go index a3ff4f430..4b8077590 100644 --- a/internal/cmd/network-area/delete/delete_test.go +++ b/internal/cmd/network-area/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index 35be06f3c..6658b1feb 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -34,7 +35,7 @@ type inputModel struct { ShowAttachedProjects bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", areaIdArg), Short: "Shows details of a STACKIT Network Area", @@ -56,13 +57,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - return outputResult(p, model.OutputFormat, resp, projects) + return outputResult(params.Printer, model.OutputFormat, resp, projects) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/describe/describe_test.go b/internal/cmd/network-area/describe/describe_test.go index 24c18cb06..7160f6a01 100644 --- a/internal/cmd/network-area/describe/describe_test.go +++ b/internal/cmd/network-area/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -149,7 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -253,7 +254,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkArea, tt.args.attachedProjects); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index 4e112ae53..82147c17b 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all STACKIT Network Areas (SNA) of an organization", @@ -60,13 +61,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -80,19 +81,19 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { var orgLabel string - rmApiClient, err := rmClient.ConfigureClient(p) + rmApiClient, err := rmClient.ConfigureClient(params.Printer) if err == nil { orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) if err != nil { - p.Debug(print.ErrorLevel, "get organization name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get organization name: %v", err) orgLabel = *model.OrganizationId } else if orgLabel == "" { orgLabel = *model.OrganizationId } } else { - p.Debug(print.ErrorLevel, "configure resource manager client: %v", err) + params.Printer.Debug(print.ErrorLevel, "configure resource manager client: %v", err) } - p.Info("No STACKIT Network Areas found for organization %q\n", orgLabel) + params.Printer.Info("No STACKIT Network Areas found for organization %q\n", orgLabel) return nil } @@ -102,7 +103,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/list/list_test.go b/internal/cmd/network-area/list/list_test.go index 4b71b3dda..d41ae9ad8 100644 --- a/internal/cmd/network-area/list/list_test.go +++ b/internal/cmd/network-area/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -232,7 +233,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreas); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index 98fa25a60..7d81e2358 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -32,7 +33,7 @@ type inputModel struct { NetworkRange *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a network range in a STACKIT Network Area (SNA)", @@ -46,13 +47,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -60,13 +61,13 @@ func NewCmd(p *print.Printer) *cobra.Command { // Get network area label networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a network range for STACKIT Network Area (SNA) %q?", networkAreaLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } - return outputResult(p, model.OutputFormat, networkAreaLabel, networkRange) + return outputResult(params.Printer, model.OutputFormat, networkAreaLabel, networkRange) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/network-range/create/create_test.go b/internal/cmd/network-area/network-range/create/create_test.go index f3eb51bf1..478854cc2 100644 --- a/internal/cmd/network-area/network-range/create/create_test.go +++ b/internal/cmd/network-area/network-range/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -145,7 +146,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.networkRange); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index 4b4ab2eda..4b7397796 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -31,7 +32,7 @@ type inputModel struct { NetworkRangeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", networkRangeIdArg), Short: "Deletes a network range in a STACKIT Network Area (SNA)", @@ -45,27 +46,27 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } else if networkAreaLabel == "" { networkAreaLabel = *model.NetworkAreaId } networkRangeLabel, err := iaasUtils.GetNetworkRangePrefix(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId, model.NetworkRangeId) if err != nil { - p.Debug(print.ErrorLevel, "get network range prefix: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network range prefix: %v", err) networkRangeLabel = model.NetworkRangeId } else if networkRangeLabel == "" { networkRangeLabel = model.NetworkRangeId @@ -73,7 +74,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete network range %q on STACKIT Network Area (SNA) %q?", networkRangeLabel, networkAreaLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete network range: %w", err) } - p.Info("Deleted network range %q on SNA %q\n", networkRangeLabel, networkAreaLabel) + params.Printer.Info("Deleted network range %q on SNA %q\n", networkRangeLabel, networkAreaLabel) return nil }, diff --git a/internal/cmd/network-area/network-range/delete/delete_test.go b/internal/cmd/network-area/network-range/delete/delete_test.go index 5955ea316..5fb112ef6 100644 --- a/internal/cmd/network-area/network-range/delete/delete_test.go +++ b/internal/cmd/network-area/network-range/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -156,7 +157,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index 9f35dc145..45bcfa4e4 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -33,7 +34,7 @@ type inputModel struct { NetworkRangeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", networkRangeIdArg), Short: "Shows details of a network range in a STACKIT Network Area (SNA)", @@ -47,13 +48,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe network range: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/network-range/describe/describe_test.go b/internal/cmd/network-area/network-range/describe/describe_test.go index c03229238..a314d11ee 100644 --- a/internal/cmd/network-area/network-range/describe/describe_test.go +++ b/internal/cmd/network-area/network-range/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -156,7 +157,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -259,7 +260,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkRange); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index b9b11d0e2..aed963ba0 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { NetworkAreaId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all network ranges in a STACKIT Network Area (SNA)", @@ -56,13 +57,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -78,12 +79,12 @@ func NewCmd(p *print.Printer) *cobra.Command { var networkAreaLabel string networkAreaLabel, err = iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get organization name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get organization name: %v", err) networkAreaLabel = *model.NetworkAreaId } else if networkAreaLabel == "" { networkAreaLabel = *model.NetworkAreaId } - p.Info("No network ranges found for SNA %q\n", networkAreaLabel) + params.Printer.Info("No network ranges found for SNA %q\n", networkAreaLabel) return nil } @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/network-range/list/list_test.go b/internal/cmd/network-area/network-range/list/list_test.go index 26efc608c..4e7b52627 100644 --- a/internal/cmd/network-area/network-range/list/list_test.go +++ b/internal/cmd/network-area/network-range/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -140,7 +141,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -242,7 +243,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkRanges); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/network_range.go b/internal/cmd/network-area/network-range/network_range.go index 71c849f17..1c52227a8 100644 --- a/internal/cmd/network-area/network-range/network_range.go +++ b/internal/cmd/network-area/network-range/network_range.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-range", Aliases: []string{"range"}, @@ -21,13 +21,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/network-area/network_area.go b/internal/cmd/network-area/network_area.go index ef12c22a8..0b67ea3ea 100644 --- a/internal/cmd/network-area/network_area.go +++ b/internal/cmd/network-area/network_area.go @@ -8,14 +8,14 @@ import ( networkrange "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-area", Short: "Provides functionality for STACKIT Network Area (SNA)", @@ -23,16 +23,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(networkrange.NewCmd(p)) - cmd.AddCommand(route.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(networkrange.NewCmd(params)) + cmd.AddCommand(route.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 05a881052..56ac716b4 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -36,7 +37,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a static route in a STACKIT Network Area (SNA)", @@ -57,13 +58,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Get network area label networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } else if networkAreaLabel == "" { networkAreaLabel = *model.NetworkAreaId @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a static route for STACKIT Network Area (SNA) %q?", networkAreaLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -101,7 +102,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } - return outputResult(p, model.OutputFormat, networkAreaLabel, route) + return outputResult(params.Printer, model.OutputFormat, networkAreaLabel, route) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/route/create/create_test.go b/internal/cmd/network-area/route/create/create_test.go index 4ffca7666..182555c0c 100644 --- a/internal/cmd/network-area/route/create/create_test.go +++ b/internal/cmd/network-area/route/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -180,7 +181,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -287,7 +288,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.route); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index 144647440..f455786d2 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -31,7 +32,7 @@ type inputModel struct { RouteId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", routeIdArg), Short: "Deletes a static route in a STACKIT Network Area (SNA)", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } else if networkAreaLabel == "" { networkAreaLabel = *model.NetworkAreaId @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete static route %q on STACKIT Network Area (SNA) %q?", model.RouteId, networkAreaLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete static route: %w", err) } - p.Info("Deleted static route %q on SNA %q\n", model.RouteId, networkAreaLabel) + params.Printer.Info("Deleted static route %q on SNA %q\n", model.RouteId, networkAreaLabel) return nil }, } diff --git a/internal/cmd/network-area/route/delete/delete_test.go b/internal/cmd/network-area/route/delete/delete_test.go index 8a63e08c7..0358eba8c 100644 --- a/internal/cmd/network-area/route/delete/delete_test.go +++ b/internal/cmd/network-area/route/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -156,7 +157,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index 8708f12e1..8e48f1ee6 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -34,7 +35,7 @@ type inputModel struct { RouteId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", routeIdArg), Short: "Shows details of a static route in a STACKIT Network Area (SNA)", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe static route: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/route/describe/describe_test.go b/internal/cmd/network-area/route/describe/describe_test.go index d052d69f9..0c674de81 100644 --- a/internal/cmd/network-area/route/describe/describe_test.go +++ b/internal/cmd/network-area/route/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -156,7 +157,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -259,7 +260,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.route); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index f8bada766..f8159617b 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { NetworkAreaId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all static routes in a STACKIT Network Area (SNA)", @@ -55,13 +56,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,12 +78,12 @@ func NewCmd(p *print.Printer) *cobra.Command { var networkAreaLabel string networkAreaLabel, err = iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } else if networkAreaLabel == "" { networkAreaLabel = *model.NetworkAreaId } - p.Info("No static routes found for STACKIT Network Area %q\n", networkAreaLabel) + params.Printer.Info("No static routes found for STACKIT Network Area %q\n", networkAreaLabel) return nil } @@ -92,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/route/list/list_test.go b/internal/cmd/network-area/route/list/list_test.go index 573b332a8..2d66bad9f 100644 --- a/internal/cmd/network-area/route/list/list_test.go +++ b/internal/cmd/network-area/route/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -140,7 +141,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -242,7 +243,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.routes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/routes.go b/internal/cmd/network-area/route/routes.go index 20fa115dd..1769f349e 100644 --- a/internal/cmd/network-area/route/routes.go +++ b/internal/cmd/network-area/route/routes.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "route", Short: "Provides functionality for static routes in STACKIT Network Areas", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index b97c9b44d..ab4c8c860 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", routeIdArg), Short: "Updates a static route in a STACKIT Network Area (SNA)", @@ -53,13 +54,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Get network area label networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId) if err != nil { - p.Debug(print.ErrorLevel, "get network area name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } else if networkAreaLabel == "" { networkAreaLabel = *model.NetworkAreaId @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create static route: %w", err) } - return outputResult(p, model.OutputFormat, networkAreaLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, networkAreaLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/route/update/update_test.go b/internal/cmd/network-area/route/update/update_test.go index 813deae4d..03bdf6da2 100644 --- a/internal/cmd/network-area/route/update/update_test.go +++ b/internal/cmd/network-area/route/update/update_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -189,7 +190,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -293,7 +294,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.route); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 3a0c4f6f7..7e9615aff 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -45,7 +46,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", areaIdArg), Short: "Updates a STACKIT Network Area (SNA)", @@ -59,34 +60,34 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } var orgLabel string - rmApiClient, err := rmClient.ConfigureClient(p) + rmApiClient, err := rmClient.ConfigureClient(params.Printer) if err == nil { orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) if err != nil { - p.Debug(print.ErrorLevel, "get organization name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get organization name: %v", err) orgLabel = *model.OrganizationId } else if orgLabel == "" { orgLabel = *model.OrganizationId } } else { - p.Debug(print.ErrorLevel, "configure resource manager client: %v", err) + params.Printer.Debug(print.ErrorLevel, "configure resource manager client: %v", err) } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update a network area for organization %q?", orgLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -99,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update network area: %w", err) } - return outputResult(p, model.OutputFormat, orgLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, orgLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-area/update/update_test.go b/internal/cmd/network-area/update/update_test.go index 807ec124f..f25018286 100644 --- a/internal/cmd/network-area/update/update_test.go +++ b/internal/cmd/network-area/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -206,7 +207,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -310,7 +311,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.networkArea); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index a14e57b1e..08a8c7cac 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -49,7 +50,7 @@ type inputModel struct { SecurityGroups *[]string // = 36 characters + regex ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a network interface", @@ -67,20 +68,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a network interface for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -101,7 +102,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create network interface: %w", err) } - return outputResult(p, model.OutputFormat, model.ProjectId, resp) + return outputResult(params.Printer, model.OutputFormat, model.ProjectId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-interface/create/create_test.go b/internal/cmd/network-interface/create/create_test.go index 843b15f69..f05ed584e 100644 --- a/internal/cmd/network-interface/create/create_test.go +++ b/internal/cmd/network-interface/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -190,7 +191,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -286,7 +287,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectId, tt.args.nic); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index 4f2cd3302..925bf29b7 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -27,7 +28,7 @@ type inputModel struct { NicId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", nicIdArg), Short: "Deletes a network interface", @@ -41,20 +42,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete the network interface %q? (This cannot be undone)", model.NicId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete network interface: %w", err) } - p.Info("Deleted network interface %q\n", model.NicId) + params.Printer.Info("Deleted network interface %q\n", model.NicId) return nil }, diff --git a/internal/cmd/network-interface/delete/delete_test.go b/internal/cmd/network-interface/delete/delete_test.go index 4b9fdd56b..ac03d45f6 100644 --- a/internal/cmd/network-interface/delete/delete_test.go +++ b/internal/cmd/network-interface/delete/delete_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -122,7 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index 89b04b9b3..aba9ed65a 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { NicId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", nicIdArg), Short: "Describes a network interface", @@ -54,13 +55,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe network interface: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-interface/describe/describe_test.go b/internal/cmd/network-interface/describe/describe_test.go index 967057b02..24163ac87 100644 --- a/internal/cmd/network-interface/describe/describe_test.go +++ b/internal/cmd/network-interface/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -122,7 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -225,7 +226,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.nic); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index 3164f956b..e7282358f 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { NetworkId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all network interfaces of a network", @@ -59,13 +60,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -80,12 +81,12 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, *model.NetworkId) if err != nil { - p.Debug(print.ErrorLevel, "get network name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId } else if networkLabel == "" { networkLabel = *model.NetworkId } - p.Info("No network interfaces found for network %q\n", networkLabel) + params.Printer.Info("No network interfaces found for network %q\n", networkLabel) return nil } @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/network-interface/list/list_test.go b/internal/cmd/network-interface/list/list_test.go index 97610156a..3e976c5db 100644 --- a/internal/cmd/network-interface/list/list_test.go +++ b/internal/cmd/network-interface/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -135,7 +136,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -223,7 +224,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.nics); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/network-interface.go b/internal/cmd/network-interface/network-interface.go index cada28596..f9bbca3fe 100644 --- a/internal/cmd/network-interface/network-interface.go +++ b/internal/cmd/network-interface/network-interface.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-interface", Short: "Provides functionality for network interfaces", @@ -20,14 +20,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 777f2f4b4..9cf746745 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -47,7 +48,7 @@ type inputModel struct { SecurityGroups *[]string // = 36 characters + regex ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", nicIdArg), Short: "Updates a network interface", @@ -69,20 +70,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update the network interface %q?", model.NicId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update network interface: %w", err) } - return outputResult(p, model.OutputFormat, model.ProjectId, resp) + return outputResult(params.Printer, model.OutputFormat, model.ProjectId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network-interface/update/update_test.go b/internal/cmd/network-interface/update/update_test.go index 98987b829..03faa73ad 100644 --- a/internal/cmd/network-interface/update/update_test.go +++ b/internal/cmd/network-interface/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -213,7 +214,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -317,7 +318,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectId, tt.args.nic); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index b89f54f49..339025b74 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a network", @@ -89,20 +90,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -110,7 +111,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a network for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -126,7 +127,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating network") _, err = wait.CreateNetworkWaitHandler(ctx, apiClient, model.ProjectId, networkId).WaitWithContext(ctx) if err != nil { @@ -135,7 +136,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/network/create/create_test.go b/internal/cmd/network/create/create_test.go index 19edc1d40..63c6a3635 100644 --- a/internal/cmd/network/create/create_test.go +++ b/internal/cmd/network/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -258,7 +259,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -467,7 +468,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.network); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index c1608151e..a0adcb6d0 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { NetworkId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", networkIdArg), Short: "Deletes a network", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.NetworkId) if err != nil { - p.Debug(print.ErrorLevel, "get network name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId } else if networkLabel == "" { networkLabel = model.NetworkId @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete network %q?", networkLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting network") _, err = wait.DeleteNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.NetworkId).WaitWithContext(ctx) if err != nil { @@ -94,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s network %q\n", operationState, networkLabel) + params.Printer.Info("%s network %q\n", operationState, networkLabel) return nil }, } diff --git a/internal/cmd/network/delete/delete_test.go b/internal/cmd/network/delete/delete_test.go index 726364502..630a0f3fb 100644 --- a/internal/cmd/network/delete/delete_test.go +++ b/internal/cmd/network/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index 13eb11133..129c52899 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { NetworkId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", networkIdArg), Short: "Shows details of a network", @@ -47,13 +48,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read network: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/network/describe/describe_test.go b/internal/cmd/network/describe/describe_test.go index 451b518b3..9c3b62d35 100644 --- a/internal/cmd/network/describe/describe_test.go +++ b/internal/cmd/network/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.network); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index 8b5577685..90e6efa0e 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all networks of a project", @@ -58,13 +59,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,14 +78,14 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId } - p.Info("No networks found for project %q\n", projectLabel) + params.Printer.Info("No networks found for project %q\n", projectLabel) return nil } @@ -94,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/network/list/list_test.go b/internal/cmd/network/list/list_test.go index 9bc47dfb5..c0f1ac4c3 100644 --- a/internal/cmd/network/list/list_test.go +++ b/internal/cmd/network/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -132,7 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -229,7 +230,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networks); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/network.go b/internal/cmd/network/network.go index b95a496c7..5fbd7e77b 100644 --- a/internal/cmd/network/network.go +++ b/internal/cmd/network/network.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network", Short: "Provides functionality for networks", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 50be6c698..1b331a802 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -46,7 +47,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", networkIdArg), Short: "Updates a network", @@ -72,20 +73,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.NetworkId) if err != nil { - p.Debug(print.ErrorLevel, "get network name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId } else if networkLabel == "" { networkLabel = model.NetworkId @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update network %q?", networkLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -109,7 +110,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating network") _, err = wait.UpdateNetworkWaitHandler(ctx, apiClient, model.ProjectId, networkId).WaitWithContext(ctx) if err != nil { @@ -122,7 +123,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s network %q\n", operationState, networkLabel) + params.Printer.Info("%s network %q\n", operationState, networkLabel) return nil }, } diff --git a/internal/cmd/network/update/update_test.go b/internal/cmd/network/update/update_test.go index 7a1b243c5..d05624840 100644 --- a/internal/cmd/network/update/update_test.go +++ b/internal/cmd/network/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -241,7 +242,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/object-storage/bucket/bucket.go b/internal/cmd/object-storage/bucket/bucket.go index 701fc0934..62d928e54 100644 --- a/internal/cmd/object-storage/bucket/bucket.go +++ b/internal/cmd/object-storage/bucket/bucket.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "bucket", Short: "Provides functionality for Object Storage buckets", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index e96a4206c..f4337d7e3 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { BucketName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", bucketNameArg), Short: "Creates an Object Storage bucket", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create bucket %q? (This cannot be undone)", model.BucketName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating bucket") _, err = wait.CreateBucketWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) if err != nil { @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, model.BucketName, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, model.BucketName, resp) }, } return cmd diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index 49a089342..344c228d5 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.bucketName, tt.args.createBucketResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index 1c6edbf90..0b4174f47 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { BucketName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", bucketNameArg), Short: "Deletes an Object Storage bucket", @@ -39,20 +40,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete bucket %q? (This cannot be undone)", model.BucketName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting bucket") _, err = wait.DeleteBucketWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) if err != nil { @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s bucket %q\n", operationState, model.BucketName) + params.Printer.Info("%s bucket %q\n", operationState, model.BucketName) return nil }, } diff --git a/internal/cmd/object-storage/bucket/delete/delete_test.go b/internal/cmd/object-storage/bucket/delete/delete_test.go index be5bd0028..6e06d4adc 100644 --- a/internal/cmd/object-storage/bucket/delete/delete_test.go +++ b/internal/cmd/object-storage/bucket/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index 23a9e7011..c1fd344d6 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { BucketName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", bucketNameArg), Short: "Shows details of an Object Storage bucket", @@ -44,12 +45,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -61,7 +62,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read Object Storage bucket: %w", err) } - return outputResult(p, model.OutputFormat, resp.Bucket) + return outputResult(params.Printer, model.OutputFormat, resp.Bucket) }, } return cmd diff --git a/internal/cmd/object-storage/bucket/describe/describe_test.go b/internal/cmd/object-storage/bucket/describe/describe_test.go index d233fc17f..9e376132d 100644 --- a/internal/cmd/object-storage/bucket/describe/describe_test.go +++ b/internal/cmd/object-storage/bucket/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -239,7 +240,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.bucket); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index 19466184b..cbfa41574 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Object Storage buckets", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,12 +67,12 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get Object Storage buckets: %w", err) } if resp.Buckets == nil || len(*resp.Buckets) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No buckets found for project %s\n", projectLabel) + params.Printer.Info("No buckets found for project %s\n", projectLabel) return nil } buckets := *resp.Buckets @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { buckets = buckets[:*model.Limit] } - return outputResult(p, model.OutputFormat, buckets) + return outputResult(params.Printer, model.OutputFormat, buckets) }, } diff --git a/internal/cmd/object-storage/bucket/list/list_test.go b/internal/cmd/object-storage/bucket/list/list_test.go index 31664679f..eb50f0ca7 100644 --- a/internal/cmd/object-storage/bucket/list/list_test.go +++ b/internal/cmd/object-storage/bucket/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -215,7 +216,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.buckets); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index 55530ccc7..02dfba938 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { CredentialsGroupName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a credentials group to hold Object Storage access credentials", @@ -41,20 +42,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a credentials group with name %q?", model.CredentialsGroupName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Object Storage credentials group: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/object-storage/credentials-group/create/create_test.go b/internal/cmd/object-storage/credentials-group/create/create_test.go index 60dd53fbd..f23487603 100644 --- a/internal/cmd/object-storage/credentials-group/create/create_test.go +++ b/internal/cmd/object-storage/credentials-group/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -122,7 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -226,7 +227,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.createCredentialsGroupResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials-group/credentials_group.go b/internal/cmd/object-storage/credentials-group/credentials_group.go index 0803796f4..9b9d05129 100644 --- a/internal/cmd/object-storage/credentials-group/credentials_group.go +++ b/internal/cmd/object-storage/credentials-group/credentials_group.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group/create" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials-group", Short: "Provides functionality for Object Storage credentials group", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/object-storage/credentials-group/delete/delete.go b/internal/cmd/object-storage/credentials-group/delete/delete.go index 27dda8460..11457da96 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { CredentialsGroupId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsGroupIdArg), Short: "Deletes a credentials group that holds Object Storage access credentials", @@ -39,26 +40,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get credentials group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials group %q? (This cannot be undone)", credentialsGroupLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Object Storage credentials group: %w", err) } - p.Info("Deleted credentials group %q\n", credentialsGroupLabel) + params.Printer.Info("Deleted credentials group %q\n", credentialsGroupLabel) return nil }, } diff --git a/internal/cmd/object-storage/credentials-group/delete/delete_test.go b/internal/cmd/object-storage/credentials-group/delete/delete_test.go index 1711bd33c..a5097a0b7 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index 876392113..e239167b0 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials groups that hold Object Storage access credentials", @@ -47,13 +48,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } credentialsGroups := *resp.CredentialsGroups if len(credentialsGroups) == 0 { - p.Info("No credentials groups found for your project") + params.Printer.Info("No credentials groups found for your project") return nil } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentialsGroups) > int(*model.Limit) { credentialsGroups = credentialsGroups[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentialsGroups) + return outputResult(params.Printer, model.OutputFormat, credentialsGroups) }, } configureFlags(cmd) diff --git a/internal/cmd/object-storage/credentials-group/list/list_test.go b/internal/cmd/object-storage/credentials-group/list/list_test.go index 2a7ee01ff..b0570483b 100644 --- a/internal/cmd/object-storage/credentials-group/list/list_test.go +++ b/internal/cmd/object-storage/credentials-group/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -117,7 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -219,7 +220,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentialsGroups); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index 71c854dd3..bce332f93 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { HidePassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for an Object Storage credentials group", @@ -49,26 +50,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get credentials group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials in group %q?", credentialsGroupLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Object Storage credentials: %w", err) } - return outputResult(p, model.OutputFormat, credentialsGroupLabel, resp) + return outputResult(params.Printer, model.OutputFormat, credentialsGroupLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/object-storage/credentials/create/create_test.go b/internal/cmd/object-storage/credentials/create/create_test.go index 03257beda..c2efbf566 100644 --- a/internal/cmd/object-storage/credentials/create/create_test.go +++ b/internal/cmd/object-storage/credentials/create/create_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -181,7 +182,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -277,7 +278,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentialsGroupLabel, tt.args.createAccessKeyResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials/credentials.go b/internal/cmd/object-storage/credentials/credentials.go index e96b86072..8654a6734 100644 --- a/internal/cmd/object-storage/credentials/credentials.go +++ b/internal/cmd/object-storage/credentials/credentials.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for Object Storage credentials", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index ed7fedb5e..e8cc8a4e3 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of an Object Storage credentials group", @@ -40,32 +41,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get credentials group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId } credentialsLabel, err := objectStorageUtils.GetCredentialsName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.CredentialsId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get credentials name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials name: %v", err) credentialsLabel = model.CredentialsId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %q of credentials group %q? (This cannot be undone)", credentialsLabel, credentialsGroupLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Object Storage credentials: %w", err) } - p.Info("Deleted credentials %q of credentials group %q\n", credentialsLabel, credentialsGroupLabel) + params.Printer.Info("Deleted credentials %q of credentials group %q\n", credentialsLabel, credentialsGroupLabel) return nil }, } diff --git a/internal/cmd/object-storage/credentials/delete/delete_test.go b/internal/cmd/object-storage/credentials/delete/delete_test.go index 09ee7d04b..1ba508df1 100644 --- a/internal/cmd/object-storage/credentials/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -161,7 +162,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index c1a6d63dd..33a41860f 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials for an Object Storage credentials group", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,11 +72,11 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get credentials group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId } - p.Info("No credentials found for credentials group %q\n", credentialsGroupLabel) + params.Printer.Info("No credentials found for credentials group %q\n", credentialsGroupLabel) return nil } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/object-storage/credentials/list/list_test.go b/internal/cmd/object-storage/credentials/list/list_test.go index a50921b69..6f6fb41a3 100644 --- a/internal/cmd/object-storage/credentials/list/list_test.go +++ b/internal/cmd/object-storage/credentials/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -244,7 +245,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index 56e6f940d..0486e90ae 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,7 +21,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables Object Storage for a project", @@ -33,26 +34,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disable Object Storage for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered disablement of" } - p.Info("%s Object Storage for project %q\n", operationState, projectLabel) + params.Printer.Info("%s Object Storage for project %q\n", operationState, projectLabel) return nil }, } diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index cec0d6e7d..00959bcfa 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,7 +21,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables Object Storage for a project", @@ -33,26 +34,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to enable Object Storage for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered enablement of" } - p.Info("%s Object Storage for project %q\n", operationState, projectLabel) + params.Printer.Info("%s Object Storage for project %q\n", operationState, projectLabel) return nil }, } diff --git a/internal/cmd/object-storage/object_storage.go b/internal/cmd/object-storage/object_storage.go index 0ba397592..2adfb7001 100644 --- a/internal/cmd/object-storage/object_storage.go +++ b/internal/cmd/object-storage/object_storage.go @@ -6,14 +6,14 @@ import ( credentialsGroup "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/disable" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/enable" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "object-storage", Short: "Provides functionality for Object Storage", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(bucket.NewCmd(p)) - cmd.AddCommand(disable.NewCmd(p)) - cmd.AddCommand(enable.NewCmd(p)) - cmd.AddCommand(credentialsGroup.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(bucket.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(credentialsGroup.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) } diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index 9852ee352..f968f0a7e 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for an Observability instance.", @@ -44,26 +45,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create credentials for Observability instance: %w", err) } - return outputResult(p, model.OutputFormat, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/observability/credentials/create/create_test.go b/internal/cmd/observability/credentials/create/create_test.go index c261948c7..16fcc439d 100644 --- a/internal/cmd/observability/credentials/create/create_test.go +++ b/internal/cmd/observability/credentials/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/observability" @@ -224,7 +225,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/credentials/credentials.go b/internal/cmd/observability/credentials/credentials.go index fb84cf9d6..c4aa1e396 100644 --- a/internal/cmd/observability/credentials/credentials.go +++ b/internal/cmd/observability/credentials/credentials.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/credentials/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for Observability credentials", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/observability/credentials/delete/delete.go b/internal/cmd/observability/credentials/delete/delete.go index a501b949a..0c85bf2b6 100644 --- a/internal/cmd/observability/credentials/delete/delete.go +++ b/internal/cmd/observability/credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Username string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", usernameArg), Short: "Deletes credentials of an Observability instance", @@ -42,26 +43,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials for username %q of instance %q? (This cannot be undone)", model.Username, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Observability credentials: %w", err) } - p.Info("Deleted credentials for username %q of instance %q\n", model.Username, instanceLabel) + params.Printer.Info("Deleted credentials for username %q of instance %q\n", model.Username, instanceLabel) return nil }, } diff --git a/internal/cmd/observability/credentials/list/list.go b/internal/cmd/observability/credentials/list/list.go index 9c9452832..3bf6bf231 100644 --- a/internal/cmd/observability/credentials/list/list.go +++ b/internal/cmd/observability/credentials/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists the usernames of all credentials for an Observability instance", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,10 +73,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No credentials found for instance %q\n", instanceLabel) + params.Printer.Info("No credentials found for instance %q\n", instanceLabel) return nil } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/observability/credentials/list/list_test.go b/internal/cmd/observability/credentials/list/list_test.go index fa23d5dfe..64d92b12f 100644 --- a/internal/cmd/observability/credentials/list/list_test.go +++ b/internal/cmd/observability/credentials/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -238,7 +239,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 9a364499c..bce33d2a6 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of the Grafana configuration of an Observability instance", @@ -54,13 +55,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get instance: %w", err) } - return outputResult(p, model.OutputFormat, model.ShowPassword, grafanaConfigsResp, instanceResp) + return outputResult(params.Printer, model.OutputFormat, model.ShowPassword, grafanaConfigsResp, instanceResp) }, } configureFlags(cmd) diff --git a/internal/cmd/observability/grafana/describe/describe_test.go b/internal/cmd/observability/grafana/describe/describe_test.go index f282c2964..d84af41cb 100644 --- a/internal/cmd/observability/grafana/describe/describe_test.go +++ b/internal/cmd/observability/grafana/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -169,7 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -322,7 +323,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.grafanaConfig, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/grafana/grafana.go b/internal/cmd/observability/grafana/grafana.go index e9ad230d1..000da5eac 100644 --- a/internal/cmd/observability/grafana/grafana.go +++ b/internal/cmd/observability/grafana/grafana.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/describe" publicreadaccess "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/public-read-access" singlesignon "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/single-sign-on" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "grafana", Short: "Provides functionality for the Grafana configuration of Observability instances", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(publicreadaccess.NewCmd(p)) - cmd.AddCommand(singlesignon.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(publicreadaccess.NewCmd(params)) + cmd.AddCommand(singlesignon.NewCmd(params)) } diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index ac6cd80a4..0f122fc96 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disable %s", instanceIdArg), Short: "Disables public read access for Grafana on Observability instances", @@ -42,13 +43,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -60,7 +61,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disable Grafana public read access for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disable grafana public read access: %w", err) } - p.Info("Disabled Grafana public read access for instance %q\n", instanceLabel) + params.Printer.Info("Disabled Grafana public read access for instance %q\n", instanceLabel) return nil }, } diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go index 7e08ac647..a8db1bd9d 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -186,7 +187,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index 9296a1f24..a13ae2c08 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("enable %s", instanceIdArg), Short: "Enables public read access for Grafana on Observability instances", @@ -42,13 +43,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -60,7 +61,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to enable Grafana public read access for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("enable grafana public read access: %w", err) } - p.Info("Enabled Grafana public read access for instance %q\n", instanceLabel) + params.Printer.Info("Enabled Grafana public read access for instance %q\n", instanceLabel) return nil }, } diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go index 57ebc5bc3..d425e7078 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -186,7 +187,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/observability/grafana/public-read-access/public_read_access.go b/internal/cmd/observability/grafana/public-read-access/public_read_access.go index 8844e1279..94c27eb36 100644 --- a/internal/cmd/observability/grafana/public-read-access/public_read_access.go +++ b/internal/cmd/observability/grafana/public-read-access/public_read_access.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/public-read-access/disable" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/public-read-access/enable" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "public-read-access", Short: "Enable or disable public read access for Grafana in Observability instances", @@ -23,11 +23,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(enable.NewCmd(p)) - cmd.AddCommand(disable.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) } diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index 018d7827d..14084d154 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disable %s", instanceIdArg), Short: "Disables single sign-on for Grafana on Observability instances", @@ -42,13 +43,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -60,7 +61,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disable single sign-on for Grafana for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disable single sign-on for grafana: %w", err) } - p.Info("Disabled single sign-on for Grafana for instance %q\n", instanceLabel) + params.Printer.Info("Disabled single sign-on for Grafana for instance %q\n", instanceLabel) return nil }, } diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go index 79653608e..53c087352 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -186,7 +187,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go index 9a002b9f9..9956ebd9b 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("enable %s", instanceIdArg), Short: "Enables single sign-on for Grafana on Observability instances", @@ -42,13 +43,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -60,7 +61,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to enable single sign-on for Grafana for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("enable single sign-on for grafana: %w", err) } - p.Info("Enabled single sign-on for Grafana for instance %q\n", instanceLabel) + params.Printer.Info("Enabled single sign-on for Grafana for instance %q\n", instanceLabel) return nil }, } diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go index e59f23828..cdc464409 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" @@ -186,7 +187,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go b/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go index c53c4a5cf..c4a73ada2 100644 --- a/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go +++ b/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/single-sign-on/disable" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/single-sign-on/enable" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "single-sign-on", Aliases: []string{"sso"}, @@ -24,11 +24,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(enable.NewCmd(p)) - cmd.AddCommand(disable.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) } diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 57e9d888f..5158941e5 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an Observability instance", @@ -54,26 +55,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create an Observability instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -96,7 +97,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) if err != nil { @@ -105,7 +106,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/observability/instance/create/create_test.go b/internal/cmd/observability/instance/create/create_test.go index f36d5ae8a..6cdeda809 100644 --- a/internal/cmd/observability/instance/create/create_test.go +++ b/internal/cmd/observability/instance/create/create_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -175,7 +176,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -361,7 +362,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index abe93e2a0..eb1790ebd 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes an Observability instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.InstanceId, model.ProjectId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/observability/instance/delete/delete_test.go b/internal/cmd/observability/instance/delete/delete_test.go index 8375214bb..d8432900f 100644 --- a/internal/cmd/observability/instance/delete/delete_test.go +++ b/internal/cmd/observability/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index 157bd28a4..7e03dbb03 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of an Observability instance", @@ -44,12 +45,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -61,7 +62,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read Observability instance: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/observability/instance/describe/describe_test.go b/internal/cmd/observability/instance/describe/describe_test.go index c55020fa7..62f60d451 100644 --- a/internal/cmd/observability/instance/describe/describe_test.go +++ b/internal/cmd/observability/instance/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/instance/instance.go b/internal/cmd/observability/instance/instance.go index efd7d4974..47a84edf6 100644 --- a/internal/cmd/observability/instance/instance.go +++ b/internal/cmd/observability/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for Observability instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index b540bee32..e82c2254b 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Observability instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/observability/instance/list/list_test.go b/internal/cmd/observability/instance/list/list_test.go index e8a87f48a..33157c100 100644 --- a/internal/cmd/observability/instance/list/list_test.go +++ b/internal/cmd/observability/instance/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -217,7 +218,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index 192c84366..90411dd26 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates an Observability instance", @@ -57,26 +58,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil || instanceLabel == "" { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.UpdateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) if err != nil { @@ -113,7 +114,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/observability/instance/update/update_test.go b/internal/cmd/observability/instance/update/update_test.go index 0b5177b27..fd798093c 100644 --- a/internal/cmd/observability/instance/update/update_test.go +++ b/internal/cmd/observability/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -240,7 +241,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/observability/observability.go b/internal/cmd/observability/observability.go index 8737a716e..136f29637 100644 --- a/internal/cmd/observability/observability.go +++ b/internal/cmd/observability/observability.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/plans" scrapeconfig "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "observability", Short: "Provides functionality for Observability", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(grafana.NewCmd(p)) - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) - cmd.AddCommand(scrapeconfig.NewCmd(p)) - cmd.AddCommand(plans.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(grafana.NewCmd(params)) + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) + cmd.AddCommand(scrapeconfig.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) } diff --git a/internal/cmd/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index d42cfb8a0..90867c27a 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all Observability service plans", @@ -49,13 +50,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,12 +69,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } plans := *resp.Plans if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No plans found for project %q\n", projectLabel) + params.Printer.Info("No plans found for project %q\n", projectLabel) return nil } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(p, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, plans) }, } diff --git a/internal/cmd/observability/plans/plans_test.go b/internal/cmd/observability/plans/plans_test.go index 047c3c5f6..2228a0402 100644 --- a/internal/cmd/observability/plans/plans_test.go +++ b/internal/cmd/observability/plans/plans_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index 0856e6b19..9bd89d9d7 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Payload *observability.CreateScrapeConfigPayload } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a scrape configuration for an Observability instance", @@ -61,20 +62,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } @@ -89,7 +90,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create scrape configuration %q on Observability instance %q?", *model.Payload.JobName, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -106,7 +107,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating scrape config") _, err = wait.CreateScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, *jobName, model.ProjectId).WaitWithContext(ctx) if err != nil { @@ -119,7 +120,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered creation of" } - p.Outputf("%s scrape configuration with name %q for Observability instance %q\n", operationState, utils.PtrString(jobName), instanceLabel) + params.Printer.Outputf("%s scrape configuration with name %q for Observability instance %q\n", operationState, utils.PtrString(jobName), instanceLabel) return nil }, } diff --git a/internal/cmd/observability/scrape-config/delete/delete.go b/internal/cmd/observability/scrape-config/delete/delete.go index de04c6fcc..0bc137b3b 100644 --- a/internal/cmd/observability/scrape-config/delete/delete.go +++ b/internal/cmd/observability/scrape-config/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", jobNameArg), Short: "Deletes a scrape configuration from an Observability instance", @@ -44,26 +45,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete scrape configuration %q on Observability instance %q? (This cannot be undone)", model.JobName, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting scrape config") _, err = wait.DeleteScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, model.JobName, model.ProjectId).WaitWithContext(ctx) if err != nil { @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s scrape configuration with name %q for Observability instance %q\n", operationState, model.JobName, instanceLabel) + params.Printer.Info("%s scrape configuration with name %q for Observability instance %q\n", operationState, model.JobName, instanceLabel) return nil }, } diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 2687a72a3..2c6e24573 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", jobNameArg), Short: "Shows details of a scrape configuration from an Observability instance", @@ -48,12 +49,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read scrape configuration: %w", err) } - return outputResult(p, model.OutputFormat, resp.Data) + return outputResult(params.Printer, model.OutputFormat, resp.Data) }, } configureFlags(cmd) diff --git a/internal/cmd/observability/scrape-config/describe/describe_test.go b/internal/cmd/observability/scrape-config/describe/describe_test.go index a0cf31413..d975ba82c 100644 --- a/internal/cmd/observability/scrape-config/describe/describe_test.go +++ b/internal/cmd/observability/scrape-config/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -257,7 +258,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.config); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go index fe8a9f5ec..3a1927114 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" @@ -31,7 +32,7 @@ type inputModel struct { FilePath *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "generate-payload", Short: "Generates a payload to create/update scrape configurations for an Observability instance ", @@ -61,20 +62,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if model.JobName == nil { createPayload := observabilityUtils.DefaultCreateScrapeConfigPayload - return outputCreateResult(p, model.FilePath, &createPayload) + return outputCreateResult(params.Printer, model.FilePath, &createPayload) } req := buildRequest(ctx, model, apiClient) @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("map update scrape config payloads: %w", err) } - return outputUpdateResult(p, model.FilePath, payload) + return outputUpdateResult(params.Printer, model.FilePath, payload) }, } configureFlags(cmd) diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go index b8740da53..e9a3a076b 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -274,7 +275,7 @@ func TestOutputCreateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputCreateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { @@ -308,7 +309,7 @@ func TestOutputUpdateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputUpdateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/list/list.go b/internal/cmd/observability/scrape-config/list/list.go index 5dbdde095..b03ec740b 100644 --- a/internal/cmd/observability/scrape-config/list/list.go +++ b/internal/cmd/observability/scrape-config/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all scrape configurations of an Observability instance", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -73,10 +74,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(configs) == 0 { instanceLabel, err := observabilityUtils.GetInstanceName(ctx, apiClient, model.InstanceId, model.ProjectId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No scrape configurations found for instance %q\n", instanceLabel) + params.Printer.Info("No scrape configurations found for instance %q\n", instanceLabel) return nil } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { configs = configs[:*model.Limit] } - return outputResult(p, model.OutputFormat, configs) + return outputResult(params.Printer, model.OutputFormat, configs) }, } diff --git a/internal/cmd/observability/scrape-config/list/list_test.go b/internal/cmd/observability/scrape-config/list/list_test.go index 69e5b6ab5..35e53001b 100644 --- a/internal/cmd/observability/scrape-config/list/list_test.go +++ b/internal/cmd/observability/scrape-config/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.configs); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/scrape_config.go b/internal/cmd/observability/scrape-config/scrape_config.go index f056c6e60..d0934ff3b 100644 --- a/internal/cmd/observability/scrape-config/scrape_config.go +++ b/internal/cmd/observability/scrape-config/scrape_config.go @@ -7,14 +7,14 @@ import ( generatepayload "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config/generate-payload" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config/list" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "scrape-config", Short: "Provides functionality for scrape configurations in Observability", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(generatepayload.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(generatepayload.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } diff --git a/internal/cmd/observability/scrape-config/update/update.go b/internal/cmd/observability/scrape-config/update/update.go index d07e97e1b..25b423452 100644 --- a/internal/cmd/observability/scrape-config/update/update.go +++ b/internal/cmd/observability/scrape-config/update/update.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Payload observability.UpdateScrapeConfigPayload } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", jobNameArg), Short: "Updates a scrape configuration of an Observability instance", @@ -56,20 +57,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update scrape configuration %q?", model.JobName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } // The API has no status to wait on, so async mode is default - p.Info("Updated Observability scrape configuration with name %q\n", model.JobName) + params.Printer.Info("Updated Observability scrape configuration with name %q\n", model.JobName) return nil }, } diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index 9a4174db8..ce5a1cf9b 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for an OpenSearch instance", @@ -46,26 +47,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create OpenSearch credentials: %w", err) } - return outputResult(p, model.OutputFormat, model.ShowPassword, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.ShowPassword, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/opensearch/credentials/create/create_test.go b/internal/cmd/opensearch/credentials/create/create_test.go index 1424c9729..6928feefc 100644 --- a/internal/cmd/opensearch/credentials/create/create_test.go +++ b/internal/cmd/opensearch/credentials/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -271,7 +272,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/credentials/credentials.go b/internal/cmd/opensearch/credentials/credentials.go index 4ea7f3f76..3e1c17ba8 100644 --- a/internal/cmd/opensearch/credentials/credentials.go +++ b/internal/cmd/opensearch/credentials/credentials.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for OpenSearch credentials", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/opensearch/credentials/delete/delete.go b/internal/cmd/opensearch/credentials/delete/delete.go index 1931ad0fc..97e2fc14b 100644 --- a/internal/cmd/opensearch/credentials/delete/delete.go +++ b/internal/cmd/opensearch/credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of an OpenSearch instance", @@ -43,32 +44,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } credentialsLabel, err := opensearchUtils.GetCredentialsUsername(ctx, apiClient, model.ProjectId, model.InstanceId, model.CredentialsId) if err != nil { - p.Debug(print.ErrorLevel, "get credentials user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials user name: %v", err) credentialsLabel = model.CredentialsId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete OpenSearch credentials: %w", err) } - p.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) + params.Printer.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/opensearch/credentials/delete/delete_test.go b/internal/cmd/opensearch/credentials/delete/delete_test.go index 4dcdc9dfe..350175fd2 100644 --- a/internal/cmd/opensearch/credentials/delete/delete_test.go +++ b/internal/cmd/opensearch/credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/opensearch/credentials/describe/describe.go b/internal/cmd/opensearch/credentials/describe/describe.go index fb8012012..d70edf933 100644 --- a/internal/cmd/opensearch/credentials/describe/describe.go +++ b/internal/cmd/opensearch/credentials/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of an OpenSearch instance", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe OpenSearch credentials: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/opensearch/credentials/describe/describe_test.go b/internal/cmd/opensearch/credentials/describe/describe_test.go index 3618a4cc7..50ce776b5 100644 --- a/internal/cmd/opensearch/credentials/describe/describe_test.go +++ b/internal/cmd/opensearch/credentials/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index b58c99796..b4d200b1e 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for an OpenSearch instance", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,10 +73,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No credentials found for instance %q\n", instanceLabel) + params.Printer.Info("No credentials found for instance %q\n", instanceLabel) return nil } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/opensearch/credentials/list/list_test.go b/internal/cmd/opensearch/credentials/list/list_test.go index d6b041f57..bfe0ea554 100644 --- a/internal/cmd/opensearch/credentials/list/list_test.go +++ b/internal/cmd/opensearch/credentials/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -239,7 +240,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index 62d447f82..336a2e5ab 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -57,7 +58,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an OpenSearch instance", @@ -76,26 +77,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create an OpenSearch instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -118,7 +119,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -127,7 +128,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, instanceId, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, instanceId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/opensearch/instance/create/create_test.go b/internal/cmd/opensearch/instance/create/create_test.go index 3aceed814..e6028b4d9 100644 --- a/internal/cmd/opensearch/instance/create/create_test.go +++ b/internal/cmd/opensearch/instance/create/create_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -277,7 +278,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -516,7 +517,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/delete/delete.go b/internal/cmd/opensearch/instance/delete/delete.go index 40dc60461..cd7f159d3 100644 --- a/internal/cmd/opensearch/instance/delete/delete.go +++ b/internal/cmd/opensearch/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes an OpenSearch instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/opensearch/instance/delete/delete_test.go b/internal/cmd/opensearch/instance/delete/delete_test.go index 7454c04e0..217ff1b1d 100644 --- a/internal/cmd/opensearch/instance/delete/delete_test.go +++ b/internal/cmd/opensearch/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/opensearch/instance/describe/describe.go b/internal/cmd/opensearch/instance/describe/describe.go index 1358aef39..d8722d9d5 100644 --- a/internal/cmd/opensearch/instance/describe/describe.go +++ b/internal/cmd/opensearch/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of an OpenSearch instance", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read OpenSearch instance: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/opensearch/instance/describe/describe_test.go b/internal/cmd/opensearch/instance/describe/describe_test.go index d4b58656f..6e17a8e85 100644 --- a/internal/cmd/opensearch/instance/describe/describe_test.go +++ b/internal/cmd/opensearch/instance/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/instance.go b/internal/cmd/opensearch/instance/instance.go index 649d439ce..05d92bbc6 100644 --- a/internal/cmd/opensearch/instance/instance.go +++ b/internal/cmd/opensearch/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for OpenSearch instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index 024619beb..0b0aa93c8 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all OpenSearch instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/opensearch/instance/list/list_test.go b/internal/cmd/opensearch/instance/list/list_test.go index baa22ac9f..766115689 100644 --- a/internal/cmd/opensearch/instance/list/list_test.go +++ b/internal/cmd/opensearch/instance/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/update/update.go b/internal/cmd/opensearch/instance/update/update.go index 57072b0a8..85ba3f133 100644 --- a/internal/cmd/opensearch/instance/update/update.go +++ b/internal/cmd/opensearch/instance/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates an OpenSearch instance", @@ -72,26 +73,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -114,7 +115,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -127,7 +128,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/opensearch/instance/update/update_test.go b/internal/cmd/opensearch/instance/update/update_test.go index 478199985..70168bbc2 100644 --- a/internal/cmd/opensearch/instance/update/update_test.go +++ b/internal/cmd/opensearch/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -294,7 +295,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/opensearch/opensearch.go b/internal/cmd/opensearch/opensearch.go index 08103e63c..766065ed2 100644 --- a/internal/cmd/opensearch/opensearch.go +++ b/internal/cmd/opensearch/opensearch.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/plans" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "opensearch", Short: "Provides functionality for OpenSearch", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(plans.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) } diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index 013e486e1..e2678f163 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all OpenSearch service plans", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No plans found for project %q\n", projectLabel) + params.Printer.Info("No plans found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(p, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, plans) }, } diff --git a/internal/cmd/opensearch/plans/plans_test.go b/internal/cmd/opensearch/plans/plans_test.go index a1d162d4a..0b4f95cec 100644 --- a/internal/cmd/opensearch/plans/plans_test.go +++ b/internal/cmd/opensearch/plans/plans_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/organization/member/add/add.go b/internal/cmd/organization/member/add/add.go index b03ae495f..246a7f27f 100644 --- a/internal/cmd/organization/member/add/add.go +++ b/internal/cmd/organization/member/add/add.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -32,7 +33,7 @@ type inputModel struct { Role *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("add %s", subjectArg), Short: "Adds a member to an organization", @@ -51,21 +52,21 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to add the %s role to %s on organization with ID %q?", *model.Role, model.Subject, *model.OrganizationId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("add member: %w", err) } - p.Info("Member added") + params.Printer.Info("Member added") return nil }, } diff --git a/internal/cmd/organization/member/add/add_test.go b/internal/cmd/organization/member/add/add_test.go index 996439285..a98f06ecc 100644 --- a/internal/cmd/organization/member/add/add_test.go +++ b/internal/cmd/organization/member/add/add_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -125,7 +126,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index e3376d584..105f6b14a 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { SortBy string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists members of an organization", @@ -57,13 +58,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } members := *resp.Members if len(members) == 0 { - p.Info("No members found for organization with ID %q\n", *model.OrganizationId) + params.Printer.Info("No members found for organization with ID %q\n", *model.OrganizationId) return nil } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { members = members[:*model.Limit] } - return outputResult(p, model.OutputFormat, model.SortBy, members) + return outputResult(params.Printer, model.OutputFormat, model.SortBy, members) }, } configureFlags(cmd) diff --git a/internal/cmd/organization/member/list/list_test.go b/internal/cmd/organization/member/list/list_test.go index 2c73681c0..ff90898b2 100644 --- a/internal/cmd/organization/member/list/list_test.go +++ b/internal/cmd/organization/member/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -237,7 +238,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.sortBy, tt.args.members); (err != nil) != tt.wantErr { diff --git a/internal/cmd/organization/member/member.go b/internal/cmd/organization/member/member.go index cf7c515d8..fe2b67e5d 100644 --- a/internal/cmd/organization/member/member.go +++ b/internal/cmd/organization/member/member.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member/add" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member/list" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member/remove" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "member", Short: "Manages organization members", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(add.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(remove.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(add.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(remove.NewCmd(params)) } diff --git a/internal/cmd/organization/member/remove/remove.go b/internal/cmd/organization/member/remove/remove.go index de9a09ceb..7ff3c9147 100644 --- a/internal/cmd/organization/member/remove/remove.go +++ b/internal/cmd/organization/member/remove/remove.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -35,7 +36,7 @@ type inputModel struct { Force bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("remove %s", subjectArg), Short: "Removes a member from an organization", @@ -55,13 +56,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Force { prompt = fmt.Sprintf("%s This will also remove other roles of the subject that would stop the removal of the requested role", prompt) } - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("remove member: %w", err) } - p.Info("Member removed") + params.Printer.Info("Member removed") return nil }, } diff --git a/internal/cmd/organization/member/remove/remove_test.go b/internal/cmd/organization/member/remove/remove_test.go index fff1648f8..1b2a3e702 100644 --- a/internal/cmd/organization/member/remove/remove_test.go +++ b/internal/cmd/organization/member/remove/remove_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/organization/organization.go b/internal/cmd/organization/organization.go index 3d34090fd..e7d1376b5 100644 --- a/internal/cmd/organization/organization.go +++ b/internal/cmd/organization/organization.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/role" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "organization", Short: "Manages organizations", @@ -23,11 +23,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(member.NewCmd(p)) - cmd.AddCommand(role.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(member.NewCmd(params)) + cmd.AddCommand(role.NewCmd(params)) } diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index c9e175323..c8925c90e 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists roles and permissions of an organization", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } roles := *resp.Roles if len(roles) == 0 { - p.Info("No roles found for organization with ID %q\n", *model.OrganizationId) + params.Printer.Info("No roles found for organization with ID %q\n", *model.OrganizationId) return nil } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { roles = roles[:*model.Limit] } - return outputRolesResult(p, model.OutputFormat, roles) + return outputRolesResult(params.Printer, model.OutputFormat, roles) }, } configureFlags(cmd) diff --git a/internal/cmd/organization/role/list/list_test.go b/internal/cmd/organization/role/list/list_test.go index 1268fb039..5633b3f60 100644 --- a/internal/cmd/organization/role/list/list_test.go +++ b/internal/cmd/organization/role/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -199,7 +200,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputRolesResult(p, tt.args.outputFormat, tt.args.roles); (err != nil) != tt.wantErr { diff --git a/internal/cmd/organization/role/role.go b/internal/cmd/organization/role/role.go index f32189bf5..286783661 100644 --- a/internal/cmd/organization/role/role.go +++ b/internal/cmd/organization/role/role.go @@ -2,14 +2,14 @@ package role import ( "github.com/stackitcloud/stackit-cli/internal/cmd/organization/role/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "role", Short: "Manages organization roles", @@ -17,10 +17,10 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/params/cmd_params.go b/internal/cmd/params/cmd_params.go new file mode 100644 index 000000000..572c80706 --- /dev/null +++ b/internal/cmd/params/cmd_params.go @@ -0,0 +1,10 @@ +package params + +import ( + "github.com/stackitcloud/stackit-cli/internal/pkg/print" +) + +type CmdParams struct { + Printer *print.Printer + CliVersion string +} diff --git a/internal/cmd/postgresflex/backup/backup.go b/internal/cmd/postgresflex/backup/backup.go index 85b08b5b2..bac6c4a72 100644 --- a/internal/cmd/postgresflex/backup/backup.go +++ b/internal/cmd/postgresflex/backup/backup.go @@ -1,17 +1,17 @@ package backup import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup/list" updateschedule "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup/update-schedule" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for PostgreSQL Flex instance backups", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(updateschedule.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(updateschedule.NewCmd(params)) } diff --git a/internal/cmd/postgresflex/backup/describe/describe.go b/internal/cmd/postgresflex/backup/describe/describe.go index dbb8fe4ce..758fb955a 100644 --- a/internal/cmd/postgresflex/backup/describe/describe.go +++ b/internal/cmd/postgresflex/backup/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { BackupId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Shows details of a backup for a PostgreSQL Flex instance", @@ -53,13 +54,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(backupIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe backup for PostgreSQL Flex instance: %w", err) } - return outputResult(p, model.OutputFormat, *resp.Item) + return outputResult(params.Printer, model.OutputFormat, *resp.Item) }, } configureFlags(cmd) diff --git a/internal/cmd/postgresflex/backup/describe/describe_test.go b/internal/cmd/postgresflex/backup/describe/describe_test.go index 5c3479254..6e47eabb0 100644 --- a/internal/cmd/postgresflex/backup/describe/describe_test.go +++ b/internal/cmd/postgresflex/backup/describe/describe_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -262,7 +263,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/backup/list/list.go b/internal/cmd/postgresflex/backup/list/list.go index 7e1d6c398..3f463a670 100644 --- a/internal/cmd/postgresflex/backup/list/list.go +++ b/internal/cmd/postgresflex/backup/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all backups which are available for a PostgreSQL Flex instance", @@ -57,20 +58,20 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { backups = backups[:*model.Limit] } - return outputResult(p, model.OutputFormat, backups) + return outputResult(params.Printer, model.OutputFormat, backups) }, } diff --git a/internal/cmd/postgresflex/backup/list/list_test.go b/internal/cmd/postgresflex/backup/list/list_test.go index f34d184cf..9dee772fe 100644 --- a/internal/cmd/postgresflex/backup/list/list_test.go +++ b/internal/cmd/postgresflex/backup/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -243,7 +244,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go index 9d5ff6626..a9f3bb70d 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { BackupSchedule *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update-schedule", Short: "Updates backup schedule for a PostgreSQL Flex instance", @@ -43,26 +44,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update backup schedule of instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index 1d753cfeb..b8a31cd4e 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -40,7 +41,7 @@ type inputModel struct { RecoveryDate *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("clone %s", instanceIdArg), Short: "Clones a PostgreSQL Flex instance", @@ -61,26 +62,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to clone instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -99,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Cloning instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) if err != nil { @@ -108,7 +109,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, instanceLabel, instanceId, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, instanceLabel, instanceId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/postgresflex/instance/clone/clone_test.go b/internal/cmd/postgresflex/instance/clone/clone_test.go index eed05d8d3..04dbd1954 100644 --- a/internal/cmd/postgresflex/instance/clone/clone_test.go +++ b/internal/cmd/postgresflex/instance/clone/clone_test.go @@ -9,6 +9,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -302,7 +303,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -553,7 +554,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index 191d982f5..32301a4d4 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -57,7 +58,7 @@ type inputModel struct { Type *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a PostgreSQL Flex instance", @@ -77,26 +78,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a PostgreSQL Flex instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -124,7 +125,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) if err != nil { @@ -133,7 +134,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, instanceId, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, instanceId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/postgresflex/instance/create/create_test.go b/internal/cmd/postgresflex/instance/create/create_test.go index 6adbfb09b..32d63d5d8 100644 --- a/internal/cmd/postgresflex/instance/create/create_test.go +++ b/internal/cmd/postgresflex/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -250,7 +251,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -547,7 +548,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/postgresflex/instance/delete/delete.go b/internal/cmd/postgresflex/instance/delete/delete.go index 4c9077a6a..acf78c5ba 100644 --- a/internal/cmd/postgresflex/instance/delete/delete.go +++ b/internal/cmd/postgresflex/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { ForceDelete bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a PostgreSQL Flex instance", @@ -52,26 +53,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -92,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -112,7 +113,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Forcing deletion of instance") _, err = wait.ForceDeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -132,7 +133,7 @@ func NewCmd(p *print.Printer) *cobra.Command { operationState = "Triggered forced deletion of" } } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/postgresflex/instance/delete/delete_test.go b/internal/cmd/postgresflex/instance/delete/delete_test.go index 23f662a5d..13f33bfbd 100644 --- a/internal/cmd/postgresflex/instance/delete/delete_test.go +++ b/internal/cmd/postgresflex/instance/delete/delete_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -171,7 +172,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/postgresflex/instance/describe/describe.go b/internal/cmd/postgresflex/instance/describe/describe.go index 2d59f5306..13604fb58 100644 --- a/internal/cmd/postgresflex/instance/describe/describe.go +++ b/internal/cmd/postgresflex/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a PostgreSQL Flex instance", @@ -47,12 +48,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read PostgreSQL Flex instance: %w", err) } - return outputResult(p, model.OutputFormat, resp.Item) + return outputResult(params.Printer, model.OutputFormat, resp.Item) }, } return cmd diff --git a/internal/cmd/postgresflex/instance/describe/describe_test.go b/internal/cmd/postgresflex/instance/describe/describe_test.go index c6945faa1..69e100822 100644 --- a/internal/cmd/postgresflex/instance/describe/describe_test.go +++ b/internal/cmd/postgresflex/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -259,7 +260,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/instance/instance.go b/internal/cmd/postgresflex/instance/instance.go index 4a005c13a..f43979195 100644 --- a/internal/cmd/postgresflex/instance/instance.go +++ b/internal/cmd/postgresflex/instance/instance.go @@ -1,6 +1,7 @@ package instance import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/clone" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/delete" @@ -8,13 +9,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for PostgreSQL Flex instances", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(clone.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(clone.NewCmd(params)) } diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index 040a9de6b..d3870566b 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all PostgreSQL Flex instances", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,12 +69,12 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get PostgreSQL Flex instances: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } instances := *resp.Items @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/postgresflex/instance/list/list_test.go b/internal/cmd/postgresflex/instance/list/list_test.go index 09880f92c..3cfc85652 100644 --- a/internal/cmd/postgresflex/instance/list/list_test.go +++ b/internal/cmd/postgresflex/instance/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 66022fb1d..980a358df 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { Type *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a PostgreSQL Flex instance", @@ -71,26 +72,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q? (This may cause downtime)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -109,7 +110,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) if err != nil { @@ -118,7 +119,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/postgresflex/instance/update/update_test.go b/internal/cmd/postgresflex/instance/update/update_test.go index 46b157bbe..0c4ed96b6 100644 --- a/internal/cmd/postgresflex/instance/update/update_test.go +++ b/internal/cmd/postgresflex/instance/update/update_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -282,7 +283,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -620,7 +621,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index 8d53c2017..cbf87326d 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -45,7 +47,7 @@ type flavorStorages struct { Storages *postgresflex.ListStoragesResponse `json:"storages"` } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists PostgreSQL Flex options", @@ -64,19 +66,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } // Call API - err = buildAndExecuteRequest(ctx, p, model, apiClient) + err = buildAndExecuteRequest(ctx, params.Printer, model, apiClient) if err != nil { return fmt.Errorf("get PostgreSQL Flex options: %w", err) } diff --git a/internal/cmd/postgresflex/options/options_test.go b/internal/cmd/postgresflex/options/options_test.go index 3854aeaca..7643dad69 100644 --- a/internal/cmd/postgresflex/options/options_test.go +++ b/internal/cmd/postgresflex/options/options_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -166,7 +167,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -290,7 +291,7 @@ func TestBuildAndExecuteRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := &print.Printer{} - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) p.Cmd = cmd client := &postgresFlexClientMocked{ listFlavorsFails: tt.listFlavorsFails, @@ -360,7 +361,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.flavors, tt.args.versions, tt.args.storages); (err != nil) != tt.wantErr { diff --git a/internal/cmd/postgresflex/postgresflex.go b/internal/cmd/postgresflex/postgresflex.go index 7820cded2..3a86086c2 100644 --- a/internal/cmd/postgresflex/postgresflex.go +++ b/internal/cmd/postgresflex/postgresflex.go @@ -1,18 +1,18 @@ package postgresflex import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/options" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "postgresflex", Aliases: []string{"postgresqlflex"}, @@ -21,13 +21,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(user.NewCmd(p)) - cmd.AddCommand(options.NewCmd(p)) - cmd.AddCommand(backup.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(user.NewCmd(params)) + cmd.AddCommand(options.NewCmd(params)) + cmd.AddCommand(backup.NewCmd(params)) } diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index ce2912e3a..8808e676e 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a PostgreSQL Flex user", @@ -58,26 +59,26 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create PostgreSQL Flex user: %w", err) } - return outputResult(p, model.OutputFormat, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, resp) }, } diff --git a/internal/cmd/postgresflex/user/create/create_test.go b/internal/cmd/postgresflex/user/create/create_test.go index 6c0fe71ba..e75d785e9 100644 --- a/internal/cmd/postgresflex/user/create/create_test.go +++ b/internal/cmd/postgresflex/user/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -258,7 +259,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/delete/delete.go b/internal/cmd/postgresflex/user/delete/delete.go index f9f166291..2ed42cd8f 100644 --- a/internal/cmd/postgresflex/user/delete/delete.go +++ b/internal/cmd/postgresflex/user/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a PostgreSQL Flex user", @@ -47,32 +48,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := postgresflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete PostgreSQL Flex user: %w", err) } - p.Info("Deleted user %q of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Deleted user %q of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/postgresflex/user/delete/delete_test.go b/internal/cmd/postgresflex/user/delete/delete_test.go index cd6dfa986..867635736 100644 --- a/internal/cmd/postgresflex/user/delete/delete_test.go +++ b/internal/cmd/postgresflex/user/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -160,7 +161,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/postgresflex/user/describe/describe.go b/internal/cmd/postgresflex/user/describe/describe.go index cc02a616b..75e239d68 100644 --- a/internal/cmd/postgresflex/user/describe/describe.go +++ b/internal/cmd/postgresflex/user/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a PostgreSQL Flex user", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get MongoDB Flex user: %w", err) } - return outputResult(p, model.OutputFormat, *resp.Item) + return outputResult(params.Printer, model.OutputFormat, *resp.Item) }, } diff --git a/internal/cmd/postgresflex/user/describe/describe_test.go b/internal/cmd/postgresflex/user/describe/describe_test.go index 4ff8819b9..8b91301b7 100644 --- a/internal/cmd/postgresflex/user/describe/describe_test.go +++ b/internal/cmd/postgresflex/user/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" @@ -159,7 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -259,7 +260,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index 0b530674d..3c8f79e77 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all PostgreSQL Flex users of an instance", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,10 +72,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } - p.Info("No users found for instance %q\n", instanceLabel) + params.Printer.Info("No users found for instance %q\n", instanceLabel) return nil } users := *resp.Items @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { users = users[:*model.Limit] } - return outputResult(p, model.OutputFormat, users) + return outputResult(params.Printer, model.OutputFormat, users) }, } diff --git a/internal/cmd/postgresflex/user/list/list_test.go b/internal/cmd/postgresflex/user/list/list_test.go index ed82bbb26..20adc9e13 100644 --- a/internal/cmd/postgresflex/user/list/list_test.go +++ b/internal/cmd/postgresflex/user/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -222,7 +223,7 @@ func Test_outputResult(t *testing.T) { }}}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index d2d240585..0d324a07b 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reset-password %s", userIdArg), Short: "Resets the password of a PostgreSQL Flex user", @@ -48,32 +49,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := postgresflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("reset PostgreSQL Flex user password: %w", err) } - return outputResult(p, model.OutputFormat, userLabel, instanceLabel, user) + return outputResult(params.Printer, model.OutputFormat, userLabel, instanceLabel, user) }, } diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go index 8cde43c41..b12c31d3a 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" @@ -159,7 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -260,7 +261,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/update/update.go b/internal/cmd/postgresflex/user/update/update.go index 47872ecc5..5466348d3 100644 --- a/internal/cmd/postgresflex/user/update/update.go +++ b/internal/cmd/postgresflex/user/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", userIdArg), Short: "Updates a PostgreSQL Flex user", @@ -45,32 +46,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, nil), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := postgresflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := postgresflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update user %q of instance %q?", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update PostgreSQL Flex user: %w", err) } - p.Info("Updated user %q of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Updated user %q of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/postgresflex/user/update/update_test.go b/internal/cmd/postgresflex/user/update/update_test.go index fb0fe9cd3..787dc992d 100644 --- a/internal/cmd/postgresflex/user/update/update_test.go +++ b/internal/cmd/postgresflex/user/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -169,7 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/postgresflex/user/user.go b/internal/cmd/postgresflex/user/user.go index 018244197..af9d371ef 100644 --- a/internal/cmd/postgresflex/user/user.go +++ b/internal/cmd/postgresflex/user/user.go @@ -1,6 +1,7 @@ package user import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/create" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/describe" @@ -8,13 +9,12 @@ import ( resetpassword "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/reset-password" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for PostgreSQL Flex users", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(resetpassword.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(resetpassword.NewCmd(params)) } diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index 99f62fadd..d8c687bbd 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -7,6 +7,7 @@ import ( "regexp" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -41,7 +42,7 @@ type inputModel struct { NetworkAreaId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a STACKIT project", @@ -66,20 +67,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a project under the parent with ID %q?", *model.ParentId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create project: %w", err) } - return outputResult(p, *model, resp) + return outputResult(params.Printer, *model, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/project/create/create_test.go b/internal/cmd/project/create/create_test.go index 8c977d3c6..f6cf9fbde 100644 --- a/internal/cmd/project/create/create_test.go +++ b/internal/cmd/project/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -177,7 +178,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -374,7 +375,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/delete/delete.go b/internal/cmd/project/delete/delete.go index 9b3178bce..c0d4e121e 100644 --- a/internal/cmd/project/delete/delete.go +++ b/internal/cmd/project/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,7 +21,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "delete", Short: "Deletes a STACKIT project", @@ -36,26 +37,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete the project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -68,8 +69,8 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete project: %w", err) } - p.Info("Deleted project %q\n", projectLabel) - p.Warn("%s", fmt.Sprintf("%s\n%s\n", + params.Printer.Info("Deleted project %q\n", projectLabel) + params.Printer.Warn("%s", fmt.Sprintf("%s\n%s\n", "If this was your default project, consider configuring a new project ID by running:", " $ stackit config set --project-id ", )) diff --git a/internal/cmd/project/describe/describe.go b/internal/cmd/project/describe/describe.go index 26162f859..7fe4c7b9b 100644 --- a/internal/cmd/project/describe/describe.go +++ b/internal/cmd/project/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -31,7 +32,7 @@ type inputModel struct { IncludeParents bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "describe", Short: "Shows details of a STACKIT project", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,7 +69,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read project details: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/project/describe/describe_test.go b/internal/cmd/project/describe/describe_test.go index 3c2e5f658..f32dbc491 100644 --- a/internal/cmd/project/describe/describe_test.go +++ b/internal/cmd/project/describe/describe_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -238,7 +239,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.project); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index 4459558ad..c2aaccad5 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -43,7 +44,7 @@ type inputModel struct { PageSize int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists STACKIT projects", @@ -65,13 +66,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -82,11 +83,11 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } if len(projects) == 0 { - p.Info("No projects found matching the criteria\n") + params.Printer.Info("No projects found matching the criteria\n") return nil } - return outputResult(p, model.OutputFormat, projects) + return outputResult(params.Printer, model.OutputFormat, projects) }, } configureFlags(cmd) diff --git a/internal/cmd/project/list/list_test.go b/internal/cmd/project/list/list_test.go index 47db45bac..79397409f 100644 --- a/internal/cmd/project/list/list_test.go +++ b/internal/cmd/project/list/list_test.go @@ -12,6 +12,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -194,7 +195,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -539,7 +540,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/project/member/add/add.go b/internal/cmd/project/member/add/add.go index 23436f039..5f9456602 100644 --- a/internal/cmd/project/member/add/add.go +++ b/internal/cmd/project/member/add/add.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Role *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("add %s", subjectArg), Short: "Adds a member to a project", @@ -52,26 +53,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to add the role %q to %s on project %q?", *model.Role, model.Subject, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("add member: %w", err) } - p.Info("Added the role %q to %s on project %q\n", utils.PtrString(model.Role), model.Subject, projectLabel) + params.Printer.Info("Added the role %q to %s on project %q\n", utils.PtrString(model.Role), model.Subject, projectLabel) return nil }, } diff --git a/internal/cmd/project/member/add/add_test.go b/internal/cmd/project/member/add/add_test.go index e9fc2b4d6..9d24461bf 100644 --- a/internal/cmd/project/member/add/add_test.go +++ b/internal/cmd/project/member/add/add_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -124,7 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index 861423dc5..c7c220121 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { SortBy string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists members of a project", @@ -56,13 +57,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -75,12 +76,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } members := *resp.Members if len(members) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No members found for project %q\n", projectLabel) + params.Printer.Info("No members found for project %q\n", projectLabel) return nil } @@ -89,7 +90,7 @@ func NewCmd(p *print.Printer) *cobra.Command { members = members[:*model.Limit] } - return outputResult(p, *model, members) + return outputResult(params.Printer, *model, members) }, } configureFlags(cmd) diff --git a/internal/cmd/project/member/list/list_test.go b/internal/cmd/project/member/list/list_test.go index 4aecdee12..a710f7b5d 100644 --- a/internal/cmd/project/member/list/list_test.go +++ b/internal/cmd/project/member/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -240,7 +241,7 @@ func Test_outputResult(t *testing.T) { false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.members); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/member/member.go b/internal/cmd/project/member/member.go index 658f6ff7c..cef271820 100644 --- a/internal/cmd/project/member/member.go +++ b/internal/cmd/project/member/member.go @@ -1,17 +1,17 @@ package member import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/project/member/add" "github.com/stackitcloud/stackit-cli/internal/cmd/project/member/list" "github.com/stackitcloud/stackit-cli/internal/cmd/project/member/remove" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "member", Short: "Manages project members", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(add.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(remove.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(add.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(remove.NewCmd(params)) } diff --git a/internal/cmd/project/member/remove/remove.go b/internal/cmd/project/member/remove/remove.go index 56004a03b..9fc60a116 100644 --- a/internal/cmd/project/member/remove/remove.go +++ b/internal/cmd/project/member/remove/remove.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Force bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("remove %s", subjectArg), Short: "Removes a member from a project", @@ -55,20 +56,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Force { prompt = fmt.Sprintf("%s This will also remove other roles of the subject that would stop the removal of the requested role", prompt) } - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("remove member: %w", err) } - p.Info("Removed the role %q from %s on project %q\n", utils.PtrString(model.Role), model.Subject, projectLabel) + params.Printer.Info("Removed the role %q from %s on project %q\n", utils.PtrString(model.Role), model.Subject, projectLabel) return nil }, } diff --git a/internal/cmd/project/member/remove/remove_test.go b/internal/cmd/project/member/remove/remove_test.go index 626efe0d6..c3cb414e1 100644 --- a/internal/cmd/project/member/remove/remove_test.go +++ b/internal/cmd/project/member/remove/remove_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/project/project.go b/internal/cmd/project/project.go index ded8f8444..f888fbbc5 100644 --- a/internal/cmd/project/project.go +++ b/internal/cmd/project/project.go @@ -3,6 +3,7 @@ package project import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/project/create" "github.com/stackitcloud/stackit-cli/internal/cmd/project/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/project/describe" @@ -11,13 +12,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/project/role" "github.com/stackitcloud/stackit-cli/internal/cmd/project/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "project", Short: "Manages projects", @@ -28,16 +28,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(member.NewCmd(p)) - cmd.AddCommand(role.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(member.NewCmd(params)) + cmd.AddCommand(role.NewCmd(params)) } diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index 4b98bf977..9ffd80067 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists roles and permissions of a project", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -70,12 +71,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } roles := *resp.Roles if len(roles) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No roles found for project %q\n", projectLabel) + params.Printer.Info("No roles found for project %q\n", projectLabel) return nil } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { roles = roles[:*model.Limit] } - return outputRolesResult(p, model.OutputFormat, roles) + return outputRolesResult(params.Printer, model.OutputFormat, roles) }, } configureFlags(cmd) diff --git a/internal/cmd/project/role/list/list_test.go b/internal/cmd/project/role/list/list_test.go index 4e8744528..b1f14f432 100644 --- a/internal/cmd/project/role/list/list_test.go +++ b/internal/cmd/project/role/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -196,7 +197,7 @@ func Test_outputRolesResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputRolesResult(p, tt.args.outputFormat, tt.args.roles); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/role/role.go b/internal/cmd/project/role/role.go index b460e54b7..bb0781f08 100644 --- a/internal/cmd/project/role/role.go +++ b/internal/cmd/project/role/role.go @@ -1,15 +1,15 @@ package role import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/project/role/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "role", Short: "Manages project roles", @@ -17,10 +17,10 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/project/update/update.go b/internal/cmd/project/update/update.go index ea91ccdae..e217f55f5 100644 --- a/internal/cmd/project/update/update.go +++ b/internal/cmd/project/update/update.go @@ -5,6 +5,7 @@ import ( "fmt" "regexp" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates a STACKIT project", @@ -55,26 +56,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update project: %w", err) } - p.Info("Updated project %q\n", projectLabel) + params.Printer.Info("Updated project %q\n", projectLabel) return nil }, } diff --git a/internal/cmd/project/update/update_test.go b/internal/cmd/project/update/update_test.go index 836110963..289a3b752 100644 --- a/internal/cmd/project/update/update_test.go +++ b/internal/cmd/project/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -131,7 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index 9ce91a954..369efc526 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { AssociatedResourceId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("associate %s", publicIpIdArg), Short: "Associates a Public IP with a network interface or a virtual IP", @@ -44,20 +45,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { - p.Debug(print.ErrorLevel, "get public IP: %v", err) + params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to associate public IP %q with resource %v?", publicIpLabel, *model.AssociatedResourceId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("associate public IP: %w", err) } - p.Outputf("Associated public IP %q with resource %v.\n", publicIpLabel, utils.PtrString(resp.GetNetworkInterface())) + params.Printer.Outputf("Associated public IP %q with resource %v.\n", publicIpLabel, utils.PtrString(resp.GetNetworkInterface())) return nil }, } diff --git a/internal/cmd/public-ip/associate/associate_test.go b/internal/cmd/public-ip/associate/associate_test.go index 99b51c3e6..bc2b890e7 100644 --- a/internal/cmd/public-ip/associate/associate_test.go +++ b/internal/cmd/public-ip/associate/associate_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 0ba5c6a84..e072655db 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Public IP", @@ -52,20 +53,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -73,7 +74,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a public IP for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create public IP: %w", err) } - return outputResult(p, model.OutputFormat, projectLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, projectLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/public-ip/create/create_test.go b/internal/cmd/public-ip/create/create_test.go index b204d561f..be2653938 100644 --- a/internal/cmd/public-ip/create/create_test.go +++ b/internal/cmd/public-ip/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -232,7 +233,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.publicIp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index 57a427dd6..5382526e7 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", publicIpIdArg), Short: "Deletes a Public IP", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { - p.Debug(print.ErrorLevel, "get public IP: %v", err) + params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete public IP %q? (This cannot be undone)", publicIpLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete public IP: %w", err) } - p.Info("Deleted public IP %q\n", publicIpLabel) + params.Printer.Info("Deleted public IP %q\n", publicIpLabel) return nil }, } diff --git a/internal/cmd/public-ip/delete/delete_test.go b/internal/cmd/public-ip/delete/delete_test.go index 1acd8b016..667578fb0 100644 --- a/internal/cmd/public-ip/delete/delete_test.go +++ b/internal/cmd/public-ip/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index 820d9ff61..18f96d46d 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", publicIpIdArg), Short: "Shows details of a Public IP", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read public IP: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } return cmd diff --git a/internal/cmd/public-ip/describe/describe_test.go b/internal/cmd/public-ip/describe/describe_test.go index 44ab876ff..f69ba8dbb 100644 --- a/internal/cmd/public-ip/describe/describe_test.go +++ b/internal/cmd/public-ip/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -234,7 +235,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.publicIp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index f15bd7efd..cdd427605 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disassociate %s", publicIpIdArg), Short: "Disassociates a Public IP from a network interface or a virtual IP", @@ -40,20 +41,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } publicIpLabel, associatedResourceId, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { - p.Debug(print.ErrorLevel, "get public IP: %v", err) + params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId @@ -61,7 +62,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disassociate public IP %q from the associated resource %q?", publicIpLabel, associatedResourceId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disassociate public IP: %w", err) } - p.Outputf("Disassociated public IP %q from the associated resource %q.\n", publicIpLabel, associatedResourceId) + params.Printer.Outputf("Disassociated public IP %q from the associated resource %q.\n", publicIpLabel, associatedResourceId) return nil }, } diff --git a/internal/cmd/public-ip/disassociate/disassociate_test.go b/internal/cmd/public-ip/disassociate/disassociate_test.go index e4478b0c7..956be6b23 100644 --- a/internal/cmd/public-ip/disassociate/disassociate_test.go +++ b/internal/cmd/public-ip/disassociate/disassociate_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/google/go-cmp/cmp" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index 19c225198..df57f864c 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Public IPs of a project", @@ -58,13 +59,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,14 +78,14 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId } - p.Info("No public IPs found for project %q\n", projectLabel) + params.Printer.Info("No public IPs found for project %q\n", projectLabel) return nil } @@ -94,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/public-ip/list/list_test.go b/internal/cmd/public-ip/list/list_test.go index 0644d83e8..a6fe99a48 100644 --- a/internal/cmd/public-ip/list/list_test.go +++ b/internal/cmd/public-ip/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -132,7 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -220,7 +221,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.publicIps); (err != nil) != tt.wantErr { diff --git a/internal/cmd/public-ip/public-ip.go b/internal/cmd/public-ip/public-ip.go index 6259759a8..3be1ac1c4 100644 --- a/internal/cmd/public-ip/public-ip.go +++ b/internal/cmd/public-ip/public-ip.go @@ -1,6 +1,7 @@ package publicip import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/associate" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/create" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/delete" @@ -9,13 +10,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/list" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "public-ip", Short: "Provides functionality for public IPs", @@ -23,16 +23,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(associate.NewCmd(p)) - cmd.AddCommand(disassociate.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(associate.NewCmd(params)) + cmd.AddCommand(disassociate.NewCmd(params)) } diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index d3bd1a86c..0e9a2180a 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -33,7 +34,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", publicIpIdArg), Short: "Updates a Public IP", @@ -51,26 +52,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { - p.Debug(print.ErrorLevel, "get public IP: %v", err) + params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update public IP %q?", publicIpLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update public IP: %w", err) } - return outputResult(p, model, publicIpLabel, resp) + return outputResult(params.Printer, model, publicIpLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/public-ip/update/update_test.go b/internal/cmd/public-ip/update/update_test.go index 9590a858a..87c598665 100644 --- a/internal/cmd/public-ip/update/update_test.go +++ b/internal/cmd/public-ip/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -145,7 +146,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index 2e7a307c4..756c10ff5 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,7 +24,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists quotas", @@ -37,20 +38,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } else if projectLabel == "" { projectLabel = model.ProjectId @@ -65,9 +66,9 @@ func NewCmd(p *print.Printer) *cobra.Command { } if items := response.Quotas; items == nil { - p.Info("No quotas found for project %q", projectLabel) + params.Printer.Info("No quotas found for project %q", projectLabel) } else { - if err := outputResult(p, model.OutputFormat, items); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, items); err != nil { return fmt.Errorf("output quotas: %w", err) } } diff --git a/internal/cmd/quota/list/list_test.go b/internal/cmd/quota/list/list_test.go index 1daa3fcff..ab2cdd8ea 100644 --- a/internal/cmd/quota/list/list_test.go +++ b/internal/cmd/quota/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -95,7 +96,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -187,7 +188,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.quotas); (err != nil) != tt.wantErr { diff --git a/internal/cmd/quota/quota.go b/internal/cmd/quota/quota.go index bd71be405..ff323e97e 100644 --- a/internal/cmd/quota/quota.go +++ b/internal/cmd/quota/quota.go @@ -1,16 +1,16 @@ package quota import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/quota/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "quota", Short: "Manage server quotas", @@ -18,12 +18,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand( - list.NewCmd(p), + list.NewCmd(params), ) } diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index bc4e069f4..0cbe75a6f 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a RabbitMQ instance", @@ -46,26 +47,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create RabbitMQ credentials: %w", err) } - return outputResult(p, *model, instanceLabel, resp) + return outputResult(params.Printer, *model, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/rabbitmq/credentials/create/create_test.go b/internal/cmd/rabbitmq/credentials/create/create_test.go index 1c053d029..84e65eaa0 100644 --- a/internal/cmd/rabbitmq/credentials/create/create_test.go +++ b/internal/cmd/rabbitmq/credentials/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -243,7 +244,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/credentials/credentials.go b/internal/cmd/rabbitmq/credentials/credentials.go index 38ec2c552..80c06fb8e 100644 --- a/internal/cmd/rabbitmq/credentials/credentials.go +++ b/internal/cmd/rabbitmq/credentials/credentials.go @@ -1,18 +1,18 @@ package credentials import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for RabbitMQ credentials", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/rabbitmq/credentials/delete/delete.go b/internal/cmd/rabbitmq/credentials/delete/delete.go index 682a0eed8..433348260 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a RabbitMQ instance", @@ -43,32 +44,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } credentialsLabel, err := rabbitmqUtils.GetCredentialsUsername(ctx, apiClient, model.ProjectId, model.InstanceId, model.CredentialsId) if err != nil { - p.Debug(print.ErrorLevel, "get credentials user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials user name: %v", err) credentialsLabel = model.CredentialsId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete RabbitMQ credentials: %w", err) } - p.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) + params.Printer.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/rabbitmq/credentials/delete/delete_test.go b/internal/cmd/rabbitmq/credentials/delete/delete_test.go index 24739b018..e716f7c72 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete_test.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/rabbitmq/credentials/describe/describe.go b/internal/cmd/rabbitmq/credentials/describe/describe.go index 85159848d..9ad4dcc9f 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a RabbitMQ instance", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe RabbitMQ credentials: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/rabbitmq/credentials/describe/describe_test.go b/internal/cmd/rabbitmq/credentials/describe/describe_test.go index ef4d23107..a40cd610d 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe_test.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" @@ -164,7 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -270,7 +271,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index e9b03d199..6a06c9313 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a RabbitMQ instance", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,10 +72,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No credentials found for instance %q\n", instanceLabel) + params.Printer.Info("No credentials found for instance %q\n", instanceLabel) return nil } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/rabbitmq/credentials/list/list_test.go b/internal/cmd/rabbitmq/credentials/list/list_test.go index 431a51a08..77f7f2f5e 100644 --- a/internal/cmd/rabbitmq/credentials/list/list_test.go +++ b/internal/cmd/rabbitmq/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -234,7 +235,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index 3ea8bfda1..77f34ed7f 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -57,7 +58,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a RabbitMQ instance", @@ -76,26 +77,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create an RabbitMQ instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -118,7 +119,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -127,7 +128,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, instanceId, resp) + return outputResult(params.Printer, model, projectLabel, instanceId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/rabbitmq/instance/create/create_test.go b/internal/cmd/rabbitmq/instance/create/create_test.go index 5faeb3257..aa39a62e8 100644 --- a/internal/cmd/rabbitmq/instance/create/create_test.go +++ b/internal/cmd/rabbitmq/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -276,7 +277,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -521,7 +522,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, &tt.args.model, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index 66a7b578e..992526969 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a RabbitMQ instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/rabbitmq/instance/delete/delete_test.go b/internal/cmd/rabbitmq/instance/delete/delete_test.go index d9b32ef81..8064098ad 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete_test.go +++ b/internal/cmd/rabbitmq/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/rabbitmq/instance/describe/describe.go b/internal/cmd/rabbitmq/instance/describe/describe.go index c65f67ed3..e79f476fa 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe.go +++ b/internal/cmd/rabbitmq/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a RabbitMQ instance", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read RabbitMQ instance: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/rabbitmq/instance/describe/describe_test.go b/internal/cmd/rabbitmq/instance/describe/describe_test.go index 4b9420995..8fe1f8288 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe_test.go +++ b/internal/cmd/rabbitmq/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -250,7 +251,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/instance.go b/internal/cmd/rabbitmq/instance/instance.go index b9a73a3e0..2ad311846 100644 --- a/internal/cmd/rabbitmq/instance/instance.go +++ b/internal/cmd/rabbitmq/instance/instance.go @@ -1,19 +1,19 @@ package instance import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for RabbitMQ instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 3ade03661..cad8afdb3 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all RabbitMQ instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/rabbitmq/instance/list/list_test.go b/internal/cmd/rabbitmq/instance/list/list_test.go index 50bdcf4bd..bbfefdfff 100644 --- a/internal/cmd/rabbitmq/instance/list/list_test.go +++ b/internal/cmd/rabbitmq/instance/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -213,7 +214,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index 67144235d..f75c97cac 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a RabbitMQ instance", @@ -72,26 +73,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -114,7 +115,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -127,7 +128,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/rabbitmq/instance/update/update_test.go b/internal/cmd/rabbitmq/instance/update/update_test.go index c2d92bc6f..50642481c 100644 --- a/internal/cmd/rabbitmq/instance/update/update_test.go +++ b/internal/cmd/rabbitmq/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -294,7 +295,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index 1b84f3029..fc9276a93 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all RabbitMQ service plans", @@ -49,13 +50,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,12 +69,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No plans found for project %q\n", projectLabel) + params.Printer.Info("No plans found for project %q\n", projectLabel) return nil } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(p, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, plans) }, } diff --git a/internal/cmd/rabbitmq/plans/plans_test.go b/internal/cmd/rabbitmq/plans/plans_test.go index ab8966a20..d5f0f9aee 100644 --- a/internal/cmd/rabbitmq/plans/plans_test.go +++ b/internal/cmd/rabbitmq/plans/plans_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -213,7 +214,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/rabbitmq.go b/internal/cmd/rabbitmq/rabbitmq.go index 26b5db9bb..9dc5b76a3 100644 --- a/internal/cmd/rabbitmq/rabbitmq.go +++ b/internal/cmd/rabbitmq/rabbitmq.go @@ -1,17 +1,17 @@ package rabbitmq import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/plans" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "rabbitmq", Short: "Provides functionality for RabbitMQ", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(plans.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) } diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index 9b2098344..17d6e4164 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a Redis instance", @@ -47,26 +48,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Redis credentials: %w", err) } - return outputResult(p, *model, instanceLabel, resp) + return outputResult(params.Printer, *model, instanceLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/redis/credentials/create/create_test.go b/internal/cmd/redis/credentials/create/create_test.go index 511b066ad..070229478 100644 --- a/internal/cmd/redis/credentials/create/create_test.go +++ b/internal/cmd/redis/credentials/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/redis" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -223,7 +224,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/credentials/credentials.go b/internal/cmd/redis/credentials/credentials.go index 42e6226da..d1d8a4d7a 100644 --- a/internal/cmd/redis/credentials/credentials.go +++ b/internal/cmd/redis/credentials/credentials.go @@ -1,18 +1,18 @@ package credentials import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for Redis credentials", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/redis/credentials/delete/delete.go b/internal/cmd/redis/credentials/delete/delete.go index 4012c6b3f..147ad731b 100644 --- a/internal/cmd/redis/credentials/delete/delete.go +++ b/internal/cmd/redis/credentials/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a Redis instance", @@ -43,32 +44,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } credentialsLabel, err := redisUtils.GetCredentialsUsername(ctx, apiClient, model.ProjectId, model.InstanceId, model.CredentialsId) if err != nil { - p.Debug(print.ErrorLevel, "get credentials user name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get credentials user name: %v", err) credentialsLabel = model.CredentialsId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Redis credentials: %w", err) } - p.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) + params.Printer.Info("Deleted credentials %s of instance %q\n", credentialsLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/redis/credentials/delete/delete_test.go b/internal/cmd/redis/credentials/delete/delete_test.go index 716bfedfe..d8b2c4632 100644 --- a/internal/cmd/redis/credentials/delete/delete_test.go +++ b/internal/cmd/redis/credentials/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/redis/credentials/describe/describe.go b/internal/cmd/redis/credentials/describe/describe.go index 7a6dc78e4..9ab0e9ab4 100644 --- a/internal/cmd/redis/credentials/describe/describe.go +++ b/internal/cmd/redis/credentials/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a Redis instance", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe Redis credentials: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/redis/credentials/describe/describe_test.go b/internal/cmd/redis/credentials/describe/describe_test.go index c6f837491..fc8edb1b8 100644 --- a/internal/cmd/redis/credentials/describe/describe_test.go +++ b/internal/cmd/redis/credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/redis" @@ -164,7 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -267,7 +268,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index a83492451..603dc86ed 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a Redis instance", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,10 +72,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(credentials) == 0 { instanceLabel, err := redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - p.Info("No credentials found for instance %q\n", instanceLabel) + params.Printer.Info("No credentials found for instance %q\n", instanceLabel) return nil } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(p, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentials) }, } configureFlags(cmd) diff --git a/internal/cmd/redis/credentials/list/list_test.go b/internal/cmd/redis/credentials/list/list_test.go index b771823bf..a37f530c4 100644 --- a/internal/cmd/redis/credentials/list/list_test.go +++ b/internal/cmd/redis/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -234,7 +235,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index 87db67741..86fdec837 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -8,6 +8,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Redis instance", @@ -74,26 +75,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a Redis instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -116,7 +117,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating instance") _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -125,7 +126,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, instanceId, resp) + return outputResult(params.Printer, model, projectLabel, instanceId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/redis/instance/create/create_test.go b/internal/cmd/redis/instance/create/create_test.go index 59ee4d259..814673259 100644 --- a/internal/cmd/redis/instance/create/create_test.go +++ b/internal/cmd/redis/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -261,7 +262,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -496,7 +497,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/delete/delete.go b/internal/cmd/redis/instance/delete/delete.go index 902e30ada..bb4efebda 100644 --- a/internal/cmd/redis/instance/delete/delete.go +++ b/internal/cmd/redis/instance/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a Redis instance", @@ -41,26 +42,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting instance") _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) if err != nil { @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/redis/instance/delete/delete_test.go b/internal/cmd/redis/instance/delete/delete_test.go index 60dc78c89..bb0da281f 100644 --- a/internal/cmd/redis/instance/delete/delete_test.go +++ b/internal/cmd/redis/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/redis/instance/describe/describe.go b/internal/cmd/redis/instance/describe/describe.go index f91b4b1e6..c01d82ddd 100644 --- a/internal/cmd/redis/instance/describe/describe.go +++ b/internal/cmd/redis/instance/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a Redis instance", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read Redis instance: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/redis/instance/describe/describe_test.go b/internal/cmd/redis/instance/describe/describe_test.go index 1e12d6195..651164b98 100644 --- a/internal/cmd/redis/instance/describe/describe_test.go +++ b/internal/cmd/redis/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/redis" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -251,7 +252,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/instance.go b/internal/cmd/redis/instance/instance.go index 3518921b5..a45e6bd96 100644 --- a/internal/cmd/redis/instance/instance.go +++ b/internal/cmd/redis/instance/instance.go @@ -1,19 +1,19 @@ package instance import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for Redis instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index 4b49c15fa..87f7b6d3e 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Redis instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/redis/instance/list/list_test.go b/internal/cmd/redis/instance/list/list_test.go index 0338bd8a7..aff5c8020 100644 --- a/internal/cmd/redis/instance/list/list_test.go +++ b/internal/cmd/redis/instance/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -212,7 +213,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/update/update.go b/internal/cmd/redis/instance/update/update.go index 117dbe472..65e92c860 100644 --- a/internal/cmd/redis/instance/update/update.go +++ b/internal/cmd/redis/instance/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -53,7 +54,7 @@ type inputModel struct { PlanId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a Redis instance", @@ -69,26 +70,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -111,7 +112,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating instance") _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) if err != nil { @@ -124,7 +125,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered update of" } - p.Info("%s instance %q\n", operationState, instanceLabel) + params.Printer.Info("%s instance %q\n", operationState, instanceLabel) return nil }, } diff --git a/internal/cmd/redis/instance/update/update_test.go b/internal/cmd/redis/instance/update/update_test.go index 30602e593..7c5df24d5 100644 --- a/internal/cmd/redis/instance/update/update_test.go +++ b/internal/cmd/redis/instance/update/update_test.go @@ -5,6 +5,7 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -278,7 +279,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index 8ae785da6..7bcb60218 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all Redis service plans", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No plans found for project %q\n", projectLabel) + params.Printer.Info("No plans found for project %q\n", projectLabel) return nil } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(p, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, plans) }, } diff --git a/internal/cmd/redis/plans/plans_test.go b/internal/cmd/redis/plans/plans_test.go index f850de8a1..8ea65f786 100644 --- a/internal/cmd/redis/plans/plans_test.go +++ b/internal/cmd/redis/plans/plans_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -212,7 +213,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/redis.go b/internal/cmd/redis/redis.go index 3b07f00c9..4a45e9c33 100644 --- a/internal/cmd/redis/redis.go +++ b/internal/cmd/redis/redis.go @@ -1,17 +1,17 @@ package redis import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/plans" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "redis", Short: "Provides functionality for Redis", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(plans.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) } diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 736c944f5..6da6491d6 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + affinityGroups "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups" "github.com/stackitcloud/stackit-cli/internal/cmd/auth" "github.com/stackitcloud/stackit-cli/internal/cmd/beta" @@ -114,7 +116,10 @@ func NewRootCmd(version, date string, p *print.Printer) *cobra.Command { err := configureFlags(cmd) cobra.CheckErr(err) - addSubcommands(cmd, p) + addSubcommands(cmd, ¶ms.CmdParams{ + Printer: p, + CliVersion: version, + }) // Cobra creates the help flag with "help for " as the description // We want to override that message by capitalizing the first letter to match the other flag descriptions @@ -154,38 +159,38 @@ func configureFlags(cmd *cobra.Command) error { return nil } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(auth.NewCmd(p)) - cmd.AddCommand(configCmd.NewCmd(p)) - cmd.AddCommand(beta.NewCmd(p)) - cmd.AddCommand(curl.NewCmd(p)) - cmd.AddCommand(dns.NewCmd(p)) - cmd.AddCommand(loadbalancer.NewCmd(p)) - cmd.AddCommand(logme.NewCmd(p)) - cmd.AddCommand(mariadb.NewCmd(p)) - cmd.AddCommand(mongodbflex.NewCmd(p)) - cmd.AddCommand(objectstorage.NewCmd(p)) - cmd.AddCommand(observability.NewCmd(p)) - cmd.AddCommand(opensearch.NewCmd(p)) - cmd.AddCommand(organization.NewCmd(p)) - cmd.AddCommand(postgresflex.NewCmd(p)) - cmd.AddCommand(project.NewCmd(p)) - cmd.AddCommand(rabbitmq.NewCmd(p)) - cmd.AddCommand(redis.NewCmd(p)) - cmd.AddCommand(secretsmanager.NewCmd(p)) - cmd.AddCommand(serviceaccount.NewCmd(p)) - cmd.AddCommand(ske.NewCmd(p)) - cmd.AddCommand(server.NewCmd(p)) - cmd.AddCommand(networkArea.NewCmd(p)) - cmd.AddCommand(network.NewCmd(p)) - cmd.AddCommand(volume.NewCmd(p)) - cmd.AddCommand(networkinterface.NewCmd(p)) - cmd.AddCommand(publicip.NewCmd(p)) - cmd.AddCommand(securitygroup.NewCmd(p)) - cmd.AddCommand(keypair.NewCmd(p)) - cmd.AddCommand(image.NewCmd(p)) - cmd.AddCommand(quota.NewCmd(p)) - cmd.AddCommand(affinityGroups.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(auth.NewCmd(params)) + cmd.AddCommand(configCmd.NewCmd(params)) + cmd.AddCommand(beta.NewCmd(params)) + cmd.AddCommand(curl.NewCmd(params)) + cmd.AddCommand(dns.NewCmd(params)) + cmd.AddCommand(loadbalancer.NewCmd(params)) + cmd.AddCommand(logme.NewCmd(params)) + cmd.AddCommand(mariadb.NewCmd(params)) + cmd.AddCommand(mongodbflex.NewCmd(params)) + cmd.AddCommand(objectstorage.NewCmd(params)) + cmd.AddCommand(observability.NewCmd(params)) + cmd.AddCommand(opensearch.NewCmd(params)) + cmd.AddCommand(organization.NewCmd(params)) + cmd.AddCommand(postgresflex.NewCmd(params)) + cmd.AddCommand(project.NewCmd(params)) + cmd.AddCommand(rabbitmq.NewCmd(params)) + cmd.AddCommand(redis.NewCmd(params)) + cmd.AddCommand(secretsmanager.NewCmd(params)) + cmd.AddCommand(serviceaccount.NewCmd(params)) + cmd.AddCommand(ske.NewCmd(params)) + cmd.AddCommand(server.NewCmd(params)) + cmd.AddCommand(networkArea.NewCmd(params)) + cmd.AddCommand(network.NewCmd(params)) + cmd.AddCommand(volume.NewCmd(params)) + cmd.AddCommand(networkinterface.NewCmd(params)) + cmd.AddCommand(publicip.NewCmd(params)) + cmd.AddCommand(securitygroup.NewCmd(params)) + cmd.AddCommand(keypair.NewCmd(params)) + cmd.AddCommand(image.NewCmd(params)) + cmd.AddCommand(quota.NewCmd(params)) + cmd.AddCommand(affinityGroups.NewCmd(params)) } // traverseCommands calls f for c and all of its children. diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index 35c02682c..ad1a8195f 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Acls *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Secrets Manager instance", @@ -49,26 +50,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a Secrets Manager instance for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -94,7 +95,7 @@ If you want to retry configuring the ACLs, you can do it via: } } - return outputResult(p, model.OutputFormat, projectLabel, instanceId, resp) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instanceId, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/secrets-manager/instance/create/create_test.go b/internal/cmd/secrets-manager/instance/create/create_test.go index 92b04ba79..02a895c01 100644 --- a/internal/cmd/secrets-manager/instance/create/create_test.go +++ b/internal/cmd/secrets-manager/instance/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -184,7 +185,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -329,7 +330,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instanceId, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/instance/delete/delete.go b/internal/cmd/secrets-manager/instance/delete/delete.go index 960034165..dda64b620 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete.go +++ b/internal/cmd/secrets-manager/instance/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a Secrets Manager instance", @@ -38,26 +39,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := secretsmanagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Secrets Manager instance: %w", err) } - p.Info("Deleted instance %q \n", model.InstanceId) + params.Printer.Info("Deleted instance %q \n", model.InstanceId) return nil }, } diff --git a/internal/cmd/secrets-manager/instance/delete/delete_test.go b/internal/cmd/secrets-manager/instance/delete/delete_test.go index b36eb87b8..fe6eae032 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete_test.go +++ b/internal/cmd/secrets-manager/instance/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/secrets-manager/instance/describe/describe.go b/internal/cmd/secrets-manager/instance/describe/describe.go index 8551fa8bf..e794a2cce 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe.go +++ b/internal/cmd/secrets-manager/instance/describe/describe.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a Secrets Manager instance", @@ -45,12 +46,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read Secrets Manager instance ACLs: %w", err) } - return outputResult(p, model.OutputFormat, instance, aclList) + return outputResult(params.Printer, model.OutputFormat, instance, aclList) }, } return cmd diff --git a/internal/cmd/secrets-manager/instance/describe/describe_test.go b/internal/cmd/secrets-manager/instance/describe/describe_test.go index 212c825ab..2cadb3be2 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe_test.go +++ b/internal/cmd/secrets-manager/instance/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -146,7 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -293,7 +294,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance, tt.args.aclList); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/instance/instance.go b/internal/cmd/secrets-manager/instance/instance.go index cc38f6ca7..5617aeddc 100644 --- a/internal/cmd/secrets-manager/instance/instance.go +++ b/internal/cmd/secrets-manager/instance/instance.go @@ -1,19 +1,19 @@ package instance import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for Secrets Manager instances", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index 019aff8f6..cf6d4c745 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Secrets Manager instances", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,12 +68,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Instances == nil || len(*resp.Instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No instances found for project %q\n", projectLabel) + params.Printer.Info("No instances found for project %q\n", projectLabel) return nil } instances := *resp.Instances @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(p, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, instances) }, } diff --git a/internal/cmd/secrets-manager/instance/list/list_test.go b/internal/cmd/secrets-manager/instance/list/list_test.go index 3903b0210..6ea677137 100644 --- a/internal/cmd/secrets-manager/instance/list/list_test.go +++ b/internal/cmd/secrets-manager/instance/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -228,7 +229,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/instance/update/update.go b/internal/cmd/secrets-manager/instance/update/update.go index e013c1e73..371711e55 100644 --- a/internal/cmd/secrets-manager/instance/update/update.go +++ b/internal/cmd/secrets-manager/instance/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Acls *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a Secrets Manager instance", @@ -45,26 +46,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Secrets Manager instance: %w", err) } - p.Info("Updated instance %q\n", instanceLabel) + params.Printer.Info("Updated instance %q\n", instanceLabel) return nil }, } diff --git a/internal/cmd/secrets-manager/instance/update/update_test.go b/internal/cmd/secrets-manager/instance/update/update_test.go index 8668d9ca1..1a60db361 100644 --- a/internal/cmd/secrets-manager/instance/update/update_test.go +++ b/internal/cmd/secrets-manager/instance/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -198,7 +199,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/secrets-manager/secrets_manager.go b/internal/cmd/secrets-manager/secrets_manager.go index d9c78f035..35745dfde 100644 --- a/internal/cmd/secrets-manager/secrets_manager.go +++ b/internal/cmd/secrets-manager/secrets_manager.go @@ -1,16 +1,16 @@ package secretsmanager import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "secrets-manager", Short: "Provides functionality for Secrets Manager", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(instance.NewCmd(p)) - cmd.AddCommand(user.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(user.NewCmd(params)) } diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index 12a767cf4..62d54d9d7 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Write *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Secrets Manager user", @@ -54,26 +55,26 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Secrets Manager user: %w", err) } - return outputResult(p, model.OutputFormat, instanceLabel, resp) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, resp) }, } diff --git a/internal/cmd/secrets-manager/user/create/create_test.go b/internal/cmd/secrets-manager/user/create/create_test.go index be5ae1a37..a64b826ba 100644 --- a/internal/cmd/secrets-manager/user/create/create_test.go +++ b/internal/cmd/secrets-manager/user/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -251,7 +252,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/user/delete/delete.go b/internal/cmd/secrets-manager/user/delete/delete.go index 6ed848d0e..fc3272435 100644 --- a/internal/cmd/secrets-manager/user/delete/delete.go +++ b/internal/cmd/secrets-manager/user/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a Secrets Manager user", @@ -47,32 +48,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := secretsManagerUtils.GetUserLabel(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user label: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user label: %v", err) userLabel = fmt.Sprintf("%q", model.UserId) } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete user %s of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Secrets Manager user: %w", err) } - p.Info("Deleted user %s of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Deleted user %s of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/secrets-manager/user/delete/delete_test.go b/internal/cmd/secrets-manager/user/delete/delete_test.go index 8ad0a2bf2..0827ebf88 100644 --- a/internal/cmd/secrets-manager/user/delete/delete_test.go +++ b/internal/cmd/secrets-manager/user/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -153,7 +154,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/secrets-manager/user/describe/describe.go b/internal/cmd/secrets-manager/user/describe/describe.go index 2bfb18b08..c08e0ac32 100644 --- a/internal/cmd/secrets-manager/user/describe/describe.go +++ b/internal/cmd/secrets-manager/user/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { UserId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a Secrets Manager user", @@ -49,13 +50,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get Secrets Manager user: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } diff --git a/internal/cmd/secrets-manager/user/describe/describe_test.go b/internal/cmd/secrets-manager/user/describe/describe_test.go index 46cd4b63e..53c14c586 100644 --- a/internal/cmd/secrets-manager/user/describe/describe_test.go +++ b/internal/cmd/secrets-manager/user/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index 19ff7f8ea..b414e2cd9 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Secrets Manager users", @@ -51,13 +52,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,10 +72,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Users == nil || len(*resp.Users) == 0 { instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId } - p.Info("No users found for instance %q\n", instanceLabel) + params.Printer.Info("No users found for instance %q\n", instanceLabel) return nil } users := *resp.Users @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { users = users[:*model.Limit] } - return outputResult(p, model.OutputFormat, users) + return outputResult(params.Printer, model.OutputFormat, users) }, } diff --git a/internal/cmd/secrets-manager/user/list/list_test.go b/internal/cmd/secrets-manager/user/list/list_test.go index ac4c830a7..d2de82297 100644 --- a/internal/cmd/secrets-manager/user/list/list_test.go +++ b/internal/cmd/secrets-manager/user/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -235,7 +236,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.users); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/user/update/update.go b/internal/cmd/secrets-manager/user/update/update.go index 573076eb4..f0b6e35b9 100644 --- a/internal/cmd/secrets-manager/user/update/update.go +++ b/internal/cmd/secrets-manager/user/update/update.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { DisableWrite *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", userIdArg), Short: "Updates the write privileges Secrets Manager user", @@ -51,32 +52,32 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.SingleArg(userIdArg, utils.ValidateUUID), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { - p.Debug(print.ErrorLevel, "get instance name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } userLabel, err := secretsManagerUtils.GetUserLabel(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) if err != nil { - p.Debug(print.ErrorLevel, "get user label: %v", err) + params.Printer.Debug(print.ErrorLevel, "get user label: %v", err) userLabel = fmt.Sprintf("%q", model.UserId) } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update user %s of instance %q?", userLabel, instanceLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -93,7 +94,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Secrets Manager user: %w", err) } - p.Info("Updated user %s of instance %q\n", userLabel, instanceLabel) + params.Printer.Info("Updated user %s of instance %q\n", userLabel, instanceLabel) return nil }, } diff --git a/internal/cmd/secrets-manager/user/update/update_test.go b/internal/cmd/secrets-manager/user/update/update_test.go index b3b8a67b0..5ae24676b 100644 --- a/internal/cmd/secrets-manager/user/update/update_test.go +++ b/internal/cmd/secrets-manager/user/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -189,7 +190,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/secrets-manager/user/user.go b/internal/cmd/secrets-manager/user/user.go index 8dcd68410..ae4e1c90f 100644 --- a/internal/cmd/secrets-manager/user/user.go +++ b/internal/cmd/secrets-manager/user/user.go @@ -2,10 +2,10 @@ package user import ( "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/create" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/describe" @@ -13,7 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/update" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for Secrets Manager users", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 24f3da09c..891abccc9 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Stateful *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates security groups", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create the security group %q?", *model.Name) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create security group: %w", err) } - if err := outputResult(p, model.OutputFormat, *model.Name, *group); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, *model.Name, *group); err != nil { return err } diff --git a/internal/cmd/security-group/create/create_test.go b/internal/cmd/security-group/create/create_test.go index 6a6a02898..9b2561489 100644 --- a/internal/cmd/security-group/create/create_test.go +++ b/internal/cmd/security-group/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -168,7 +169,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -282,7 +283,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.name, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 85781ae13..0d116da7e 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -24,7 +25,7 @@ type inputModel struct { const groupIdArg = "GROUP_ID" -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", groupIdArg), Short: "Deletes a security group", @@ -35,32 +36,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } groupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.SecurityGroupId) if err != nil { - p.Warn("get security group name: %v", err) + params.Printer.Warn("get security group name: %v", err) groupLabel = model.SecurityGroupId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete the security group %q for %q?", groupLabel, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err := request.Execute(); err != nil { return fmt.Errorf("delete security group: %w", err) } - p.Info("Deleted security group %q for %q\n", groupLabel, projectLabel) + params.Printer.Info("Deleted security group %q for %q\n", groupLabel, projectLabel) return nil }, diff --git a/internal/cmd/security-group/delete/delete_test.go b/internal/cmd/security-group/delete/delete_test.go index 7666e1585..ec7143cbf 100644 --- a/internal/cmd/security-group/delete/delete_test.go +++ b/internal/cmd/security-group/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -105,7 +106,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/security-group/describe/describe.go b/internal/cmd/security-group/describe/describe.go index 01d86df03..bde9cbc9f 100644 --- a/internal/cmd/security-group/describe/describe.go +++ b/internal/cmd/security-group/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { const groupIdArg = "GROUP_ID" -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", groupIdArg), Short: "Describes security groups", @@ -38,13 +39,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -57,7 +58,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get security group: %w", err) } - if err := outputResult(p, model.OutputFormat, group); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, group); err != nil { return err } diff --git a/internal/cmd/security-group/describe/describe_test.go b/internal/cmd/security-group/describe/describe_test.go index 6deaf042f..f9b5f7fba 100644 --- a/internal/cmd/security-group/describe/describe_test.go +++ b/internal/cmd/security-group/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -119,7 +120,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -216,7 +217,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index 48caeddb3..592c65408 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ const ( labelSelectorFlag = "label-selector" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists security groups", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } @@ -68,9 +69,9 @@ func NewCmd(p *print.Printer) *cobra.Command { } if items := response.GetItems(); len(items) == 0 { - p.Info("No security groups found for project %q", projectLabel) + params.Printer.Info("No security groups found for project %q", projectLabel) } else { - if err := outputResult(p, model.OutputFormat, items); err != nil { + if err := outputResult(params.Printer, model.OutputFormat, items); err != nil { return fmt.Errorf("output security groups: %w", err) } } diff --git a/internal/cmd/security-group/list/list_test.go b/internal/cmd/security-group/list/list_test.go index d19adf3a0..a78e3501a 100644 --- a/internal/cmd/security-group/list/list_test.go +++ b/internal/cmd/security-group/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -119,7 +120,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -222,7 +223,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index a330e98eb..a5b4bbc9d 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -52,7 +53,7 @@ type inputModel struct { ProtocolName *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a security group rule", @@ -78,32 +79,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.SecurityGroupId) if err != nil { - p.Debug(print.ErrorLevel, "get security group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) securityGroupLabel = model.SecurityGroupId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a security group rule for security group %q for project %q?", securityGroupLabel, projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -116,7 +117,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create security group rule : %w", err) } - return outputResult(p, model, projectLabel, securityGroupLabel, resp) + return outputResult(params.Printer, model, projectLabel, securityGroupLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/security-group/rule/create/create_test.go b/internal/cmd/security-group/rule/create/create_test.go index 1a0024129..6c1521899 100644 --- a/internal/cmd/security-group/rule/create/create_test.go +++ b/internal/cmd/security-group/rule/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -243,7 +244,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -360,7 +361,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.securityGroupName, tt.args.securityGroupRule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index 247caed8a..adca9d3eb 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { SecurityGroupId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", securityGroupRuleIdArg), Short: "Deletes a security group rule", @@ -46,32 +47,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, *model.SecurityGroupId) if err != nil { - p.Debug(print.ErrorLevel, "get security group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) securityGroupLabel = *model.SecurityGroupId } securityGroupRuleLabel, err := iaasUtils.GetSecurityGroupRuleName(ctx, apiClient, model.ProjectId, model.SecurityGroupRuleId, *model.SecurityGroupId) if err != nil { - p.Debug(print.ErrorLevel, "get security group rule name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get security group rule name: %v", err) securityGroupRuleLabel = model.SecurityGroupRuleId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete security group rule %q from security group %q?", securityGroupRuleLabel, securityGroupLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete security group rule: %w", err) } - p.Info("Deleted security group rule %q from security group %q\n", securityGroupRuleLabel, securityGroupLabel) + params.Printer.Info("Deleted security group rule %q from security group %q\n", securityGroupRuleLabel, securityGroupLabel) return nil }, } diff --git a/internal/cmd/security-group/rule/delete/delete_test.go b/internal/cmd/security-group/rule/delete/delete_test.go index e8d36d7f6..ebf83035c 100644 --- a/internal/cmd/security-group/rule/delete/delete_test.go +++ b/internal/cmd/security-group/rule/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -155,7 +156,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index 8e8bd0508..feefb5d54 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { SecurityGroupId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", securityGroupRuleIdArg), Short: "Shows details of a security group rule", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -68,7 +69,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read security group rule: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/security-group/rule/describe/describe_test.go b/internal/cmd/security-group/rule/describe/describe_test.go index 03060fcb2..66b536f5c 100644 --- a/internal/cmd/security-group/rule/describe/describe_test.go +++ b/internal/cmd/security-group/rule/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.securityGroupRule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index 84c83ece4..50304378e 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { SecurityGroupId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all security group rules in a security group of a project", @@ -56,13 +57,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,16 +78,16 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, *model.SecurityGroupId) if err != nil { - p.Debug(print.ErrorLevel, "get security group name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) securityGroupLabel = *model.SecurityGroupId } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No rules found in security group %q for project %q\n", securityGroupLabel, projectLabel) + params.Printer.Info("No rules found in security group %q for project %q\n", securityGroupLabel, projectLabel) return nil } @@ -96,7 +97,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/security-group/rule/list/list_test.go b/internal/cmd/security-group/rule/list/list_test.go index f72f89897..0b7a49b25 100644 --- a/internal/cmd/security-group/rule/list/list_test.go +++ b/internal/cmd/security-group/rule/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -141,7 +142,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -229,7 +230,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.securityGroupRules); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/security_group_rule.go b/internal/cmd/security-group/rule/security_group_rule.go index c1e133841..75f394384 100644 --- a/internal/cmd/security-group/rule/security_group_rule.go +++ b/internal/cmd/security-group/rule/security_group_rule.go @@ -1,18 +1,18 @@ package rule import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/create" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "rule", Short: "Provides functionality for security group rules", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/security-group/security_group.go b/internal/cmd/security-group/security_group.go index f20679d57..952da976c 100644 --- a/internal/cmd/security-group/security_group.go +++ b/internal/cmd/security-group/security_group.go @@ -1,6 +1,7 @@ package security_group import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/create" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/describe" @@ -8,14 +9,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "security-group", Short: "Manage security groups", @@ -23,17 +23,17 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand( - rule.NewCmd(p), - create.NewCmd(p), - delete.NewCmd(p), - describe.NewCmd(p), - list.NewCmd(p), - update.NewCmd(p), + rule.NewCmd(params), + create.NewCmd(params), + delete.NewCmd(params), + describe.NewCmd(params), + list.NewCmd(params), + update.NewCmd(params), ) } diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index ddff90e23..a91c07971 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ const ( labelsArg = "labels" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", groupNameArg), Short: "Updates a security group", @@ -46,32 +47,32 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } groupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.SecurityGroupId) if err != nil { - p.Warn("cannot retrieve groupname: %v", err) + params.Printer.Warn("cannot retrieve groupname: %v", err) groupLabel = model.SecurityGroupId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update the security group %q?", groupLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("update security group: %w", err) } - p.Info("Updated security group \"%v\" for %q\n", utils.PtrString(resp.Name), projectLabel) + params.Printer.Info("Updated security group \"%v\" for %q\n", utils.PtrString(resp.Name), projectLabel) return nil }, diff --git a/internal/cmd/security-group/update/update_test.go b/internal/cmd/security-group/update/update_test.go index f27cbfc25..3bc10055a 100644 --- a/internal/cmd/security-group/update/update_test.go +++ b/internal/cmd/security-group/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -204,7 +205,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } diff --git a/internal/cmd/server/backup/backup.go b/internal/cmd/server/backup/backup.go index 8936ae65f..e29887143 100644 --- a/internal/cmd/server/backup/backup.go +++ b/internal/cmd/server/backup/backup.go @@ -1,6 +1,7 @@ package backup import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/create" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/describe" @@ -11,13 +12,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule" volumebackup "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/volume-backup" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for server backups", @@ -25,18 +25,18 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(enable.NewCmd(p)) - cmd.AddCommand(disable.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(schedule.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(restore.NewCmd(p)) - cmd.AddCommand(del.NewCmd(p)) - cmd.AddCommand(volumebackup.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(schedule.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(restore.NewCmd(params)) + cmd.AddCommand(del.NewCmd(params)) + cmd.AddCommand(volumebackup.NewCmd(params)) } diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index 28243cdc8..ba2aa95c5 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server Backup.", @@ -56,23 +57,23 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a Backup for server %s?", model.ServerId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -96,7 +97,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server Backup: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/create/create_test.go b/internal/cmd/server/backup/create/create_test.go index b0d547f44..71a50ff6b 100644 --- a/internal/cmd/server/backup/create/create_test.go +++ b/internal/cmd/server/backup/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -131,7 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -228,7 +229,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/delete/delete.go b/internal/cmd/server/backup/delete/delete.go index 7805d20c0..a30dec646 100644 --- a/internal/cmd/server/backup/delete/delete.go +++ b/internal/cmd/server/backup/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", backupIdArg), Short: "Deletes a Server Backup.", @@ -41,20 +42,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete server backup %q? (This cannot be undone)", model.BackupId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Server Backup: %w", err) } - p.Info("Triggered deletion of server backup %q\n", model.BackupId) + params.Printer.Info("Triggered deletion of server backup %q\n", model.BackupId) return nil }, } diff --git a/internal/cmd/server/backup/delete/delete_test.go b/internal/cmd/server/backup/delete/delete_test.go index d1f455b3d..d1de3562f 100644 --- a/internal/cmd/server/backup/delete/delete_test.go +++ b/internal/cmd/server/backup/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/backup/describe/describe.go b/internal/cmd/server/backup/describe/describe.go index b1fe36663..9b3ad9247 100644 --- a/internal/cmd/server/backup/describe/describe.go +++ b/internal/cmd/server/backup/describe/describe.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { BackupId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Shows details of a Server Backup", @@ -48,12 +49,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server backup: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/describe/describe_test.go b/internal/cmd/server/backup/describe/describe_test.go index 2760e7e7c..c706734f1 100644 --- a/internal/cmd/server/backup/describe/describe_test.go +++ b/internal/cmd/server/backup/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -236,7 +237,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backup); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index 0a76151a5..a61dce696 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables Server Backup service", @@ -41,23 +42,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -68,13 +69,13 @@ func NewCmd(p *print.Printer) *cobra.Command { return err } if !canDisable { - p.Info("Cannot disable backup service for server %s - existing backups or existing backup schedules found\n", serverLabel) + params.Printer.Info("Cannot disable backup service for server %s - existing backups or existing backup schedules found\n", serverLabel) return nil } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disable server backup service: %w", err) } - p.Info("Disabled Server Backup service for server %s\n", serverLabel) + params.Printer.Info("Disabled Server Backup service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index 9f0f48e1b..89265e748 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables Server Backup service", @@ -41,23 +42,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - p.Info("Enabled backup service for server %s\n", serverLabel) + params.Printer.Info("Enabled backup service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index d7cbfeb6f..ccd29a624 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server backups", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -69,15 +70,15 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(backups) == 0 { serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } } - p.Info("No backups found for server %s\n", serverLabel) + params.Printer.Info("No backups found for server %s\n", serverLabel) return nil } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(backups) > int(*model.Limit) { backups = backups[:*model.Limit] } - return outputResult(p, model.OutputFormat, backups) + return outputResult(params.Printer, model.OutputFormat, backups) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/list/list_test.go b/internal/cmd/server/backup/list/list_test.go index c9f5b9c2e..218a17c6e 100644 --- a/internal/cmd/server/backup/list/list_test.go +++ b/internal/cmd/server/backup/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -117,7 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -214,7 +215,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backups); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/restore/restore.go b/internal/cmd/server/backup/restore/restore.go index 67bbff395..445680053 100644 --- a/internal/cmd/server/backup/restore/restore.go +++ b/internal/cmd/server/backup/restore/restore.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", backupIdArg), Short: "Restores a Server Backup.", @@ -50,20 +51,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to restore server backup %q? (This cannot be undone)", model.BackupId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("restore Server Backup: %w", err) } - p.Info("Triggered restoring of server backup %q\n", model.BackupId) + params.Printer.Info("Triggered restoring of server backup %q\n", model.BackupId) return nil }, } diff --git a/internal/cmd/server/backup/restore/restore_test.go b/internal/cmd/server/backup/restore/restore_test.go index c352d56cd..ff14455c2 100644 --- a/internal/cmd/server/backup/restore/restore_test.go +++ b/internal/cmd/server/backup/restore/restore_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -132,7 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index 716e0d5c0..09b834c50 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -47,7 +48,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server Backup Schedule", @@ -64,23 +65,23 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -88,7 +89,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a Backup Schedule for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -104,7 +105,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server Backup Schedule: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/schedule/create/create_test.go b/internal/cmd/server/backup/schedule/create/create_test.go index 00ec85560..ceb92188b 100644 --- a/internal/cmd/server/backup/schedule/create/create_test.go +++ b/internal/cmd/server/backup/schedule/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -238,7 +239,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/schedule/delete/delete.go b/internal/cmd/server/backup/schedule/delete/delete.go index e2dcaa7a0..69dc81579 100644 --- a/internal/cmd/server/backup/schedule/delete/delete.go +++ b/internal/cmd/server/backup/schedule/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", scheduleIdArg), Short: "Deletes a Server Backup Schedule", @@ -42,23 +43,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete server backup schedule %q? (This cannot be undone)", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Server Backup Schedule: %w", err) } - p.Info("Deleted server backup schedule %q\n", model.ScheduleId) + params.Printer.Info("Deleted server backup schedule %q\n", model.ScheduleId) return nil }, } diff --git a/internal/cmd/server/backup/schedule/delete/delete_test.go b/internal/cmd/server/backup/schedule/delete/delete_test.go index 7915f1c07..26c218485 100644 --- a/internal/cmd/server/backup/schedule/delete/delete_test.go +++ b/internal/cmd/server/backup/schedule/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/backup/schedule/describe/describe.go b/internal/cmd/server/backup/schedule/describe/describe.go index 990032499..cc838e0a8 100644 --- a/internal/cmd/server/backup/schedule/describe/describe.go +++ b/internal/cmd/server/backup/schedule/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { BackupScheduleId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupScheduleIdArg), Short: "Shows details of a Server Backup Schedule", @@ -47,12 +48,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server backup schedule: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/schedule/describe/describe_test.go b/internal/cmd/server/backup/schedule/describe/describe_test.go index f94627dc3..edc952d18 100644 --- a/internal/cmd/server/backup/schedule/describe/describe_test.go +++ b/internal/cmd/server/backup/schedule/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -263,7 +264,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index 2920e9853..3ad1c840e 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server backup schedules", @@ -48,23 +49,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } schedules := *resp.Items if len(schedules) == 0 { - p.Info("No backup schedules found for server %s\n", serverLabel) + params.Printer.Info("No backup schedules found for server %s\n", serverLabel) return nil } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(schedules) > int(*model.Limit) { schedules = schedules[:*model.Limit] } - return outputResult(p, model.OutputFormat, schedules) + return outputResult(params.Printer, model.OutputFormat, schedules) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/schedule/list/list_test.go b/internal/cmd/server/backup/schedule/list/list_test.go index 6c055bcef..c88ec459e 100644 --- a/internal/cmd/server/backup/schedule/list/list_test.go +++ b/internal/cmd/server/backup/schedule/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -117,7 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -225,7 +226,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedules); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/schedule/schedule.go b/internal/cmd/server/backup/schedule/schedule.go index 423486fde..1ce797c4f 100644 --- a/internal/cmd/server/backup/schedule/schedule.go +++ b/internal/cmd/server/backup/schedule/schedule.go @@ -1,19 +1,19 @@ package schedule import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/create" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "schedule", Short: "Provides functionality for Server Backup Schedule", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(del.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(del.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/server/backup/schedule/update/update.go b/internal/cmd/server/backup/schedule/update/update.go index 9885cc2a1..4bc895fc0 100644 --- a/internal/cmd/server/backup/schedule/update/update.go +++ b/internal/cmd/server/backup/schedule/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -48,7 +49,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", scheduleIdArg), Short: "Updates a Server Backup Schedule", @@ -65,26 +66,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } currentBackupSchedule, err := apiClient.GetBackupScheduleExecute(ctx, model.ProjectId, model.ServerId, model.Region, model.BackupScheduleId) if err != nil { - p.Debug(print.ErrorLevel, "get current server backup schedule: %v", err) + params.Printer.Debug(print.ErrorLevel, "get current server backup schedule: %v", err) return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update Server Backup Schedule %q?", model.BackupScheduleId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Server Backup Schedule: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/backup/schedule/update/update_test.go b/internal/cmd/server/backup/schedule/update/update_test.go index 8b127b235..263a9188a 100644 --- a/internal/cmd/server/backup/schedule/update/update_test.go +++ b/internal/cmd/server/backup/schedule/update/update_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -183,7 +184,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -295,7 +296,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/volume-backup/delete/delete.go b/internal/cmd/server/backup/volume-backup/delete/delete.go index 9e3de47a8..1b924fe85 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", volumeBackupIdArg), Short: "Deletes a Server Volume Backup.", @@ -43,20 +44,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete server volume backup %q? (This cannot be undone)", model.VolumeId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Server Volume Backup: %w", err) } - p.Info("Triggered deletion of server volume backup %q\n", model.VolumeId) + params.Printer.Info("Triggered deletion of server volume backup %q\n", model.VolumeId) return nil }, } diff --git a/internal/cmd/server/backup/volume-backup/delete/delete_test.go b/internal/cmd/server/backup/volume-backup/delete/delete_test.go index 59af68770..34859934a 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete_test.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -133,7 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/backup/volume-backup/restore/restore.go b/internal/cmd/server/backup/volume-backup/restore/restore.go index 8e0881d1f..db7c6b543 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { RestoreVolumeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", volumeBackupIdArg), Short: "Restore a Server Volume Backup to a volume.", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to restore volume backup %q? (This cannot be undone)", model.VolumeBackupId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("restore Server Volume Backup: %w", err) } - p.Info("Triggered restoring of server volume backup %q\n", model.VolumeBackupId) + params.Printer.Info("Triggered restoring of server volume backup %q\n", model.VolumeBackupId) return nil }, } diff --git a/internal/cmd/server/backup/volume-backup/restore/restore_test.go b/internal/cmd/server/backup/volume-backup/restore/restore_test.go index cb3701baa..21da9b128 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore_test.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -139,7 +140,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/backup/volume-backup/volumebackup.go b/internal/cmd/server/backup/volume-backup/volumebackup.go index 7a4024eb4..e0d3b6d62 100644 --- a/internal/cmd/server/backup/volume-backup/volumebackup.go +++ b/internal/cmd/server/backup/volume-backup/volumebackup.go @@ -1,16 +1,16 @@ package volumebackup import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/volume-backup/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/volume-backup/restore" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "volume-backup", Short: "Provides functionality for Server Backup Volume Backups", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(del.NewCmd(p)) - cmd.AddCommand(restore.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(del.NewCmd(params)) + cmd.AddCommand(restore.NewCmd(params)) } diff --git a/internal/cmd/server/command/command.go b/internal/cmd/server/command/command.go index 9347fb111..e6c2d79a8 100644 --- a/internal/cmd/server/command/command.go +++ b/internal/cmd/server/command/command.go @@ -1,18 +1,18 @@ package command import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/create" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/template" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "command", Short: "Provides functionality for Server Command", @@ -20,13 +20,13 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(template.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(template.NewCmd(params)) } diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index ed65528ac..748d50b9b 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Params *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server Command", @@ -52,23 +53,23 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a Command for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -92,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server Command: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/command/create/create_test.go b/internal/cmd/server/command/create/create_test.go index b7b3657ca..eed029584 100644 --- a/internal/cmd/server/command/create/create_test.go +++ b/internal/cmd/server/command/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -127,7 +128,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -223,7 +224,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/describe/describe.go b/internal/cmd/server/command/describe/describe.go index 6eb4359c7..a93d66988 100644 --- a/internal/cmd/server/command/describe/describe.go +++ b/internal/cmd/server/command/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CommandId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", commandIdArg), Short: "Shows details of a Server Command", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server command: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/command/describe/describe_test.go b/internal/cmd/server/command/describe/describe_test.go index c9d1f3d86..59363f0e7 100644 --- a/internal/cmd/server/command/describe/describe_test.go +++ b/internal/cmd/server/command/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -163,7 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -261,7 +262,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.command); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index 4a00abf57..f5deb62d1 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server commands", @@ -48,23 +49,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("list server commands: %w", err) } if commands := resp.Items; commands == nil || len(*commands) == 0 { - p.Info("No commands found for server %s\n", serverLabel) + params.Printer.Info("No commands found for server %s\n", serverLabel) return nil } commands := *resp.Items @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(commands) > int(*model.Limit) { commands = commands[:*model.Limit] } - return outputResult(p, model.OutputFormat, commands) + return outputResult(params.Printer, model.OutputFormat, commands) }, } configureFlags(cmd) diff --git a/internal/cmd/server/command/list/list_test.go b/internal/cmd/server/command/list/list_test.go index 6740fac38..7d6ce40fb 100644 --- a/internal/cmd/server/command/list/list_test.go +++ b/internal/cmd/server/command/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -120,7 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.commands); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index 816bfa8be..a694b9cad 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { CommandTemplateName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", commandTemplateNameArg), Short: "Shows details of a Server Command Template", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server command template: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/command/template/describe/describe_test.go b/internal/cmd/server/command/template/describe/describe_test.go index 85b97a8ea..9fa7ba208 100644 --- a/internal/cmd/server/command/template/describe/describe_test.go +++ b/internal/cmd/server/command/template/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -163,7 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -261,7 +262,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.commandTemplate); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index 079c4f5f7..439df690d 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server command templates", @@ -44,13 +45,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -62,7 +63,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("list server command templates: %w", err) } if templates := resp.Items; templates == nil || len(*templates) == 0 { - p.Info("No commands templates found\n") + params.Printer.Info("No commands templates found\n") return nil } templates := *resp.Items @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(templates) > int(*model.Limit) { templates = templates[:*model.Limit] } - return outputResult(p, model.OutputFormat, templates) + return outputResult(params.Printer, model.OutputFormat, templates) }, } configureFlags(cmd) diff --git a/internal/cmd/server/command/template/list/list_test.go b/internal/cmd/server/command/template/list/list_test.go index 309716c16..0ff491e5d 100644 --- a/internal/cmd/server/command/template/list/list_test.go +++ b/internal/cmd/server/command/template/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -111,7 +112,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -207,7 +208,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.templates); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/template/template.go b/internal/cmd/server/command/template/template.go index 03f9b13da..6b41f434b 100644 --- a/internal/cmd/server/command/template/template.go +++ b/internal/cmd/server/command/template/template.go @@ -1,16 +1,16 @@ package template import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/template/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/template/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "template", Short: "Provides functionality for Server Command Template", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index a9964619c..35e5f814a 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -7,6 +7,7 @@ import ( "net/url" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("console %s", serverIdArg), Short: "Gets a URL for server remote console", @@ -47,20 +48,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -73,7 +74,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("server console: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, *resp) }, } return cmd diff --git a/internal/cmd/server/console/console_test.go b/internal/cmd/server/console/console_test.go index 4d9b9e6c1..9b6c0413c 100644 --- a/internal/cmd/server/console/console_test.go +++ b/internal/cmd/server/console/console_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -234,7 +235,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.serverUrl); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 69cfc627b..25544b3c8 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -65,7 +66,7 @@ type inputModel struct { Volumes *[]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a server", @@ -111,26 +112,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a server for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -146,7 +147,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating server") _, err = wait.CreateServerWaitHandler(ctx, apiClient, model.ProjectId, serverId).WaitWithContext(ctx) if err != nil { @@ -155,7 +156,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/create/create_test.go b/internal/cmd/server/create/create_test.go index bf8f815d5..1548691d4 100644 --- a/internal/cmd/server/create/create_test.go +++ b/internal/cmd/server/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -326,7 +327,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -434,7 +435,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.server); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index 53a01de69..f51fab931 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("deallocate %s", serverIdArg), Short: "Deallocates an existing server", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to deallocate server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deallocating server") _, err = wait.DeallocateServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deallocation of" } - p.Info("%s server %q\n", operationState, serverLabel) + params.Printer.Info("%s server %q\n", operationState, serverLabel) return nil }, diff --git a/internal/cmd/server/deallocate/deallocate_test.go b/internal/cmd/server/deallocate/deallocate_test.go index 6ededf983..379fc3a58 100644 --- a/internal/cmd/server/deallocate/deallocate_test.go +++ b/internal/cmd/server/deallocate/deallocate_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -128,7 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index 77ad35479..d9a366c2e 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", serverIdArg), Short: "Deletes a server", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ProjectId @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting server") _, err = wait.DeleteServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -94,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s server %q\n", operationState, serverLabel) + params.Printer.Info("%s server %q\n", operationState, serverLabel) return nil }, } diff --git a/internal/cmd/server/delete/delete_test.go b/internal/cmd/server/delete/delete_test.go index 3b7c0ba31..1c04e26cb 100644 --- a/internal/cmd/server/delete/delete_test.go +++ b/internal/cmd/server/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/describe/describe.go b/internal/cmd/server/describe/describe.go index d45086fb2..4873e688c 100644 --- a/internal/cmd/server/describe/describe.go +++ b/internal/cmd/server/describe/describe.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", serverIdArg), Short: "Shows details of a server", @@ -47,13 +48,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/server/describe/describe_test.go b/internal/cmd/server/describe/describe_test.go index d16a3ec04..86052e8b7 100644 --- a/internal/cmd/server/describe/describe_test.go +++ b/internal/cmd/server/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -139,7 +140,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -243,7 +244,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.server); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index db72cdb26..867a0e233 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all servers of a project", @@ -58,13 +59,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,12 +78,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No servers found for project %q\n", projectLabel) + params.Printer.Info("No servers found for project %q\n", projectLabel) return nil } @@ -92,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/server/list/list_test.go b/internal/cmd/server/list/list_test.go index a8dfe0e1e..64fe0ddb4 100644 --- a/internal/cmd/server/list/list_test.go +++ b/internal/cmd/server/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -133,7 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -221,7 +222,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.servers); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index 646417b42..76e80cc67 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Length *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("log %s", serverIdArg), Short: "Gets server console log", @@ -56,20 +57,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -88,10 +89,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(lines) > int(*model.Length) { // Truncate output and show most recent logs start := len(lines) - int(*model.Length) - return outputResult(p, model.OutputFormat, serverLabel, strings.Join(lines[start:], "\n")) + return outputResult(params.Printer, model.OutputFormat, serverLabel, strings.Join(lines[start:], "\n")) } - return outputResult(p, model.OutputFormat, serverLabel, log) + return outputResult(params.Printer, model.OutputFormat, serverLabel, log) }, } configureFlags(cmd) diff --git a/internal/cmd/server/log/log_test.go b/internal/cmd/server/log/log_test.go index 50ce7c723..0ebc57bdc 100644 --- a/internal/cmd/server/log/log_test.go +++ b/internal/cmd/server/log/log_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -239,7 +240,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.log); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index 8c5d99e38..018bf0ad7 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { MachineType string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", machineTypeArg), Short: "Shows details of a server machine type", @@ -47,13 +48,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server machine type: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/server/machine-type/describe/describe_test.go b/internal/cmd/server/machine-type/describe/describe_test.go index 32f6d9a0b..20e47affc 100644 --- a/internal/cmd/server/machine-type/describe/describe_test.go +++ b/internal/cmd/server/machine-type/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -222,7 +223,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.machineType); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 19be072d3..2e5a20bde 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ const ( limitFlag = "limit" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Get list of all machine types available in a project", @@ -52,13 +53,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,12 +72,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No machine-types found for project %q\n", projectLabel) + params.Printer.Info("No machine-types found for project %q\n", projectLabel) return nil } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { *resp.Items = (*resp.Items)[:*model.Limit] } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } diff --git a/internal/cmd/server/machine-type/list/list_test.go b/internal/cmd/server/machine-type/list/list_test.go index a38d4f386..8472b596d 100644 --- a/internal/cmd/server/machine-type/list/list_test.go +++ b/internal/cmd/server/machine-type/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -118,7 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -206,7 +207,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.machineTypes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/machine-type/machine-type.go b/internal/cmd/server/machine-type/machine-type.go index 51c33d236..9482a6143 100644 --- a/internal/cmd/server/machine-type/machine-type.go +++ b/internal/cmd/server/machine-type/machine-type.go @@ -1,16 +1,16 @@ package machinetype import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/machine-type/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/machine-type/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "machine-type", Short: "Provides functionality for server machine types available inside a project", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index b2f987f27..68e670159 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -35,7 +36,7 @@ type inputModel struct { Create *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "attach", Short: "Attaches a network interface to a server", @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } @@ -74,12 +75,12 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Create != nil && *model.Create { networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, *model.NetworkId) if err != nil { - p.Debug(print.ErrorLevel, "get network name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a network interface for network %q and attach it to server %q?", networkLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -90,13 +91,13 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("create and attach network interface: %w", err) } - p.Info("Created a network interface for network %q and attached it to server %q\n", networkLabel, serverLabel) + params.Printer.Info("Created a network interface for network %q and attached it to server %q\n", networkLabel, serverLabel) return nil } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to attach network interface %q to server %q?", *model.NicId, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -107,7 +108,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("attach network interface: %w", err) } - p.Info("Attached network interface %q to server %q\n", utils.PtrString(model.NicId), serverLabel) + params.Printer.Info("Attached network interface %q to server %q\n", utils.PtrString(model.NicId), serverLabel) return nil }, diff --git a/internal/cmd/server/network-interface/attach/attach_test.go b/internal/cmd/server/network-interface/attach/attach_test.go index 2adeff447..6e5a00011 100644 --- a/internal/cmd/server/network-interface/attach/attach_test.go +++ b/internal/cmd/server/network-interface/attach/attach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -199,7 +200,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index f0c735cb1..6a2517e50 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -35,7 +36,7 @@ type inputModel struct { Delete *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "detach", Short: "Detaches a network interface from a server", @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -76,12 +77,12 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Delete != nil && *model.Delete { networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, *model.NetworkId) if err != nil { - p.Debug(print.ErrorLevel, "get network name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to detach and delete all network interfaces of network %q from server %q? (This cannot be undone)", networkLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -92,13 +93,13 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("detach and delete network interfaces: %w", err) } - p.Info("Detached and deleted all network interfaces of network %q from server %q\n", networkLabel, serverLabel) + params.Printer.Info("Detached and deleted all network interfaces of network %q from server %q\n", networkLabel, serverLabel) return nil } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to detach network interface %q from server %q?", *model.NicId, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -109,7 +110,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("detach network interface: %w", err) } - p.Info("Detached network interface %q from server %q\n", utils.PtrString(model.NicId), serverLabel) + params.Printer.Info("Detached network interface %q from server %q\n", utils.PtrString(model.NicId), serverLabel) return nil }, diff --git a/internal/cmd/server/network-interface/detach/detach_test.go b/internal/cmd/server/network-interface/detach/detach_test.go index df408bbb8..cc60c9912 100644 --- a/internal/cmd/server/network-interface/detach/detach_test.go +++ b/internal/cmd/server/network-interface/detach/detach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -199,7 +200,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index eb3210cf4..62d4f6c8b 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all attached network interfaces of a server", @@ -53,13 +54,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -74,12 +75,12 @@ func NewCmd(p *print.Printer) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId } - p.Info("No attached network interfaces found for server %q\n", serverLabel) + params.Printer.Info("No attached network interfaces found for server %q\n", serverLabel) return nil } @@ -89,7 +90,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, *model.ServerId, items) + return outputResult(params.Printer, model.OutputFormat, *model.ServerId, items) }, } configureFlags(cmd) diff --git a/internal/cmd/server/network-interface/list/list_test.go b/internal/cmd/server/network-interface/list/list_test.go index f627b1d19..8d2c90f86 100644 --- a/internal/cmd/server/network-interface/list/list_test.go +++ b/internal/cmd/server/network-interface/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -235,7 +236,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverId, tt.args.serverNics); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/network-interface/network-interface.go b/internal/cmd/server/network-interface/network-interface.go index 703e48eba..998ee07d3 100644 --- a/internal/cmd/server/network-interface/network-interface.go +++ b/internal/cmd/server/network-interface/network-interface.go @@ -1,17 +1,17 @@ package networkinterface import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/network-interface/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/network-interface/detach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/network-interface/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-interface", Short: "Allows attaching/detaching network interfaces to servers", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(attach.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(detach.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(attach.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(detach.NewCmd(params)) } diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 71845bc2a..0bb65907d 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { MaintenanceWindow int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server os-update.", @@ -51,23 +52,23 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a os-update for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server os-update: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/create/create_test.go b/internal/cmd/server/os-update/create/create_test.go index 9dd635e70..78e914882 100644 --- a/internal/cmd/server/os-update/create/create_test.go +++ b/internal/cmd/server/os-update/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -226,7 +227,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/describe/describe.go b/internal/cmd/server/os-update/describe/describe.go index 7260131ff..e722e3994 100644 --- a/internal/cmd/server/os-update/describe/describe.go +++ b/internal/cmd/server/os-update/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { UpdateId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", updateIdArg), Short: "Shows details of a Server os-update", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server os-update: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/describe/describe_test.go b/internal/cmd/server/os-update/describe/describe_test.go index 741bbe6dc..0a859c415 100644 --- a/internal/cmd/server/os-update/describe/describe_test.go +++ b/internal/cmd/server/os-update/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -133,7 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -231,7 +232,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.update); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index f0270b0cd..153754db3 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables server os-update service", @@ -40,23 +41,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disable the os-update service for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("disable server os-update service: %w", err) } - p.Info("Disabled Server os-update service for server %s\n", serverLabel) + params.Printer.Info("Disabled Server os-update service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index c255c778e..ad0467bb5 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -5,6 +5,7 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables Server os-update service", @@ -41,23 +42,23 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to enable the server os-update service for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - p.Info("Enabled os-update service for server %s\n", serverLabel) + params.Printer.Info("Enabled os-update service for server %s\n", serverLabel) return nil }, } diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index e1435badc..ed7f183b7 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server os-updates", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -71,15 +72,15 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(updates) == 0 { serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } } - p.Info("No os-updates found for server %s\n", serverLabel) + params.Printer.Info("No os-updates found for server %s\n", serverLabel) return nil } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(updates) > int(*model.Limit) { updates = updates[:*model.Limit] } - return outputResult(p, model.OutputFormat, updates) + return outputResult(params.Printer, model.OutputFormat, updates) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/list/list_test.go b/internal/cmd/server/os-update/list/list_test.go index 36205f88d..078f7ca0a 100644 --- a/internal/cmd/server/os-update/list/list_test.go +++ b/internal/cmd/server/os-update/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -120,7 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.updates); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/os-update.go b/internal/cmd/server/os-update/os-update.go index a9d3ec8fc..516d7ce06 100644 --- a/internal/cmd/server/os-update/os-update.go +++ b/internal/cmd/server/os-update/os-update.go @@ -1,6 +1,7 @@ package osupdate import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/create" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/disable" @@ -8,13 +9,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "os-update", Short: "Provides functionality for managed server updates", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(enable.NewCmd(p)) - cmd.AddCommand(disable.NewCmd(p)) - cmd.AddCommand(schedule.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) + cmd.AddCommand(schedule.NewCmd(params)) } diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index 2f30e876f..f64b10728 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -43,7 +44,7 @@ type inputModel struct { MaintenanceWindow int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server os-update Schedule", @@ -60,23 +61,23 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a os-update Schedule for server %s?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -100,7 +101,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create Server os-update Schedule: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/schedule/create/create_test.go b/internal/cmd/server/os-update/schedule/create/create_test.go index 7d084516e..2cdb00f75 100644 --- a/internal/cmd/server/os-update/schedule/create/create_test.go +++ b/internal/cmd/server/os-update/schedule/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -136,7 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -233,7 +234,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/schedule/delete/delete.go b/internal/cmd/server/os-update/schedule/delete/delete.go index 855690fa4..a439bf76a 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete.go +++ b/internal/cmd/server/os-update/schedule/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", scheduleIdArg), Short: "Deletes a Server os-update Schedule", @@ -40,20 +41,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete server os-update schedule %q? (This cannot be undone)", model.ScheduleId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete Server os-update Schedule: %w", err) } - p.Info("Deleted server os-update schedule %q\n", model.ScheduleId) + params.Printer.Info("Deleted server os-update schedule %q\n", model.ScheduleId) return nil }, } diff --git a/internal/cmd/server/os-update/schedule/delete/delete_test.go b/internal/cmd/server/os-update/schedule/delete/delete_test.go index 040aa61f7..eb005e164 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete_test.go +++ b/internal/cmd/server/os-update/schedule/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -133,7 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/os-update/schedule/describe/describe.go b/internal/cmd/server/os-update/schedule/describe/describe.go index 60aa9431c..f66c9b5d2 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/server/os-update/schedule/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ScheduleId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", scheduleIdArg), Short: "Shows details of a Server os-update Schedule", @@ -46,12 +47,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read server os-update schedule: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/schedule/describe/describe_test.go b/internal/cmd/server/os-update/schedule/describe/describe_test.go index 5928e712b..178585383 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe_test.go +++ b/internal/cmd/server/os-update/schedule/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -133,7 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -231,7 +232,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index 562b30665..b14299303 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server os-update schedules", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -69,15 +70,15 @@ func NewCmd(p *print.Printer) *cobra.Command { if len(schedules) == 0 { serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(p); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { serverLabel = serverName } } - p.Info("No os-update schedules found for server %s\n", serverLabel) + params.Printer.Info("No os-update schedules found for server %s\n", serverLabel) return nil } @@ -85,7 +86,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Limit != nil && len(schedules) > int(*model.Limit) { schedules = schedules[:*model.Limit] } - return outputResult(p, model.OutputFormat, schedules) + return outputResult(params.Printer, model.OutputFormat, schedules) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/schedule/list/list_test.go b/internal/cmd/server/os-update/schedule/list/list_test.go index d29d3dd5f..57aa1c0dc 100644 --- a/internal/cmd/server/os-update/schedule/list/list_test.go +++ b/internal/cmd/server/os-update/schedule/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -120,7 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedules); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/schedule/schedule.go b/internal/cmd/server/os-update/schedule/schedule.go index 9f051ced0..3ffeb36ea 100644 --- a/internal/cmd/server/os-update/schedule/schedule.go +++ b/internal/cmd/server/os-update/schedule/schedule.go @@ -1,19 +1,19 @@ package schedule import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/create" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "schedule", Short: "Provides functionality for Server os-update Schedule", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(del.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(del.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index e698f21f7..bae09473e 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -43,7 +44,7 @@ type inputModel struct { MaintenanceWindow *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", scheduleIdArg), Short: "Updates a Server os-update Schedule", @@ -57,26 +58,26 @@ func NewCmd(p *print.Printer) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } currentSchedule, err := apiClient.GetUpdateScheduleExecute(ctx, model.ProjectId, model.ServerId, model.ScheduleId, model.Region) if err != nil { - p.Debug(print.ErrorLevel, "get current server os-update schedule: %v", err) + params.Printer.Debug(print.ErrorLevel, "get current server os-update schedule: %v", err) return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update Server os-update Schedule %q?", model.ScheduleId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -92,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update Server os-update Schedule: %w", err) } - return outputResult(p, model.OutputFormat, *resp) + return outputResult(params.Printer, model.OutputFormat, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/os-update/schedule/update/update_test.go b/internal/cmd/server/os-update/schedule/update/update_test.go index 63ab21239..a19c77958 100644 --- a/internal/cmd/server/os-update/schedule/update/update_test.go +++ b/internal/cmd/server/os-update/schedule/update/update_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -173,7 +174,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -285,7 +286,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 848a913b4..8caecd342 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("attach %s", publicIpIdArg), Short: "Attaches a public IP to a server", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { )), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { - p.Debug(print.ErrorLevel, "get public ip name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get public ip name: %v", err) publicIpLabel = model.PublicIpId } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -71,7 +72,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to attach public IP %q to server %q?", publicIpLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("attach server to public ip: %w", err) } - p.Info("Attached public IP %q to server %q\n", publicIpLabel, serverLabel) + params.Printer.Info("Attached public IP %q to server %q\n", publicIpLabel, serverLabel) return nil }, } diff --git a/internal/cmd/server/public-ip/attach/attach_test.go b/internal/cmd/server/public-ip/attach/attach_test.go index b8a80d6b2..c58f7b280 100644 --- a/internal/cmd/server/public-ip/attach/attach_test.go +++ b/internal/cmd/server/public-ip/attach/attach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -147,7 +148,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index 809b76759..c8066db67 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("detach %s", publicIpIdArg), Short: "Detaches a public IP from a server", @@ -43,20 +44,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) if err != nil { - p.Debug(print.ErrorLevel, "get public ip: %v", err) + params.Printer.Debug(print.ErrorLevel, "get public ip: %v", err) publicIpLabel = model.PublicIpId } else if publicIpLabel == "" { publicIpLabel = model.PublicIpId @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to detach public IP %q from server %q?", publicIpLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("detach public ip from server: %w", err) } - p.Info("Detached public IP %q from server %q\n", publicIpLabel, serverLabel) + params.Printer.Info("Detached public IP %q from server %q\n", publicIpLabel, serverLabel) return nil }, diff --git a/internal/cmd/server/public-ip/detach/detach_test.go b/internal/cmd/server/public-ip/detach/detach_test.go index b7ed5c286..8a46591a7 100644 --- a/internal/cmd/server/public-ip/detach/detach_test.go +++ b/internal/cmd/server/public-ip/detach/detach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -146,7 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/public-ip/public_ip.go b/internal/cmd/server/public-ip/public_ip.go index 0bfafbcbd..494993ce8 100644 --- a/internal/cmd/server/public-ip/public_ip.go +++ b/internal/cmd/server/public-ip/public_ip.go @@ -1,16 +1,16 @@ package publicip import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/public-ip/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/public-ip/detach" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "public-ip", Short: "Allows attaching/detaching public IPs to servers", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(attach.NewCmd(p)) - cmd.AddCommand(detach.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(attach.NewCmd(params)) + cmd.AddCommand(detach.NewCmd(params)) } diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index 80aed47b3..465adaaa1 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { HardReboot bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reboot %s", serverIdArg), Short: "Reboots a server", @@ -50,27 +51,27 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to reboot server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("server reboot: %w", err) } - p.Info("Server %q rebooted\n", serverLabel) + params.Printer.Info("Server %q rebooted\n", serverLabel) return nil }, diff --git a/internal/cmd/server/reboot/reboot_test.go b/internal/cmd/server/reboot/reboot_test.go index c4444fa85..77e99f506 100644 --- a/internal/cmd/server/reboot/reboot_test.go +++ b/internal/cmd/server/reboot/reboot_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -130,7 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index 81eabcab2..73aeae948 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { ImageId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("rescue %s", serverIdArg), Short: "Rescues an existing server", @@ -46,20 +47,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to rescue server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Rescuing server") _, err = wait.RescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered rescue of" } - p.Info("%s server %q. Image %q is used as temporary boot image\n", operationState, serverLabel, utils.PtrString(model.ImageId)) + params.Printer.Info("%s server %q. Image %q is used as temporary boot image\n", operationState, serverLabel, utils.PtrString(model.ImageId)) return nil }, diff --git a/internal/cmd/server/rescue/rescue_test.go b/internal/cmd/server/rescue/rescue_test.go index 9d17daf78..8a5695fd9 100644 --- a/internal/cmd/server/rescue/rescue_test.go +++ b/internal/cmd/server/rescue/rescue_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -145,7 +146,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index d0112b723..8d3f19b3e 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { MachineType *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("resize %s", serverIdArg), Short: "Resizes the server to the given machine type", @@ -46,20 +47,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to resize server %q to machine type %q?", serverLabel, *model.MachineType) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Resizing server") _, err = wait.ResizeServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered resize of" } - p.Info("%s server %q\n", operationState, serverLabel) + params.Printer.Info("%s server %q\n", operationState, serverLabel) return nil }, diff --git a/internal/cmd/server/resize/resize_test.go b/internal/cmd/server/resize/resize_test.go index a93d8fdc1..ee94cfe6e 100644 --- a/internal/cmd/server/resize/resize_test.go +++ b/internal/cmd/server/resize/resize_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -144,7 +145,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/server.go b/internal/cmd/server/server.go index 209b19e1b..ac3101b41 100644 --- a/internal/cmd/server/server.go +++ b/internal/cmd/server/server.go @@ -1,6 +1,7 @@ package server import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command" "github.com/stackitcloud/stackit-cli/internal/cmd/server/console" @@ -25,13 +26,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "server", Short: "Provides functionality for servers", @@ -39,31 +39,31 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(backup.NewCmd(p)) - cmd.AddCommand(command.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(publicip.NewCmd(p)) - cmd.AddCommand(serviceaccount.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(volume.NewCmd(p)) - cmd.AddCommand(networkinterface.NewCmd(p)) - cmd.AddCommand(console.NewCmd(p)) - cmd.AddCommand(log.NewCmd(p)) - cmd.AddCommand(start.NewCmd(p)) - cmd.AddCommand(stop.NewCmd(p)) - cmd.AddCommand(reboot.NewCmd(p)) - cmd.AddCommand(deallocate.NewCmd(p)) - cmd.AddCommand(resize.NewCmd(p)) - cmd.AddCommand(rescue.NewCmd(p)) - cmd.AddCommand(unrescue.NewCmd(p)) - cmd.AddCommand(osUpdate.NewCmd(p)) - cmd.AddCommand(machinetype.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(backup.NewCmd(params)) + cmd.AddCommand(command.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(publicip.NewCmd(params)) + cmd.AddCommand(serviceaccount.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(volume.NewCmd(params)) + cmd.AddCommand(networkinterface.NewCmd(params)) + cmd.AddCommand(console.NewCmd(params)) + cmd.AddCommand(log.NewCmd(params)) + cmd.AddCommand(start.NewCmd(params)) + cmd.AddCommand(stop.NewCmd(params)) + cmd.AddCommand(reboot.NewCmd(params)) + cmd.AddCommand(deallocate.NewCmd(params)) + cmd.AddCommand(resize.NewCmd(params)) + cmd.AddCommand(rescue.NewCmd(params)) + cmd.AddCommand(unrescue.NewCmd(params)) + cmd.AddCommand(osUpdate.NewCmd(params)) + cmd.AddCommand(machinetype.NewCmd(params)) } diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index 49f7a1aa4..e4e29042c 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { ServiceAccMail string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("attach %s", serviceAccMailArg), Short: "Attach a service account to a server", @@ -45,19 +46,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to attach service account %q to server %q?", model.ServiceAccMail, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("attach service account to server: %w", err) } - return outputResult(p, model.OutputFormat, model.ServiceAccMail, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, model.ServiceAccMail, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/service-account/attach/attach_test.go b/internal/cmd/server/service-account/attach/attach_test.go index fddde577b..96ed151ce 100644 --- a/internal/cmd/server/service-account/attach/attach_test.go +++ b/internal/cmd/server/service-account/attach/attach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -146,7 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -244,7 +245,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccMail, tt.args.serverLabel, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index aa3983c58..6b79c6998 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { ServiceAccMail string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("detach %s", serviceAccMailArg), Short: "Detach a service account from a server", @@ -45,19 +46,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -65,7 +66,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are your sure you want to detach service account %q from a server %q?", model.ServiceAccMail, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("detach service account request: %w", err) } - return outputResult(p, model.OutputFormat, model.ServiceAccMail, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, model.ServiceAccMail, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/service-account/detach/detach_test.go b/internal/cmd/server/service-account/detach/detach_test.go index ffee083d4..acfd02802 100644 --- a/internal/cmd/server/service-account/detach/detach_test.go +++ b/internal/cmd/server/service-account/detach/detach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -146,7 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -244,7 +245,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccMail, tt.args.serverLabel, tt.args.service); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index d9288a246..5c90714fd 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -30,7 +31,7 @@ type inputModel struct { ServerId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "List all attached service accounts for a server", @@ -52,20 +53,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverName, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverName = *model.ServerId } else if serverName == "" { serverName = *model.ServerId @@ -79,7 +80,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } serviceAccounts := *resp.Items if len(serviceAccounts) == 0 { - p.Info("No service accounts found for server %s\n", serverName) + params.Printer.Info("No service accounts found for server %s\n", serverName) return nil } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serviceAccounts = serviceAccounts[:int(*model.Limit)] } - return outputResult(p, model.OutputFormat, *model.ServerId, serverName, serviceAccounts) + return outputResult(params.Printer, model.OutputFormat, *model.ServerId, serverName, serviceAccounts) }, } configureFlags(cmd) diff --git a/internal/cmd/server/service-account/list/list_test.go b/internal/cmd/server/service-account/list/list_test.go index 961ba2a0a..9ba1d281a 100644 --- a/internal/cmd/server/service-account/list/list_test.go +++ b/internal/cmd/server/service-account/list/list_test.go @@ -5,6 +5,7 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -149,7 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -248,7 +249,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverId, tt.args.serverName, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/service-account/service-account.go b/internal/cmd/server/service-account/service-account.go index 0739d29a7..b9455c563 100644 --- a/internal/cmd/server/service-account/service-account.go +++ b/internal/cmd/server/service-account/service-account.go @@ -3,15 +3,15 @@ package serviceaccount import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/detach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/list" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "service-account", Short: "Allows attaching/detaching service accounts to servers", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: cobra.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(attach.NewCmd(p)) - cmd.AddCommand(detach.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(attach.NewCmd(params)) + cmd.AddCommand(detach.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index 7daec696f..918bab2a3 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("start %s", serverIdArg), Short: "Starts an existing server or allocates the server if deallocated", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Starting server") _, err = wait.StartServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered start of" } - p.Info("%s server %q\n", operationState, serverLabel) + params.Printer.Info("%s server %q\n", operationState, serverLabel) return nil }, diff --git a/internal/cmd/server/start/start_test.go b/internal/cmd/server/start/start_test.go index f90b6048d..2776c77e7 100644 --- a/internal/cmd/server/start/start_test.go +++ b/internal/cmd/server/start/start_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -128,7 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index 1201c778b..ccb21bedc 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("stop %s", serverIdArg), Short: "Stops an existing server", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to stop server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Stopping server") _, err = wait.StopServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered stop of" } - p.Info("%s server %q\n", operationState, serverLabel) + params.Printer.Info("%s server %q\n", operationState, serverLabel) return nil }, diff --git a/internal/cmd/server/stop/stop_test.go b/internal/cmd/server/stop/stop_test.go index a4e889181..bbaefddba 100644 --- a/internal/cmd/server/stop/stop_test.go +++ b/internal/cmd/server/stop/stop_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -128,7 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index 5fc2d7c42..181ab88bc 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("unrescue %s", serverIdArg), Short: "Unrescues an existing server", @@ -42,20 +43,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -63,7 +64,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to unrescue server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Unrescuing server") _, err = wait.UnrescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) if err != nil { @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered unrescue of" } - p.Info("%s server %q\n", operationState, serverLabel) + params.Printer.Info("%s server %q\n", operationState, serverLabel) return nil }, diff --git a/internal/cmd/server/unrescue/unrescue_test.go b/internal/cmd/server/unrescue/unrescue_test.go index 82f75a370..1f2d95712 100644 --- a/internal/cmd/server/unrescue/unrescue_test.go +++ b/internal/cmd/server/unrescue/unrescue_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -128,7 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index d7e06d95a..2b8b35985 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", serverIdArg), Short: "Updates a server", @@ -52,20 +53,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId } else if serverLabel == "" { serverLabel = model.ServerId @@ -73,7 +74,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update server %q?", serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,7 +87,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update server: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/update/update_test.go b/internal/cmd/server/update/update_test.go index 5286eb70f..63398311e 100644 --- a/internal/cmd/server/update/update_test.go +++ b/internal/cmd/server/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -172,7 +173,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -269,7 +270,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.server); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index 61eab4ba0..fee7c9097 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { DeleteOnTermination *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("attach %s", volumeIdArg), Short: "Attaches a volume to a server", @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } else if volumeLabel == "" { volumeLabel = model.VolumeId @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -82,7 +83,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to attach volume %q to server %q?", volumeLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("attach server volume: %w", err) } - return outputResult(p, model.OutputFormat, volumeLabel, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, volumeLabel, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/volume/attach/attach_test.go b/internal/cmd/server/volume/attach/attach_test.go index 29dd0ff1f..9a180a4c0 100644 --- a/internal/cmd/server/volume/attach/attach_test.go +++ b/internal/cmd/server/volume/attach/attach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -171,7 +172,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -269,7 +270,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.serverLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 9336183a5..87ebac142 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { VolumeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", volumeIdArg), Short: "Describes a server volume attachment", @@ -53,20 +54,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } else if volumeLabel == "" { volumeLabel = model.VolumeId @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("describe server volume: %w", err) } - return outputResult(p, model.OutputFormat, serverLabel, volumeLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, serverLabel, volumeLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/volume/describe/describe_test.go b/internal/cmd/server/volume/describe/describe_test.go index c86b57259..f2182f04c 100644 --- a/internal/cmd/server/volume/describe/describe_test.go +++ b/internal/cmd/server/volume/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -147,7 +148,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -245,7 +246,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.volumeLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index 826f1881c..e557fc383 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { VolumeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("detach %s", volumeIdArg), Short: "Detaches a volume from a server", @@ -43,20 +44,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } else if volumeLabel == "" { volumeLabel = model.VolumeId @@ -64,7 +65,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to detach volume %q from server %q?", volumeLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("detach server volume: %w", err) } - p.Info("Detached volume %q from server %q\n", volumeLabel, serverLabel) + params.Printer.Info("Detached volume %q from server %q\n", volumeLabel, serverLabel) return nil }, diff --git a/internal/cmd/server/volume/detach/detach_test.go b/internal/cmd/server/volume/detach/detach_test.go index dd2032277..4934e778d 100644 --- a/internal/cmd/server/volume/detach/detach_test.go +++ b/internal/cmd/server/volume/detach/detach_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -146,7 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index dd7509d7f..f3ac90101 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server volumes", @@ -45,20 +46,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } volumes := *resp.Items if len(volumes) == 0 { - p.Info("No volumes found for server %s\n", serverLabel) + params.Printer.Info("No volumes found for server %s\n", serverLabel) return nil } @@ -81,12 +82,12 @@ func NewCmd(p *print.Printer) *cobra.Command { for i := range volumes { volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, *volumes[i].VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) } volumeNames = append(volumeNames, volumeLabel) } - return outputResult(p, model.OutputFormat, serverLabel, volumeNames, volumes) + return outputResult(params.Printer, model.OutputFormat, serverLabel, volumeNames, volumes) }, } configureFlags(cmd) diff --git a/internal/cmd/server/volume/list/list_test.go b/internal/cmd/server/volume/list/list_test.go index b9c37814f..a337fc247 100644 --- a/internal/cmd/server/volume/list/list_test.go +++ b/internal/cmd/server/volume/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -121,7 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -220,7 +221,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.volumeNames, tt.args.volumes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 5722808ef..e4795996d 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { DeleteOnTermination *bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", volumeIdArg), Short: "Updates an attached volume of a server", @@ -49,20 +50,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } else if volumeLabel == "" { volumeLabel = model.VolumeId @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) if err != nil { - p.Debug(print.ErrorLevel, "get server name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId } else if serverLabel == "" { serverLabel = *model.ServerId @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update attached volume %q of server %q?", volumeLabel, serverLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update server volume: %w", err) } - return outputResult(p, model.OutputFormat, volumeLabel, serverLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, volumeLabel, serverLabel, *resp) }, } configureFlags(cmd) diff --git a/internal/cmd/server/volume/update/update_test.go b/internal/cmd/server/volume/update/update_test.go index 46d5a0d20..1f820cff2 100644 --- a/internal/cmd/server/volume/update/update_test.go +++ b/internal/cmd/server/volume/update/update_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -170,7 +171,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.serverLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/volume.go b/internal/cmd/server/volume/volume.go index c851bbcd7..15dd14ef7 100644 --- a/internal/cmd/server/volume/volume.go +++ b/internal/cmd/server/volume/volume.go @@ -1,19 +1,19 @@ package volume import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/detach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "volume", Short: "Provides functionality for server volumes", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(attach.NewCmd(p)) - cmd.AddCommand(detach.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(attach.NewCmd(params)) + cmd.AddCommand(detach.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index eedf109aa..fba36dfeb 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Name *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a service account", @@ -42,26 +43,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a service account for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create service account: %w", err) } - return outputResult(p, model.OutputFormat, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/service-account/create/create_test.go b/internal/cmd/service-account/create/create_test.go index d74e9ad3f..1c3fac895 100644 --- a/internal/cmd/service-account/create/create_test.go +++ b/internal/cmd/service-account/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -117,7 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -213,7 +214,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.serviceAccount); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/delete/delete.go b/internal/cmd/service-account/delete/delete.go index 3bb571f87..829d6ac4c 100644 --- a/internal/cmd/service-account/delete/delete.go +++ b/internal/cmd/service-account/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -24,7 +25,7 @@ type inputModel struct { Email string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", emailArg), Short: "Deletes a service account", @@ -37,20 +38,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete service account %s? (This cannot be undone)", model.Email) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete service account: %w", err) } - p.Info("Service account %s deleted\n", model.Email) + params.Printer.Info("Service account %s deleted\n", model.Email) return nil }, } diff --git a/internal/cmd/service-account/delete/delete_test.go b/internal/cmd/service-account/delete/delete_test.go index a48cf2998..9a0dc74ef 100644 --- a/internal/cmd/service-account/delete/delete_test.go +++ b/internal/cmd/service-account/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/service-account/get-jwks/get_jwks.go b/internal/cmd/service-account/get-jwks/get_jwks.go index e86858c3e..641cba592 100644 --- a/internal/cmd/service-account/get-jwks/get_jwks.go +++ b/internal/cmd/service-account/get-jwks/get_jwks.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -22,7 +23,7 @@ type inputModel struct { Email string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("get-jwks %s", emailArg), Short: "Shows the JWKS for a service account", @@ -35,13 +36,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -54,11 +55,11 @@ func NewCmd(p *print.Printer) *cobra.Command { } jwks := *resp.Keys if len(jwks) == 0 { - p.Info("Empty JWKS for service account %s\n", model.Email) + params.Printer.Info("Empty JWKS for service account %s\n", model.Email) return nil } - return outputResult(p, jwks) + return outputResult(params.Printer, jwks) }, } diff --git a/internal/cmd/service-account/get-jwks/get_jwks_test.go b/internal/cmd/service-account/get-jwks/get_jwks_test.go index 93b049d14..c418ffb22 100644 --- a/internal/cmd/service-account/get-jwks/get_jwks_test.go +++ b/internal/cmd/service-account/get-jwks/get_jwks_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -69,7 +70,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -168,7 +169,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/key/create/create.go b/internal/cmd/service-account/key/create/create.go index 8cf058592..6d99a38fb 100644 --- a/internal/cmd/service-account/key/create/create.go +++ b/internal/cmd/service-account/key/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { PublicKey *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a service account key", @@ -56,13 +57,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -73,7 +74,7 @@ func NewCmd(p *print.Printer) *cobra.Command { validUntilInfo = fmt.Sprintf("The key will be valid for %d days", *model.ExpiresInDays) } prompt := fmt.Sprintf("Are you sure you want to create a key for service account %s? %s", model.ServiceAccountEmail, validUntilInfo) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -86,13 +87,13 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create service account key: %w", err) } - p.Info("Created key for service account %s with ID %q\n", model.ServiceAccountEmail, *resp.Id) + params.Printer.Info("Created key for service account %s with ID %q\n", model.ServiceAccountEmail, *resp.Id) key, err := json.MarshalIndent(resp, "", " ") if err != nil { return fmt.Errorf("marshal key: %w", err) } - p.Outputln(string(key)) + params.Printer.Outputln(string(key)) return nil }, } diff --git a/internal/cmd/service-account/key/create/create_test.go b/internal/cmd/service-account/key/create/create_test.go index f2ded7df9..8f07ed01f 100644 --- a/internal/cmd/service-account/key/create/create_test.go +++ b/internal/cmd/service-account/key/create/create_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -142,7 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/service-account/key/delete/delete.go b/internal/cmd/service-account/key/delete/delete.go index 20e79fa74..ffd77b76a 100644 --- a/internal/cmd/service-account/key/delete/delete.go +++ b/internal/cmd/service-account/key/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { KeyId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", keyIdArg), Short: "Deletes a service account key", @@ -43,20 +44,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete the key %s from service account %s?", model.KeyId, model.ServiceAccountEmail) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("delete key: %w", err) } - p.Info("Deleted key %s from service account %s\n", model.KeyId, model.ServiceAccountEmail) + params.Printer.Info("Deleted key %s from service account %s\n", model.KeyId, model.ServiceAccountEmail) return nil }, } diff --git a/internal/cmd/service-account/key/delete/delete_test.go b/internal/cmd/service-account/key/delete/delete_test.go index ca808acd5..9e811b0a6 100644 --- a/internal/cmd/service-account/key/delete/delete_test.go +++ b/internal/cmd/service-account/key/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -149,7 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/service-account/key/describe/describe.go b/internal/cmd/service-account/key/describe/describe.go index 61bc9af84..3b7c16ca4 100644 --- a/internal/cmd/service-account/key/describe/describe.go +++ b/internal/cmd/service-account/key/describe/describe.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { KeyId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", keyIdArg), Short: "Shows details of a service account key", @@ -44,12 +45,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -61,7 +62,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read service account key: %w", err) } - return outputResult(p, resp) + return outputResult(params.Printer, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/service-account/key/describe/describe_test.go b/internal/cmd/service-account/key/describe/describe_test.go index 18cd60082..7111fa0a6 100644 --- a/internal/cmd/service-account/key/describe/describe_test.go +++ b/internal/cmd/service-account/key/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -149,7 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -253,7 +254,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.key); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/key/key.go b/internal/cmd/service-account/key/key.go index 969e3df91..b91d31b6a 100644 --- a/internal/cmd/service-account/key/key.go +++ b/internal/cmd/service-account/key/key.go @@ -1,19 +1,19 @@ package key import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/create" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/list" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "key", Short: "Provides functionality for service account keys", @@ -21,14 +21,14 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index 66c7fafcb..194c66486 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all service account keys", @@ -50,13 +51,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -69,7 +70,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } keys := *resp.Items if len(keys) == 0 { - p.Info("No keys found for service account %s\n", model.ServiceAccountEmail) + params.Printer.Info("No keys found for service account %s\n", model.ServiceAccountEmail) return nil } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { keys = keys[:*model.Limit] } - return outputResult(p, model.OutputFormat, keys) + return outputResult(params.Printer, model.OutputFormat, keys) }, } diff --git a/internal/cmd/service-account/key/list/list_test.go b/internal/cmd/service-account/key/list/list_test.go index 46933a70c..ebde67439 100644 --- a/internal/cmd/service-account/key/list/list_test.go +++ b/internal/cmd/service-account/key/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -228,7 +229,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.keys); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/key/update/update.go b/internal/cmd/service-account/key/update/update.go index 5aba23b81..9df30b2a9 100644 --- a/internal/cmd/service-account/key/update/update.go +++ b/internal/cmd/service-account/key/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { Deactivate bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", keyIdArg), Short: "Updates a service account key", @@ -60,20 +61,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update the key with ID %q?", model.KeyId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("marshal key: %w", err) } - p.Info("%s", string(key)) + params.Printer.Info("%s", string(key)) return nil }, } diff --git a/internal/cmd/service-account/key/update/update_test.go b/internal/cmd/service-account/key/update/update_test.go index 706739579..84dde9c6d 100644 --- a/internal/cmd/service-account/key/update/update_test.go +++ b/internal/cmd/service-account/key/update/update_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -196,7 +197,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index c4ea786d2..063e4176a 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all service accounts", @@ -42,13 +43,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -61,12 +62,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } serviceAccounts := *resp.Items if len(serviceAccounts) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No service accounts found for project %q\n", projectLabel) + params.Printer.Info("No service accounts found for project %q\n", projectLabel) return nil } @@ -75,7 +76,7 @@ func NewCmd(p *print.Printer) *cobra.Command { serviceAccounts = serviceAccounts[:*model.Limit] } - return outputResult(p, model.OutputFormat, serviceAccounts) + return outputResult(params.Printer, model.OutputFormat, serviceAccounts) }, } diff --git a/internal/cmd/service-account/list/list_test.go b/internal/cmd/service-account/list/list_test.go index d212eabc8..161f050e2 100644 --- a/internal/cmd/service-account/list/list_test.go +++ b/internal/cmd/service-account/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/service_account.go b/internal/cmd/service-account/service_account.go index 8a4f4634d..9c2462bfa 100644 --- a/internal/cmd/service-account/service_account.go +++ b/internal/cmd/service-account/service_account.go @@ -1,6 +1,7 @@ package serviceaccount import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/create" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/delete" getjwks "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/get-jwks" @@ -8,13 +9,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/list" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "service-account", Short: "Provides functionality for service accounts", @@ -22,16 +22,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(getjwks.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(getjwks.NewCmd(params)) - cmd.AddCommand(key.NewCmd(p)) - cmd.AddCommand(token.NewCmd(p)) + cmd.AddCommand(key.NewCmd(params)) + cmd.AddCommand(token.NewCmd(params)) } diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index 8f96b4002..83c249644 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { TTLDays *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an access token for a service account", @@ -52,20 +53,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create an access token for service account %s?", model.ServiceAccountEmail) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -78,7 +79,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("create access token: %w", err) } - return outputResult(p, model.OutputFormat, model.ServiceAccountEmail, token) + return outputResult(params.Printer, model.OutputFormat, model.ServiceAccountEmail, token) }, } diff --git a/internal/cmd/service-account/token/create/create_test.go b/internal/cmd/service-account/token/create/create_test.go index d5d18e3e9..ffa760ce5 100644 --- a/internal/cmd/service-account/token/create/create_test.go +++ b/internal/cmd/service-account/token/create/create_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -121,7 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -219,7 +220,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccountEmail, tt.args.token); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/token/list/list.go b/internal/cmd/service-account/token/list/list.go index 48b793f42..5a51b0ab7 100644 --- a/internal/cmd/service-account/token/list/list.go +++ b/internal/cmd/service-account/token/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists access tokens of a service account", @@ -55,13 +56,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } tokensMetadata := *resp.Items if len(tokensMetadata) == 0 { - p.Info("No tokens found for service account with email %q\n", model.ServiceAccountEmail) + params.Printer.Info("No tokens found for service account with email %q\n", model.ServiceAccountEmail) return nil } @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { tokensMetadata = tokensMetadata[:*model.Limit] } - return outputResult(p, model.OutputFormat, tokensMetadata) + return outputResult(params.Printer, model.OutputFormat, tokensMetadata) }, } diff --git a/internal/cmd/service-account/token/list/list_test.go b/internal/cmd/service-account/token/list/list_test.go index fc3f5b54b..e03ee657f 100644 --- a/internal/cmd/service-account/token/list/list_test.go +++ b/internal/cmd/service-account/token/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -228,7 +229,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.tokensMetadata); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/token/revoke/revoke.go b/internal/cmd/service-account/token/revoke/revoke.go index 212f5c2a6..18dfe9fb1 100644 --- a/internal/cmd/service-account/token/revoke/revoke.go +++ b/internal/cmd/service-account/token/revoke/revoke.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { TokenId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("revoke %s", tokenIdArg), Short: "Revokes an access token of a service account", @@ -46,20 +47,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to revoke the access token with ID %q?", model.TokenId) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -72,7 +73,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("revoke access token: %w", err) } - p.Info("Revoked access token with ID %q\n", model.TokenId) + params.Printer.Info("Revoked access token with ID %q\n", model.TokenId) return nil }, } diff --git a/internal/cmd/service-account/token/revoke/revoke_test.go b/internal/cmd/service-account/token/revoke/revoke_test.go index 3cf5b1246..17387aceb 100644 --- a/internal/cmd/service-account/token/revoke/revoke_test.go +++ b/internal/cmd/service-account/token/revoke/revoke_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -149,7 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/service-account/token/token.go b/internal/cmd/service-account/token/token.go index 45570ea97..ce4b4eac6 100644 --- a/internal/cmd/service-account/token/token.go +++ b/internal/cmd/service-account/token/token.go @@ -1,17 +1,17 @@ package token import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token/create" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token/list" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token/revoke" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "token", Short: "Provides functionality for service account tokens", @@ -19,12 +19,12 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(revoke.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(revoke.NewCmd(params)) } diff --git a/internal/cmd/ske/cluster/cluster.go b/internal/cmd/ske/cluster/cluster.go index c5bb7b36b..0158b7173 100644 --- a/internal/cmd/ske/cluster/cluster.go +++ b/internal/cmd/ske/cluster/cluster.go @@ -1,6 +1,7 @@ package cluster import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/create" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/describe" @@ -8,13 +9,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/list" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "cluster", Short: "Provides functionality for SKE cluster", @@ -22,15 +22,15 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(generatepayload.NewCmd(p)) - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(generatepayload.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 195b343ca..5c017d90d 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Payload *ske.CreateOrUpdateClusterPayload } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", clusterNameArg), Short: "Creates an SKE cluster", @@ -64,33 +65,33 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a cluster for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } } // Configure ServiceEnable API client - serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(p) + serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(params.Printer) if err != nil { return err } @@ -134,7 +135,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating cluster") _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, name).WaitWithContext(ctx) if err != nil { @@ -143,7 +144,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index 6e2e92b3f..3cc543398 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -228,7 +229,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -342,7 +343,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.cluster); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index 657001abe..b78925dd5 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { ClusterName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", clusterNameArg), Short: "Deletes a SKE cluster", @@ -39,20 +40,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete cluster %q? (This cannot be undone)", model.ClusterName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -67,7 +68,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting cluster") _, err = wait.DeleteClusterWaitHandler(ctx, apiClient, model.ProjectId, model.ClusterName).WaitWithContext(ctx) if err != nil { @@ -80,7 +81,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s cluster %q\n", operationState, model.ClusterName) + params.Printer.Info("%s cluster %q\n", operationState, model.ClusterName) return nil }, } diff --git a/internal/cmd/ske/cluster/delete/delete_test.go b/internal/cmd/ske/cluster/delete/delete_test.go index b15c7254c..b51e559ad 100644 --- a/internal/cmd/ske/cluster/delete/delete_test.go +++ b/internal/cmd/ske/cluster/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 52fb7af4d..1b6d08dc8 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", clusterNameArg), Short: "Shows details of a SKE cluster", @@ -43,12 +44,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -60,7 +61,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read SKE cluster: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/ske/cluster/describe/describe_test.go b/internal/cmd/ske/cluster/describe/describe_test.go index 99e644af4..13a1b9468 100644 --- a/internal/cmd/ske/cluster/describe/describe_test.go +++ b/internal/cmd/ske/cluster/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -231,7 +232,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.cluster); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 299b5e9ab..b3a94f2ef 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { FilePath *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "generate-payload", Short: "Generates a payload to create/update SKE clusters", @@ -56,13 +57,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -89,7 +90,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } } - return outputResult(p, model.FilePath, payload) + return outputResult(params.Printer, model.FilePath, payload) }, } configureFlags(cmd) diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go index 5516ccf26..ac758cd1d 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index 7b5389454..a3cde587f 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SKE clusters", @@ -51,19 +52,19 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } // Configure ServiceEnable API client - serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(p) + serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(params.Printer) if err != nil { return err } @@ -85,12 +86,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } clusters := *resp.Items if len(clusters) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No clusters found for project %q\n", projectLabel) + params.Printer.Info("No clusters found for project %q\n", projectLabel) return nil } @@ -99,7 +100,7 @@ func NewCmd(p *print.Printer) *cobra.Command { clusters = clusters[:*model.Limit] } - return outputResult(p, model.OutputFormat, clusters) + return outputResult(params.Printer, model.OutputFormat, clusters) }, } diff --git a/internal/cmd/ske/cluster/list/list_test.go b/internal/cmd/ske/cluster/list/list_test.go index 2959d6be6..c7eb8a01a 100644 --- a/internal/cmd/ske/cluster/list/list_test.go +++ b/internal/cmd/ske/cluster/list/list_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.clusters); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index c407b7fb8..aea878064 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Payload ske.CreateOrUpdateClusterPayload } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", clusterNameArg), Short: "Updates an SKE cluster", @@ -58,20 +59,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update cluster %q?", model.ClusterName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -96,7 +97,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Updating cluster") _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, name).WaitWithContext(ctx) if err != nil { @@ -105,7 +106,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model.OutputFormat, model.Async, model.ClusterName, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, model.ClusterName, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index 53bce8b78..e4ec07b3f 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -216,7 +217,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -322,7 +323,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.clusterName, tt.args.cluster); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index f9936692e..69dd87211 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { ClusterName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("complete-rotation %s", clusterNameArg), Short: "Completes the rotation of the credentials associated to a SKE cluster", @@ -56,20 +57,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to complete the rotation of the credentials for SKE cluster %q?", model.ClusterName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -84,7 +85,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Completing credentials rotation") _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.ClusterName).WaitWithContext(ctx) if err != nil { @@ -97,8 +98,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered completion of credentials rotation" } - p.Info("%s for cluster %q\n", operationState, model.ClusterName) - p.Warn("Consider updating your kubeconfig with the new credentials, create a new kubeconfig by running:\n $ stackit ske kubeconfig create %s\n", model.ClusterName) + params.Printer.Info("%s for cluster %q\n", operationState, model.ClusterName) + params.Printer.Warn("Consider updating your kubeconfig with the new credentials, create a new kubeconfig by running:\n $ stackit ske kubeconfig create %s\n", model.ClusterName) return nil }, } diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go index 6b840c3e7..35e773133 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/ske/credentials/credentials.go b/internal/cmd/ske/credentials/credentials.go index 6fdfb1fc3..2770f349a 100644 --- a/internal/cmd/ske/credentials/credentials.go +++ b/internal/cmd/ske/credentials/credentials.go @@ -1,16 +1,16 @@ package credentials import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" completerotation "github.com/stackitcloud/stackit-cli/internal/cmd/ske/credentials/complete-rotation" startrotation "github.com/stackitcloud/stackit-cli/internal/cmd/ske/credentials/start-rotation" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for SKE credentials", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(startrotation.NewCmd(p)) - cmd.AddCommand(completerotation.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(startrotation.NewCmd(params)) + cmd.AddCommand(completerotation.NewCmd(params)) } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index b11c42623..485e26a10 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { ClusterName string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("start-rotation %s", clusterNameArg), Short: "Starts the rotation of the credentials associated to a SKE cluster", @@ -59,20 +60,20 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to start the rotation of the credentials for SKE cluster %q?", model.ClusterName) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -87,7 +88,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Starting credentials rotation") _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.ClusterName).WaitWithContext(ctx) if err != nil { @@ -100,8 +101,8 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered start of credentials rotation" } - p.Info("%s for cluster %q\n", operationState, model.ClusterName) - p.Info("Complete the rotation by running:\n $ stackit ske credentials complete-rotation %s\n", model.ClusterName) + params.Printer.Info("%s for cluster %q\n", operationState, model.ClusterName) + params.Printer.Info("Complete the rotation by running:\n $ stackit ske credentials complete-rotation %s\n", model.ClusterName) return nil }, } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go index dc5643eaa..29f2825ac 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -126,7 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index 6694b04a7..06522d5fb 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,7 +24,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "describe", Short: "Shows overall details regarding SKE", @@ -36,12 +37,12 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -53,7 +54,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read SKE project details: %w", err) } - return outputResult(p, model.OutputFormat, resp, model.ProjectId) + return outputResult(params.Printer, model.OutputFormat, resp, model.ProjectId) }, } return cmd diff --git a/internal/cmd/ske/describe/describe_test.go b/internal/cmd/ske/describe/describe_test.go index 839ae512e..4fb7cbb64 100644 --- a/internal/cmd/ske/describe/describe_test.go +++ b/internal/cmd/ske/describe/describe_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.project, tt.args.projectId); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index d00a56715..12685a580 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,7 +24,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables SKE for a project", @@ -36,26 +37,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to disable SKE for project %q? (This will delete all associated clusters)", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Disabling SKE") _, err = wait.DisableServiceWaitHandler(ctx, apiClient, model.Region, model.ProjectId, utils.SKEServiceId).WaitWithContext(ctx) if err != nil { @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered disablement of" } - p.Info("%s SKE for project %q\n", operationState, projectLabel) + params.Printer.Info("%s SKE for project %q\n", operationState, projectLabel) return nil }, } diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 9ab8ed7bf..7701c3bf5 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,7 +24,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables SKE for a project", @@ -36,26 +37,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to enable SKE for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Enabling SKE") _, err = wait.EnableServiceWaitHandler(ctx, apiClient, model.Region, model.ProjectId, utils.SKEServiceId).WaitWithContext(ctx) if err != nil { @@ -83,7 +84,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered enablement of" } - p.Info("%s SKE for project %q\n", operationState, projectLabel) + params.Printer.Info("%s SKE for project %q\n", operationState, projectLabel) return nil }, } diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index 8677b033c..e7a252456 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -40,7 +41,7 @@ type inputModel struct { Overwrite bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", clusterNameArg), Short: "Creates or update a kubeconfig for an SKE cluster", @@ -77,13 +78,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -95,7 +96,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } else { prompt = fmt.Sprintf("Are you sure you want to update your kubeconfig for SKE cluster %q? This will update your kubeconfig file. \nIf it the kubeconfig file doesn't exists, it will create a new one.", model.ClusterName) } - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -156,10 +157,10 @@ func NewCmd(p *print.Printer) *cobra.Command { if err != nil { return fmt.Errorf("write kubeconfig file: %w", err) } - p.Outputf("\nSet kubectl context to %s with: kubectl config use-context %s\n", model.ClusterName, model.ClusterName) + params.Printer.Outputf("\nSet kubectl context to %s with: kubectl config use-context %s\n", model.ClusterName, model.ClusterName) } - return outputResult(p, model.OutputFormat, model.ClusterName, kubeconfigPath, respKubeconfig, respLogin) + return outputResult(params.Printer, model.OutputFormat, model.ClusterName, kubeconfigPath, respKubeconfig, respLogin) }, } configureFlags(cmd) diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index 9743067f8..558d273e5 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -203,7 +204,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -324,7 +325,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.clusterName, tt.args.kubeconfigPath, tt.args.respKubeconfig, tt.args.respLogin); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/kubeconfig/kubeconfig.go b/internal/cmd/ske/kubeconfig/kubeconfig.go index 44803f14b..ad5482dbe 100644 --- a/internal/cmd/ske/kubeconfig/kubeconfig.go +++ b/internal/cmd/ske/kubeconfig/kubeconfig.go @@ -1,16 +1,16 @@ package kubeconfig import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/kubeconfig/create" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/kubeconfig/login" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "kubeconfig", Short: "Provides functionality for SKE kubeconfig", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(login.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(login.NewCmd(params)) } diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index 817b33ca4..ce748d242 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -12,6 +12,7 @@ import ( "strconv" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/cache" "k8s.io/client-go/rest" @@ -34,7 +35,7 @@ const ( refreshBeforeDuration = 15 * time.Minute // 15 min ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "login", Short: "Login plugin for kubernetes clients", @@ -74,7 +75,7 @@ func NewCmd(p *print.Printer) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -82,33 +83,33 @@ func NewCmd(p *print.Printer) *cobra.Command { cachedKubeconfig := getCachedKubeConfig(clusterConfig.cacheKey) if cachedKubeconfig == nil { - return GetAndOutputKubeconfig(ctx, p, apiClient, clusterConfig, false, nil) + return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) } certPem, _ := pem.Decode(cachedKubeconfig.CertData) if certPem == nil { _ = cache.DeleteObject(clusterConfig.cacheKey) - return GetAndOutputKubeconfig(ctx, p, apiClient, clusterConfig, false, nil) + return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) } certificate, err := x509.ParseCertificate(certPem.Bytes) if err != nil { _ = cache.DeleteObject(clusterConfig.cacheKey) - return GetAndOutputKubeconfig(ctx, p, apiClient, clusterConfig, false, nil) + return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) } // cert is expired, request new if time.Now().After(certificate.NotAfter.UTC()) { _ = cache.DeleteObject(clusterConfig.cacheKey) - return GetAndOutputKubeconfig(ctx, p, apiClient, clusterConfig, false, nil) + return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) } // cert expires within the next 15min, refresh (try to get a new, use cache on failure) if time.Now().Add(refreshBeforeDuration).After(certificate.NotAfter.UTC()) { - return GetAndOutputKubeconfig(ctx, p, apiClient, clusterConfig, true, cachedKubeconfig) + return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, true, cachedKubeconfig) } // cert not expired, nor will it expire in the next 15min; therefore, use the cached kubeconfig - if err := output(p, clusterConfig.cacheKey, cachedKubeconfig); err != nil { + if err := output(params.Printer, clusterConfig.cacheKey, cachedKubeconfig); err != nil { return err } return nil diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 419721d29..6aed48591 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -9,6 +9,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -37,7 +38,7 @@ type inputModel struct { VolumeTypes bool } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists SKE provider options", @@ -59,13 +60,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,7 +78,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("get SKE provider options: %w", err) } - return outputResult(p, model, resp) + return outputResult(params.Printer, model, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/ske/options/options_test.go b/internal/cmd/ske/options/options_test.go index 6b1c1ae93..b2181ef5b 100644 --- a/internal/cmd/ske/options/options_test.go +++ b/internal/cmd/ske/options/options_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -118,7 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -238,7 +239,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { @@ -271,7 +272,7 @@ func TestOutputResultAsTable(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResultAsTable(p, tt.args.options); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/ske.go b/internal/cmd/ske/ske.go index 04438af65..137165e06 100644 --- a/internal/cmd/ske/ske.go +++ b/internal/cmd/ske/ske.go @@ -1,6 +1,7 @@ package ske import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/describe" @@ -9,13 +10,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/ske/kubeconfig" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "ske", Short: "Provides functionality for SKE", @@ -23,16 +23,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(enable.NewCmd(p)) - cmd.AddCommand(kubeconfig.NewCmd(p)) - cmd.AddCommand(disable.NewCmd(p)) - cmd.AddCommand(cluster.NewCmd(p)) - cmd.AddCommand(credentials.NewCmd(p)) - cmd.AddCommand(options.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(kubeconfig.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) + cmd.AddCommand(cluster.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) + cmd.AddCommand(options.NewCmd(params)) } diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 90b20d813..06c7da8e8 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -45,7 +46,7 @@ type inputModel struct { SourceType *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a volume", @@ -71,26 +72,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to create a volume for project %q?", projectLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -106,7 +107,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Creating volume") _, err = wait.CreateVolumeWaitHandler(ctx, apiClient, model.ProjectId, volumeId).WaitWithContext(ctx) if err != nil { @@ -115,7 +116,7 @@ func NewCmd(p *print.Printer) *cobra.Command { s.Stop() } - return outputResult(p, model, projectLabel, resp) + return outputResult(params.Printer, model, projectLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/volume/create/create_test.go b/internal/cmd/volume/create/create_test.go index 71f3e1697..716daaad2 100644 --- a/internal/cmd/volume/create/create_test.go +++ b/internal/cmd/volume/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -202,7 +203,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -310,7 +311,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index d07a9e8f5..e9730faf9 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { VolumeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", volumeIdArg), Short: "Deletes a volume", @@ -45,13 +46,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -59,14 +60,14 @@ func NewCmd(p *print.Printer) *cobra.Command { volumeLabel := model.VolumeId volumeName, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) } else if volumeName != "" { volumeLabel = volumeName } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to delete volume %q?", volumeLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(p *print.Printer) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p) + s := spinner.New(params.Printer) s.Start("Deleting volume") _, err = wait.DeleteVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.VolumeId).WaitWithContext(ctx) if err != nil { @@ -94,7 +95,7 @@ func NewCmd(p *print.Printer) *cobra.Command { if model.Async { operationState = "Triggered deletion of" } - p.Info("%s volume %q\n", operationState, volumeLabel) + params.Printer.Info("%s volume %q\n", operationState, volumeLabel) return nil }, } diff --git a/internal/cmd/volume/delete/delete_test.go b/internal/cmd/volume/delete/delete_test.go index 5648c374c..58d10c79c 100644 --- a/internal/cmd/volume/delete/delete_test.go +++ b/internal/cmd/volume/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -138,7 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index e77073ea2..c8b787456 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { VolumeId string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", volumeIdArg), Short: "Shows details of a volume", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read volume: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/volume/describe/describe_test.go b/internal/cmd/volume/describe/describe_test.go index 3de0f688b..aa0a0754f 100644 --- a/internal/cmd/volume/describe/describe_test.go +++ b/internal/cmd/volume/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -240,7 +241,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index 02c643014..feffde80e 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -7,6 +7,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all volumes of a project", @@ -57,13 +58,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -76,12 +77,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No volumes found for project %q\n", projectLabel) + params.Printer.Info("No volumes found for project %q\n", projectLabel) return nil } @@ -91,7 +92,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/volume/list/list_test.go b/internal/cmd/volume/list/list_test.go index 77cc3808b..daa736ff1 100644 --- a/internal/cmd/volume/list/list_test.go +++ b/internal/cmd/volume/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -131,7 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -226,7 +227,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index ade26f34a..3105e4fcc 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { VolumePerformanceClass string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", volumePerformanceClassArg), Short: "Shows details of a volume performance class", @@ -48,13 +49,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("read volume performance class: %w", err) } - return outputResult(p, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd diff --git a/internal/cmd/volume/performance-class/describe/describe_test.go b/internal/cmd/volume/performance-class/describe/describe_test.go index 90ba0da3c..b5bf0cf3c 100644 --- a/internal/cmd/volume/performance-class/describe/describe_test.go +++ b/internal/cmd/volume/performance-class/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -131,7 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -234,7 +235,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.performanceClass); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index 4449a5f3e..b48f399f6 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all volume performance classes for a project", @@ -58,13 +59,13 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() - model, err := parseInput(p, cmd) + model, err := parseInput(params.Printer, cmd) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } @@ -77,12 +78,12 @@ func NewCmd(p *print.Printer) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, p, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) if err != nil { - p.Debug(print.ErrorLevel, "get project name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - p.Info("No volume performance class found for project %q\n", projectLabel) + params.Printer.Info("No volume performance class found for project %q\n", projectLabel) return nil } @@ -92,7 +93,7 @@ func NewCmd(p *print.Printer) *cobra.Command { items = items[:*model.Limit] } - return outputResult(p, model.OutputFormat, items) + return outputResult(params.Printer, model.OutputFormat, items) }, } configureFlags(cmd) diff --git a/internal/cmd/volume/performance-class/list/list_test.go b/internal/cmd/volume/performance-class/list/list_test.go index 9e23bbdfd..6e877390d 100644 --- a/internal/cmd/volume/performance-class/list/list_test.go +++ b/internal/cmd/volume/performance-class/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -131,7 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -226,7 +227,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.performanceClasses); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/performance-class/performance_class.go b/internal/cmd/volume/performance-class/performance_class.go index 4f159606e..6ed86618a 100644 --- a/internal/cmd/volume/performance-class/performance_class.go +++ b/internal/cmd/volume/performance-class/performance_class.go @@ -1,16 +1,16 @@ package performanceclass import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/performance-class/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/performance-class/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "performance-class", Short: "Provides functionality for volume performance classes available inside a project", @@ -18,11 +18,11 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index 7f966a2e3..afef2a7a3 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Size *int64 } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("resize %s", volumeIdArg), Short: "Resizes a volume", @@ -44,26 +45,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to resize volume %q?", volumeLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -76,7 +77,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("resize volume: %w", err) } - p.Outputf("Resized volume %q.\n", volumeLabel) + params.Printer.Outputf("Resized volume %q.\n", volumeLabel) return nil }, } diff --git a/internal/cmd/volume/resize/resize_test.go b/internal/cmd/volume/resize/resize_test.go index 15dd9c757..54d02a47f 100644 --- a/internal/cmd/volume/resize/resize_test.go +++ b/internal/cmd/volume/resize/resize_test.go @@ -4,6 +4,7 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -152,7 +153,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index f7afad38a..0c57f6185 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -8,6 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", volumeIdArg), Short: "Updates a volume", @@ -58,26 +59,26 @@ func NewCmd(p *print.Printer) *cobra.Command { ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(p, cmd, args) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } // Configure API client - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(params.Printer) if err != nil { return err } volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { - p.Debug(print.ErrorLevel, "get volume name: %v", err) + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } if !model.AssumeYes { prompt := fmt.Sprintf("Are you sure you want to update volume %q?", volumeLabel) - err = p.PromptForConfirmation(prompt) + err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } @@ -90,7 +91,7 @@ func NewCmd(p *print.Printer) *cobra.Command { return fmt.Errorf("update volume: %w", err) } - return outputResult(p, model.OutputFormat, volumeLabel, resp) + return outputResult(params.Printer, model.OutputFormat, volumeLabel, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/volume/update/update_test.go b/internal/cmd/volume/update/update_test.go index cdfed4017..1628bf26a 100644 --- a/internal/cmd/volume/update/update_test.go +++ b/internal/cmd/volume/update/update_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -176,7 +177,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(p) + cmd := NewCmd(¶ms.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -280,7 +281,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(p) + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/volume.go b/internal/cmd/volume/volume.go index fe334cb6f..1e876e85b 100644 --- a/internal/cmd/volume/volume.go +++ b/internal/cmd/volume/volume.go @@ -1,6 +1,7 @@ package volume import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/create" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/describe" @@ -9,13 +10,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/volume/resize" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(p *print.Printer) *cobra.Command { +func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "volume", Short: "Provides functionality for volumes", @@ -23,16 +23,16 @@ func NewCmd(p *print.Printer) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } - addSubcommands(cmd, p) + addSubcommands(cmd, params) return cmd } -func addSubcommands(cmd *cobra.Command, p *print.Printer) { - cmd.AddCommand(create.NewCmd(p)) - cmd.AddCommand(delete.NewCmd(p)) - cmd.AddCommand(describe.NewCmd(p)) - cmd.AddCommand(list.NewCmd(p)) - cmd.AddCommand(update.NewCmd(p)) - cmd.AddCommand(resize.NewCmd(p)) - cmd.AddCommand(performanceclass.NewCmd(p)) +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(resize.NewCmd(params)) + cmd.AddCommand(performanceclass.NewCmd(params)) } From 2cac3074a7175162fef680030add84ad001422ec Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 12 May 2025 07:55:27 +0200 Subject: [PATCH 003/422] fix(deps): update stackit sdk modules (#740) Co-authored-by: Renovate Bot --- go.mod | 46 ++++++++++++++-------------- go.sum | 96 ++++++++++++++++++++++++++++------------------------------ 2 files changed, 69 insertions(+), 73 deletions(-) diff --git a/go.mod b/go.mod index 3e5f0a4b2..d4fa80e97 100644 --- a/go.mod +++ b/go.mod @@ -16,22 +16,22 @@ require ( github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.2 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.2 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.2 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.1 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.0 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.1 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.3 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.2 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.1 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.3 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.2 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.2 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.2 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.2 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.2 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.2 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.2 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.3 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.24.0 golang.org/x/oauth2 v0.30.0 @@ -235,13 +235,13 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.2 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.1 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.1 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.2 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.1 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.1 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.1 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/go.sum b/go.sum index 43889808a..8735251de 100644 --- a/go.sum +++ b/go.sum @@ -564,52 +564,52 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.1 h1:TTrVoB1lERd/qfWzpe6HpwCJSjtaGnUI7UE7ITb5IT0= github.com/stackitcloud/stackit-sdk-go/core v0.17.1/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.2 h1:7PIcO05sveIb0CNfJiwsWhcR7tc+9/e4p580Hm398ww= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.2/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.2 h1:erpN0BM7lTkV/zhxka5fTYHssQaOqdGjj76c2FWMec0= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.2/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.2 h1:6rb3EM0yXuMIBd1U6WsJoMzEiVaHC3WQFWFvT23OE4Y= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.2/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.1 h1:JXcLcbVesTtwVVb+jJjU3o0FmSpXBRnOw6PVETaeK+E= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.1/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.2 h1:5rVt3n7kDJvJQxFCtxfx8uZI9PGkvJY9fVJ4yar10Uc= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.2/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.1 h1:ZeEuUf0DrTTU/acHOg+pQcpLZV1NF9SZbqI6ogjdLao= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.1/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.1 h1:bdfgwsFNJRqCDUu/r4ZYyACzHCo1bD3y8fGFLYvX9C4= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.1/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.0 h1:kUdCkqVFEOP1GCUoLwdkMi9o+qtghvBT+grIE0nvvlc= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.2 h1:h+EwnBOflLAKTZTlnl9YoB/z3ilvW34uezJO8YNG6Bo= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.2/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.1 h1:BIMl8ISsDGsFB6dBqfxQMPFVyS5gB5EcwM4Jzpg65XE= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.1/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.1 h1:yukHymULIXiSu7RQSnYOaPlBXegFR3ICMXdQzG8v14g= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.1/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.3 h1:IFXdEoN92c7qpvzeXqMnhz9OsiLR7Hiub7UkxK8luWo= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.3/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.1 h1:CHRxxDBW+4VrpZDyXabOJCF7LY0i+PNYY5QWE0kwGIo= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.1/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.1 h1:bYIczS7iJNSQGkoSghicCC3F657TqLl4CelCgyt3tbw= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.1/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.2 h1:k+Nr9JBzBBy6di7T0pmQGEKqjPkbv8goRFdWo6BaIhQ= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.2/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.1 h1:VUoD+yQKwWFfgYAZd9JkjgKQCWjs0dDuf6ZgNYcXi6Y= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.1/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.3 h1:L8uFydvDVJBdXLSQdgRwztbQewwNtTtuPhM1L1ehIvA= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.3/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.2 h1:mf4ej9oTc45huZxRe231DAPY9MOgm9qV1gflXdYQN4Q= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.2/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.2 h1:MCHMaS3hRTEYu+rWIDOas9tVn5+ddaulXzcE2porMek= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.2/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.2 h1:SdQ9VqDmamOhnTp6fd0QYKhCcoxB2GP938o7hGAubqg= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.2/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.2 h1:KsfdYvi24Mli50gEDuruXk5lg5mQIFqr/hfLfHHFJXU= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.2/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.2 h1:SYX9IXg+2YAIdiUzLyqs9ga+S+bjhZs8WYeqU3GK3hk= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.2/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.2 h1:uNwgJMHRuihWJJbnCw2FiJ9zZB9ZaE9YJ8e7ytZG1Pc= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.2/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3 h1:JVRsMN5uKPxy9ynsxmhGfAecz87LjqN5G5Vg8MRwyRc= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 h1:aXVMNdiHCtT07bro52KjnxEBMDNK9DweJBlk+G4ElCM= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 h1:WJnA6YTOlBxMJf9PRuxkXduxj+fyWi+wOks69PvN1qI= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 h1:zh6e2eHgqex++fr6N0RK7wMMBGesC3QhBd42FdTq2Z8= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 h1:StQg5p4h1aLFwIHQWWe5l44aFue+ZvQMGDbypP1DMYw= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 h1:wM/Gop6sG/fkpzsZGhrPN2AzkKxHup175WaFBGaeQ7s= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2 h1:JoPz34UT1Gx7TV6GpOzWdNBq78co7MV12jynADI4AMc= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1 h1:CBGVT+5ilIFVtz5gDnQ58zNapFCLpjOftuVeATdg1qo= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 h1:RFe45uLzTSmd69yaQe5zLDY3+1hYi6/lSZUVcjbb6+c= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 h1:anITBRTlQoneEawVg4hHjs4IceFJLFq9KdDU+d5y5DU= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 h1:p1bub8QayR+NkYtGd8DNSjxlRmoyR7Dr97LiwWVW1Ow= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 h1:AIQueG1oSdKbxK8ASZZYkmqzJ7NhKzKcR5AQsndoF18= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.2 h1:++lyru25B7J8cKaEBCw9ZKgXDIJGmQvmFXR+BpAcR4g= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.2/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2 h1:KKANO+wsLVkuH8N+xuYrEx+rDcliv48zYk3I7QzdX3A= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3 h1:4DNnEZj4uSyE+gDS+j9MCUuax9nfnttfro+JJE8QRSE= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.2 h1:+YwMWWvZlUtw6TEfTqXPdUyN9hbkECU4DULwgIMu6A0= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.2/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4 h1:UCX1qy44q22bDGv7BhLtOrWCzriS9m4MQsIOX6n+lgM= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.3 h1:OR5CZnxZMbGXsYPOZL00En3RhXeUuEJcZVN9iSxxTs8= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.3/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 h1:iLyXsBF+lP7iE4rnoK3hO8l4wHcgySRXD65oeUgt6Jc= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3 h1:qCn6ZS/oJEqA4PBMLMDvvctQ4eQEoCQSSWES394+AcQ= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3 h1:rDsIPzaNJ4bnKJp9XFNzna+pXylGYVHUBPl5hqBWhX8= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.3 h1:dN6MOgb9CXaZ9hsdCIrrNGyw7EggPvE5kaTvNKvrEzI= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.3/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3 h1:MF46ffu+A8eu17N7LGFG2T50PhjDw2L0f68Uu316r8U= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -792,8 +792,6 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -961,8 +959,6 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= -golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 4f7804790e9f3306c2d3ea770f674239bbaea3b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 12 May 2025 16:40:31 +0200 Subject: [PATCH 004/422] feat(cli): set custom user-agent header for STACKIT API calls (#741) relates to STACKITCLI-180 --- .github/docs/contribution-guide/client.go | 30 ++++++++++---- .github/docs/contribution-guide/cmd.go | 15 +++---- CONTRIBUTION.md | 4 +- internal/cmd/affinity-groups/create/create.go | 2 +- internal/cmd/affinity-groups/delete/delete.go | 4 +- .../cmd/affinity-groups/describe/describe.go | 2 +- internal/cmd/affinity-groups/list/list.go | 2 +- internal/cmd/beta/alb/create/create.go | 4 +- internal/cmd/beta/alb/delete/delete.go | 4 +- internal/cmd/beta/alb/describe/describe.go | 2 +- internal/cmd/beta/alb/list/list.go | 4 +- .../alb/observability-credentials/add/add.go | 2 +- .../delete/delete.go | 2 +- .../describe/describe.go | 2 +- .../observability-credentials/list/list.go | 2 +- .../update/update.go | 4 +- internal/cmd/beta/alb/plans/plans.go | 4 +- internal/cmd/beta/alb/pool/update/update.go | 4 +- internal/cmd/beta/alb/quotas/quotas.go | 2 +- internal/cmd/beta/alb/update/update.go | 4 +- .../sqlserverflex/database/create/create.go | 2 +- .../sqlserverflex/database/delete/delete.go | 2 +- .../database/describe/describe.go | 2 +- .../beta/sqlserverflex/database/list/list.go | 4 +- .../sqlserverflex/instance/create/create.go | 4 +- .../sqlserverflex/instance/delete/delete.go | 2 +- .../instance/describe/describe.go | 2 +- .../beta/sqlserverflex/instance/list/list.go | 4 +- .../sqlserverflex/instance/update/update.go | 2 +- .../cmd/beta/sqlserverflex/options/options.go | 2 +- .../beta/sqlserverflex/user/create/create.go | 2 +- .../beta/sqlserverflex/user/delete/delete.go | 2 +- .../sqlserverflex/user/describe/describe.go | 2 +- .../cmd/beta/sqlserverflex/user/list/list.go | 2 +- .../user/reset-password/reset_password.go | 2 +- internal/cmd/config/list/list_test.go | 1 + internal/cmd/config/profile/create/create.go | 1 + .../cmd/config/profile/create/create_test.go | 1 + internal/cmd/config/profile/delete/delete.go | 1 + .../cmd/config/profile/delete/delete_test.go | 1 + .../cmd/config/profile/export/export_test.go | 1 + internal/cmd/config/profile/list/list.go | 1 + internal/cmd/config/profile/set/set_test.go | 1 + internal/cmd/config/set/set_test.go | 1 + internal/cmd/config/unset/unset_test.go | 1 + internal/cmd/dns/record-set/create/create.go | 2 +- internal/cmd/dns/record-set/delete/delete.go | 2 +- .../cmd/dns/record-set/describe/describe.go | 2 +- internal/cmd/dns/record-set/list/list.go | 2 +- internal/cmd/dns/record-set/update/update.go | 2 +- .../cmd/dns/record-set/update/update_test.go | 1 + internal/cmd/dns/zone/clone/clone.go | 2 +- internal/cmd/dns/zone/create/create.go | 4 +- internal/cmd/dns/zone/delete/delete.go | 2 +- internal/cmd/dns/zone/describe/describe.go | 2 +- internal/cmd/dns/zone/list/list.go | 4 +- internal/cmd/dns/zone/update/update.go | 2 +- internal/cmd/image/create/create.go | 2 +- internal/cmd/image/delete/delete.go | 4 +- internal/cmd/image/describe/describe.go | 2 +- internal/cmd/image/list/list.go | 4 +- internal/cmd/image/update/update.go | 4 +- internal/cmd/key-pair/create/create.go | 2 +- internal/cmd/key-pair/delete/delete.go | 2 +- internal/cmd/key-pair/describe/describe.go | 2 +- internal/cmd/key-pair/list/list.go | 2 +- internal/cmd/key-pair/update/update.go | 2 +- internal/cmd/load-balancer/create/create.go | 4 +- internal/cmd/load-balancer/delete/delete.go | 2 +- .../cmd/load-balancer/describe/describe.go | 2 +- .../generate-payload/generate_payload.go | 2 +- internal/cmd/load-balancer/list/list.go | 4 +- .../observability-credentials/add/add.go | 4 +- .../cleanup/cleanup.go | 4 +- .../delete/delete.go | 4 +- .../describe/describe.go | 2 +- .../observability-credentials/list/list.go | 4 +- .../update/update.go | 4 +- internal/cmd/load-balancer/quota/quota.go | 2 +- .../target-pool/add-target/add_target.go | 2 +- .../target-pool/describe/describe.go | 2 +- .../remove-target/remove_target.go | 2 +- internal/cmd/load-balancer/update/update.go | 2 +- .../cmd/logme/credentials/create/create.go | 2 +- .../cmd/logme/credentials/delete/delete.go | 2 +- .../logme/credentials/describe/describe.go | 2 +- internal/cmd/logme/credentials/list/list.go | 2 +- internal/cmd/logme/instance/create/create.go | 4 +- internal/cmd/logme/instance/delete/delete.go | 2 +- .../cmd/logme/instance/describe/describe.go | 2 +- internal/cmd/logme/instance/list/list.go | 4 +- internal/cmd/logme/instance/update/update.go | 2 +- internal/cmd/logme/plans/plans.go | 4 +- .../cmd/mariadb/credentials/create/create.go | 2 +- .../cmd/mariadb/credentials/delete/delete.go | 2 +- .../mariadb/credentials/describe/describe.go | 2 +- internal/cmd/mariadb/credentials/list/list.go | 2 +- .../cmd/mariadb/instance/create/create.go | 4 +- .../cmd/mariadb/instance/delete/delete.go | 2 +- .../cmd/mariadb/instance/describe/describe.go | 2 +- internal/cmd/mariadb/instance/list/list.go | 4 +- .../cmd/mariadb/instance/update/update.go | 2 +- internal/cmd/mariadb/plans/plans.go | 4 +- .../mongodbflex/backup/describe/describe.go | 2 +- internal/cmd/mongodbflex/backup/list/list.go | 2 +- .../backup/restore-jobs/restore_jobs.go | 2 +- .../cmd/mongodbflex/backup/restore/restore.go | 2 +- .../mongodbflex/backup/schedule/schedule.go | 2 +- .../backup/update-schedule/update_schedule.go | 2 +- .../cmd/mongodbflex/instance/create/create.go | 4 +- .../cmd/mongodbflex/instance/delete/delete.go | 2 +- .../mongodbflex/instance/describe/describe.go | 2 +- .../cmd/mongodbflex/instance/list/list.go | 4 +- .../cmd/mongodbflex/instance/update/update.go | 2 +- internal/cmd/mongodbflex/options/options.go | 2 +- .../cmd/mongodbflex/user/create/create.go | 2 +- .../cmd/mongodbflex/user/delete/delete.go | 2 +- .../cmd/mongodbflex/user/describe/describe.go | 2 +- internal/cmd/mongodbflex/user/list/list.go | 2 +- .../user/reset-password/reset_password.go | 2 +- .../cmd/mongodbflex/user/update/update.go | 2 +- internal/cmd/network-area/create/create.go | 4 +- internal/cmd/network-area/delete/delete.go | 2 +- .../cmd/network-area/describe/describe.go | 2 +- internal/cmd/network-area/list/list.go | 7 ++-- .../network-range/create/create.go | 2 +- .../network-range/delete/delete.go | 2 +- .../network-range/describe/describe.go | 2 +- .../network-area/network-range/list/list.go | 2 +- .../cmd/network-area/route/create/create.go | 2 +- .../cmd/network-area/route/delete/delete.go | 2 +- .../network-area/route/describe/describe.go | 2 +- internal/cmd/network-area/route/list/list.go | 2 +- .../cmd/network-area/route/update/update.go | 2 +- internal/cmd/network-area/update/update.go | 7 ++-- .../cmd/network-interface/create/create.go | 4 +- .../cmd/network-interface/delete/delete.go | 2 +- .../network-interface/describe/describe.go | 2 +- internal/cmd/network-interface/list/list.go | 2 +- .../cmd/network-interface/update/update.go | 2 +- internal/cmd/network/create/create.go | 4 +- internal/cmd/network/delete/delete.go | 2 +- internal/cmd/network/describe/describe.go | 2 +- internal/cmd/network/list/list.go | 4 +- internal/cmd/network/update/update.go | 2 +- .../object-storage/bucket/create/create.go | 2 +- .../object-storage/bucket/delete/delete.go | 2 +- .../bucket/describe/describe.go | 2 +- .../cmd/object-storage/bucket/list/list.go | 4 +- .../credentials-group/create/create.go | 2 +- .../credentials-group/delete/delete.go | 2 +- .../credentials-group/list/list.go | 2 +- .../credentials/create/create.go | 2 +- .../credentials/delete/delete.go | 2 +- .../object-storage/credentials/list/list.go | 2 +- .../cmd/object-storage/disable/disable.go | 4 +- internal/cmd/object-storage/enable/enable.go | 4 +- .../credentials/create/create.go | 2 +- .../credentials/delete/delete.go | 2 +- .../observability/credentials/list/list.go | 2 +- .../grafana/describe/describe.go | 2 +- .../public-read-access/disable/disable.go | 2 +- .../public-read-access/enable/enable.go | 2 +- .../grafana/single-sign-on/disable/disable.go | 2 +- .../grafana/single-sign-on/enable/enable.go | 2 +- .../observability/instance/create/create.go | 4 +- .../observability/instance/delete/delete.go | 2 +- .../instance/describe/describe.go | 2 +- .../cmd/observability/instance/list/list.go | 4 +- .../observability/instance/update/update.go | 2 +- internal/cmd/observability/plans/plans.go | 4 +- .../scrape-config/create/create.go | 2 +- .../scrape-config/delete/delete.go | 2 +- .../scrape-config/describe/describe.go | 2 +- .../generate-payload/generate_payload.go | 2 +- .../observability/scrape-config/list/list.go | 2 +- .../scrape-config/update/update.go | 2 +- .../opensearch/credentials/create/create.go | 2 +- .../opensearch/credentials/delete/delete.go | 2 +- .../credentials/describe/describe.go | 2 +- .../cmd/opensearch/credentials/list/list.go | 2 +- .../cmd/opensearch/instance/create/create.go | 4 +- .../cmd/opensearch/instance/delete/delete.go | 2 +- .../opensearch/instance/describe/describe.go | 2 +- internal/cmd/opensearch/instance/list/list.go | 4 +- .../cmd/opensearch/instance/update/update.go | 2 +- internal/cmd/opensearch/plans/plans.go | 4 +- internal/cmd/organization/member/add/add.go | 2 +- internal/cmd/organization/member/list/list.go | 2 +- .../cmd/organization/member/remove/remove.go | 2 +- internal/cmd/organization/role/list/list.go | 2 +- .../postgresflex/backup/describe/describe.go | 2 +- internal/cmd/postgresflex/backup/list/list.go | 2 +- .../backup/update-schedule/update_schedule.go | 2 +- .../cmd/postgresflex/instance/clone/clone.go | 2 +- .../postgresflex/instance/create/create.go | 4 +- .../postgresflex/instance/delete/delete.go | 2 +- .../instance/describe/describe.go | 2 +- .../cmd/postgresflex/instance/list/list.go | 4 +- .../postgresflex/instance/update/update.go | 2 +- internal/cmd/postgresflex/options/options.go | 2 +- .../cmd/postgresflex/user/create/create.go | 2 +- .../cmd/postgresflex/user/delete/delete.go | 2 +- .../postgresflex/user/describe/describe.go | 2 +- internal/cmd/postgresflex/user/list/list.go | 2 +- .../user/reset-password/reset_password.go | 2 +- .../cmd/postgresflex/user/update/update.go | 2 +- internal/cmd/project/create/create.go | 2 +- internal/cmd/project/delete/delete.go | 4 +- internal/cmd/project/describe/describe.go | 2 +- internal/cmd/project/list/list.go | 2 +- internal/cmd/project/member/add/add.go | 4 +- internal/cmd/project/member/list/list.go | 4 +- internal/cmd/project/member/remove/remove.go | 4 +- internal/cmd/project/role/list/list.go | 4 +- internal/cmd/project/update/update.go | 4 +- internal/cmd/public-ip/associate/associate.go | 2 +- internal/cmd/public-ip/create/create.go | 4 +- internal/cmd/public-ip/delete/delete.go | 2 +- internal/cmd/public-ip/describe/describe.go | 2 +- .../public-ip/disassociate/disassociate.go | 2 +- internal/cmd/public-ip/list/list.go | 4 +- internal/cmd/public-ip/update/update.go | 2 +- internal/cmd/quota/list/list.go | 4 +- .../cmd/rabbitmq/credentials/create/create.go | 2 +- .../cmd/rabbitmq/credentials/delete/delete.go | 2 +- .../rabbitmq/credentials/describe/describe.go | 2 +- .../cmd/rabbitmq/credentials/list/list.go | 2 +- .../cmd/rabbitmq/instance/create/create.go | 4 +- .../cmd/rabbitmq/instance/delete/delete.go | 2 +- .../rabbitmq/instance/describe/describe.go | 2 +- internal/cmd/rabbitmq/instance/list/list.go | 4 +- .../cmd/rabbitmq/instance/update/update.go | 2 +- internal/cmd/rabbitmq/plans/plans.go | 4 +- .../cmd/redis/credentials/create/create.go | 2 +- .../cmd/redis/credentials/delete/delete.go | 2 +- .../redis/credentials/describe/describe.go | 2 +- internal/cmd/redis/credentials/list/list.go | 2 +- internal/cmd/redis/instance/create/create.go | 4 +- internal/cmd/redis/instance/delete/delete.go | 2 +- .../cmd/redis/instance/describe/describe.go | 2 +- internal/cmd/redis/instance/list/list.go | 4 +- internal/cmd/redis/instance/update/update.go | 2 +- internal/cmd/redis/plans/plans.go | 4 +- .../secrets-manager/instance/create/create.go | 4 +- .../secrets-manager/instance/delete/delete.go | 2 +- .../instance/describe/describe.go | 2 +- .../cmd/secrets-manager/instance/list/list.go | 4 +- .../secrets-manager/instance/update/update.go | 2 +- .../cmd/secrets-manager/user/create/create.go | 2 +- .../cmd/secrets-manager/user/delete/delete.go | 2 +- .../secrets-manager/user/describe/describe.go | 2 +- .../cmd/secrets-manager/user/list/list.go | 2 +- .../cmd/secrets-manager/user/update/update.go | 2 +- internal/cmd/security-group/create/create.go | 2 +- internal/cmd/security-group/delete/delete.go | 4 +- .../cmd/security-group/describe/describe.go | 2 +- internal/cmd/security-group/list/list.go | 4 +- .../cmd/security-group/rule/create/create.go | 4 +- .../cmd/security-group/rule/delete/delete.go | 2 +- .../security-group/rule/describe/describe.go | 2 +- internal/cmd/security-group/rule/list/list.go | 4 +- internal/cmd/security-group/update/update.go | 4 +- internal/cmd/server/backup/create/create.go | 7 ++-- internal/cmd/server/backup/delete/delete.go | 2 +- .../cmd/server/backup/describe/describe.go | 2 +- internal/cmd/server/backup/disable/disable.go | 4 +- internal/cmd/server/backup/enable/enable.go | 4 +- internal/cmd/server/backup/list/list.go | 7 ++-- internal/cmd/server/backup/restore/restore.go | 2 +- .../server/backup/schedule/create/create.go | 7 ++-- .../server/backup/schedule/delete/delete.go | 4 +- .../backup/schedule/describe/describe.go | 2 +- .../cmd/server/backup/schedule/list/list.go | 7 ++-- .../server/backup/schedule/update/update.go | 2 +- .../backup/volume-backup/delete/delete.go | 2 +- .../backup/volume-backup/restore/restore.go | 2 +- internal/cmd/server/command/create/create.go | 7 ++-- .../cmd/server/command/describe/describe.go | 2 +- internal/cmd/server/command/list/list.go | 7 ++-- .../command/template/describe/describe.go | 2 +- .../cmd/server/command/template/list/list.go | 2 +- internal/cmd/server/console/console.go | 2 +- internal/cmd/server/create/create.go | 4 +- internal/cmd/server/deallocate/deallocate.go | 2 +- internal/cmd/server/delete/delete.go | 2 +- internal/cmd/server/describe/describe.go | 2 +- internal/cmd/server/list/list.go | 4 +- internal/cmd/server/log/log.go | 2 +- .../server/machine-type/describe/describe.go | 2 +- internal/cmd/server/machine-type/list/list.go | 4 +- .../server/network-interface/attach/attach.go | 2 +- .../server/network-interface/detach/detach.go | 2 +- .../cmd/server/network-interface/list/list.go | 2 +- .../cmd/server/os-update/create/create.go | 7 ++-- .../cmd/server/os-update/describe/describe.go | 2 +- .../cmd/server/os-update/disable/disable.go | 4 +- .../cmd/server/os-update/enable/enable.go | 4 +- internal/cmd/server/os-update/list/list.go | 4 +- .../os-update/schedule/create/create.go | 4 +- .../os-update/schedule/delete/delete.go | 2 +- .../os-update/schedule/describe/describe.go | 2 +- .../server/os-update/schedule/list/list.go | 7 ++-- .../os-update/schedule/update/update.go | 2 +- .../cmd/server/public-ip/attach/attach.go | 2 +- .../cmd/server/public-ip/detach/detach.go | 2 +- internal/cmd/server/reboot/reboot.go | 2 +- internal/cmd/server/rescue/rescue.go | 2 +- internal/cmd/server/resize/resize.go | 2 +- .../server/service-account/attach/attach.go | 2 +- .../server/service-account/detach/detach.go | 2 +- .../cmd/server/service-account/list/list.go | 2 +- internal/cmd/server/start/start.go | 2 +- internal/cmd/server/stop/stop.go | 2 +- internal/cmd/server/unrescue/unrescue.go | 2 +- internal/cmd/server/update/update.go | 2 +- internal/cmd/server/volume/attach/attach.go | 2 +- .../cmd/server/volume/describe/describe.go | 2 +- internal/cmd/server/volume/detach/detach.go | 2 +- internal/cmd/server/volume/list/list.go | 2 +- internal/cmd/server/volume/update/update.go | 2 +- internal/cmd/service-account/create/create.go | 4 +- internal/cmd/service-account/delete/delete.go | 2 +- .../cmd/service-account/get-jwks/get_jwks.go | 2 +- .../cmd/service-account/key/create/create.go | 2 +- .../cmd/service-account/key/delete/delete.go | 2 +- .../service-account/key/describe/describe.go | 2 +- internal/cmd/service-account/key/list/list.go | 2 +- .../cmd/service-account/key/update/update.go | 2 +- internal/cmd/service-account/list/list.go | 4 +- .../service-account/token/create/create.go | 2 +- .../cmd/service-account/token/list/list.go | 2 +- .../service-account/token/revoke/revoke.go | 2 +- internal/cmd/ske/cluster/create/create.go | 6 +-- internal/cmd/ske/cluster/delete/delete.go | 2 +- internal/cmd/ske/cluster/describe/describe.go | 2 +- .../generate-payload/generate_payload.go | 2 +- internal/cmd/ske/cluster/list/list.go | 6 +-- internal/cmd/ske/cluster/update/update.go | 2 +- .../complete-rotation/complete_rotation.go | 2 +- .../start-rotation/start_rotation.go | 2 +- internal/cmd/ske/describe/describe.go | 2 +- internal/cmd/ske/disable/disable.go | 4 +- internal/cmd/ske/enable/enable.go | 4 +- internal/cmd/ske/kubeconfig/create/create.go | 2 +- internal/cmd/ske/kubeconfig/login/login.go | 2 +- internal/cmd/ske/options/options.go | 2 +- internal/cmd/volume/create/create.go | 4 +- internal/cmd/volume/delete/delete.go | 2 +- internal/cmd/volume/describe/describe.go | 2 +- internal/cmd/volume/list/list.go | 4 +- .../performance-class/describe/describe.go | 2 +- .../cmd/volume/performance-class/list/list.go | 4 +- internal/cmd/volume/resize/resize.go | 2 +- internal/cmd/volume/update/update.go | 2 +- internal/pkg/projectname/project_name.go | 4 +- internal/pkg/projectname/project_name_test.go | 2 +- internal/pkg/services/alb/client/client.go | 16 ++++---- .../services/authorization/client/client.go | 14 +++---- internal/pkg/services/dns/client/client.go | 15 +++---- internal/pkg/services/iaas/client/client.go | 14 +++---- .../services/load-balancer/client/client.go | 16 ++++---- internal/pkg/services/logme/client/client.go | 15 +++---- .../pkg/services/mariadb/client/client.go | 15 +++---- .../pkg/services/mongodbflex/client/client.go | 15 +++---- .../services/object-storage/client/client.go | 16 ++++---- .../services/observability/client/client.go | 15 +++---- .../pkg/services/opensearch/client/client.go | 15 +++---- .../services/postgresflex/client/client.go | 15 +++---- .../pkg/services/rabbitmq/client/client.go | 15 +++---- internal/pkg/services/redis/client/client.go | 15 +++---- .../services/resourcemanager/client/client.go | 14 +++---- .../pkg/services/runcommand/client/client.go | 14 +++---- .../services/secrets-manager/client/client.go | 15 +++---- .../services/serverbackup/client/client.go | 14 +++---- .../services/serverosupdate/client/client.go | 13 +++--- .../services/service-account/client/client.go | 14 +++---- .../service-enablement/client/client.go | 14 +++---- internal/pkg/services/ske/client/client.go | 14 +++---- .../services/sqlserverflex/client/client.go | 14 +++---- internal/pkg/utils/utils.go | 5 +++ internal/pkg/utils/utils_test.go | 41 +++++++++++++++++++ 382 files changed, 724 insertions(+), 635 deletions(-) diff --git a/.github/docs/contribution-guide/client.go b/.github/docs/contribution-guide/client.go index 4b84a6538..3fdda371b 100644 --- a/.github/docs/contribution-guide/client.go +++ b/.github/docs/contribution-guide/client.go @@ -1,24 +1,29 @@ package client import ( - "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/foo" // (...) ) -func ConfigureClient(cmd *cobra.Command) (*foo.APIClient, error) { - var err error - var apiClient foo.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - - authCfgOption, err := auth.AuthenticationConfig(cmd, auth.AuthorizeUser) +func ConfigureClient(p *print.Printer, cliVersion string) (*foo.APIClient, error) { + authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion("eu01")) // Configuring region is needed if "foo" is a regional API + + region := viper.GetString(config.RegionKey) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), // Configuring region is needed if "foo" is a regional API + authCfgOption, + } customEndpoint := viper.GetString(config.fooCustomEndpointKey) @@ -26,8 +31,15 @@ func ConfigureClient(cmd *cobra.Command) (*foo.APIClient, error) { cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) } - apiClient, err = foo.NewAPIClient(cfgOptions...) + if p.IsVerbosityDebug() { + cfgOptions = append(cfgOptions, + sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), + ) + } + + apiClient, err := foo.NewAPIClient(cfgOptions...) if err != nil { + p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} } diff --git a/.github/docs/contribution-guide/cmd.go b/.github/docs/contribution-guide/cmd.go index 5fb05d2f4..175a9a6d3 100644 --- a/.github/docs/contribution-guide/cmd.go +++ b/.github/docs/contribution-guide/cmd.go @@ -12,6 +12,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" @@ -54,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer, cmd) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -66,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("(...): %w", err) } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { projectLabel = model.ProjectId } @@ -86,14 +87,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // Configure command flags (type, default value, and description) func configureFlags(cmd *cobra.Command) { - cmd.Flags().StringP(myFlag, "defaultValue", "My flag description") + cmd.Flags().StringP(someFlag, "shorthand", "defaultValue", "My flag description") } // Parse user input (arguments and/or flags) func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { myArg := inputArgs[0] - globalFlags := globalflags.Parse(cmd) + globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} } @@ -101,7 +102,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, MyArg: myArg, - MyFlag: flags.FlagToStringPointer(cmd, myFlag), + MyFlag: flags.FlagToStringPointer(p, cmd, someFlag), } // Write the input model to the debug logs @@ -119,7 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu // Build request to the API func buildRequest(ctx context.Context, model *inputModel, apiClient *foo.APIClient) foo.ApiListInstancesRequest { - req := apiClient.GetBar(ctx, model.ProjectId, model.MyArg, someParam) + req := apiClient.GetBar(ctx, model.ProjectId, model.MyArg, someArg) return req } @@ -147,7 +148,7 @@ func outputResult(p *print.Printer, cmd *cobra.Command, outputFormat string, res resource := resources[i] table.AddRow(*resource.ResourceId, *resource.Name, *resource.State) } - err := table.Display(cmd) + err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) } diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index d182c6534..e380d0458 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -53,7 +53,7 @@ Please remember to run `make generate-docs` after your changes to keep the comma Below is a typical structure of a CLI command: -https://github.com/stackitcloud/stackit-cli/blob/6f762bd56407ed232080efabc4d2bf87f260b71d/.github/docs/contribution-guide/cmd.go#L23-L156 +https://github.com/stackitcloud/stackit-cli/blob/85ce44cd18d11169f2548d8657031b5fc6f94740/.github/docs/contribution-guide/cmd.go#L23-L156 Please remember to always add unit tests for `parseInput`, `buildRequest` (in `bar_test.go`), and any other util functions used. @@ -83,7 +83,7 @@ If you want to add a command that uses a STACKIT service `foo` that was not yet 1. This is done in `internal/pkg/services/foo/client/client.go` 2. Below is an example of a typical `client.go` file structure: -https://github.com/stackitcloud/stackit-cli/blob/6f762bd56407ed232080efabc4d2bf87f260b71d/.github/docs/contribution-guide/client.go#L12-L35 +https://github.com/stackitcloud/stackit-cli/blob/85ce44cd18d11169f2548d8657031b5fc6f94740/.github/docs/contribution-guide/client.go#L12-L35 ### Local development diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index fc8482ea8..60b14fdd1 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index f36371648..eab65fd66 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -47,12 +47,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 566e42d5e..6abd3980c 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index cb06a6612..5665a970c 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index 4d5abe3c1..2622a3ce4 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -54,12 +54,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/alb/delete/delete.go b/internal/cmd/beta/alb/delete/delete.go index 0c443d593..25886cd40 100644 --- a/internal/cmd/beta/alb/delete/delete.go +++ b/internal/cmd/beta/alb/delete/delete.go @@ -45,12 +45,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/alb/describe/describe.go b/internal/cmd/beta/alb/describe/describe.go index db4418ddf..67a10bf4a 100644 --- a/internal/cmd/beta/alb/describe/describe.go +++ b/internal/cmd/beta/alb/describe/describe.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index cf1d478c5..6df67a81a 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -55,12 +55,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index e0eff7449..86b6ac2b9 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete.go b/internal/cmd/beta/alb/observability-credentials/delete/delete.go index df9f462f0..ccf998580 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete.go @@ -44,7 +44,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe.go b/internal/cmd/beta/alb/observability-credentials/describe/describe.go index 4081421ca..001e20278 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index bbbdd6db4..32baa31c6 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/observability-credentials/update/update.go b/internal/cmd/beta/alb/observability-credentials/update/update.go index 3231f0d95..18b68ccb4 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { model := parseInput(params.Printer, cmd, args) // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index f7d09bec6..d131422ad 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -44,12 +44,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index 94bdd2872..2dc8cd3a2 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -54,12 +54,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index 09735a914..c0ce6948b 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -43,7 +43,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 10e0b9bc5..2dcfddbb1 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -55,12 +55,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index ac7e345a8..f8ae03ccd 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index b1950aa86..0f2b221f7 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index 3ddbfa086..377d90476 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index ba22c593e..707922ef9 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -69,7 +69,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get SQLServer Flex databases: %w", err) } if resp.Databases == nil || len(*resp.Databases) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 9003de50b..b30d7615c 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -93,12 +93,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index 2b5723c50..ab1742879 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go index 7dec66a7d..d8e3a60c3 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 3f9abdb22..945eb5024 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -67,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get SQLServer Flex instances: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index 53921ea75..c857aba35 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -84,7 +84,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index d66f082c9..d5d62c10b 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -116,7 +116,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 501746b1e..7cd803ec7 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete.go b/internal/cmd/beta/sqlserverflex/user/delete/delete.go index dea859e97..8250b1b01 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe.go b/internal/cmd/beta/sqlserverflex/user/describe/describe.go index 7ccba07f1..1d94890ac 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index 29e2c803c..c45317bf2 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index ff560a2cf..35ef24063 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/config/list/list_test.go b/internal/cmd/config/list/list_test.go index 936e5a76d..cbdab8410 100644 --- a/internal/cmd/config/list/list_test.go +++ b/internal/cmd/config/list/list_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) diff --git a/internal/cmd/config/profile/create/create.go b/internal/cmd/config/profile/create/create.go index 8ab83f574..4d93bdd72 100644 --- a/internal/cmd/config/profile/create/create.go +++ b/internal/cmd/config/profile/create/create.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" diff --git a/internal/cmd/config/profile/create/create_test.go b/internal/cmd/config/profile/create/create_test.go index 097071947..6bf77a7ae 100644 --- a/internal/cmd/config/profile/create/create_test.go +++ b/internal/cmd/config/profile/create/create_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/cmd/config/profile/delete/delete.go b/internal/cmd/config/profile/delete/delete.go index 88d00907f..02c04e64a 100644 --- a/internal/cmd/config/profile/delete/delete.go +++ b/internal/cmd/config/profile/delete/delete.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" diff --git a/internal/cmd/config/profile/delete/delete_test.go b/internal/cmd/config/profile/delete/delete_test.go index 018ded22a..66374b69d 100644 --- a/internal/cmd/config/profile/delete/delete_test.go +++ b/internal/cmd/config/profile/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/cmd/config/profile/export/export_test.go b/internal/cmd/config/profile/export/export_test.go index d15885813..5975cf783 100644 --- a/internal/cmd/config/profile/export/export_test.go +++ b/internal/cmd/config/profile/export/export_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/cmd/config/profile/list/list.go b/internal/cmd/config/profile/list/list.go index 2a43aa417..86e2f3341 100644 --- a/internal/cmd/config/profile/list/list.go +++ b/internal/cmd/config/profile/list/list.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" diff --git a/internal/cmd/config/profile/set/set_test.go b/internal/cmd/config/profile/set/set_test.go index a12b0f328..67b5f0789 100644 --- a/internal/cmd/config/profile/set/set_test.go +++ b/internal/cmd/config/profile/set/set_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/cmd/config/set/set_test.go b/internal/cmd/config/set/set_test.go index e9647e268..8015fddff 100644 --- a/internal/cmd/config/set/set_test.go +++ b/internal/cmd/config/set/set_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index a977f8aa2..246696f15 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/google/go-cmp/cmp" diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 8441db8ac..49db52860 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/record-set/delete/delete.go b/internal/cmd/dns/record-set/delete/delete.go index a4026478f..015b8019d 100644 --- a/internal/cmd/dns/record-set/delete/delete.go +++ b/internal/cmd/dns/record-set/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/record-set/describe/describe.go b/internal/cmd/dns/record-set/describe/describe.go index 8f80674b8..c7d5e8c52 100644 --- a/internal/cmd/dns/record-set/describe/describe.go +++ b/internal/cmd/dns/record-set/describe/describe.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index 99a07bb5a..a1b59553b 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -82,7 +82,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/record-set/update/update.go b/internal/cmd/dns/record-set/update/update.go index 6d2a7ea06..74630d455 100644 --- a/internal/cmd/dns/record-set/update/update.go +++ b/internal/cmd/dns/record-set/update/update.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/record-set/update/update_test.go b/internal/cmd/dns/record-set/update/update_test.go index 99e32d0f9..228b4b956 100644 --- a/internal/cmd/dns/record-set/update/update_test.go +++ b/internal/cmd/dns/record-set/update/update_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index 1894b2291..7d81f13f8 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index d23d35f39..4855e4337 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -78,12 +78,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/dns/zone/delete/delete.go b/internal/cmd/dns/zone/delete/delete.go index 8c5b01bd9..443bbf186 100644 --- a/internal/cmd/dns/zone/delete/delete.go +++ b/internal/cmd/dns/zone/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/zone/describe/describe.go b/internal/cmd/dns/zone/describe/describe.go index b97ba0445..d68bbb177 100644 --- a/internal/cmd/dns/zone/describe/describe.go +++ b/internal/cmd/dns/zone/describe/describe.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index 017a171df..c3de2d640 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -89,7 +89,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } if len(zones) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/dns/zone/update/update.go b/internal/cmd/dns/zone/update/update.go index 09c4036fd..d7575c609 100644 --- a/internal/cmd/dns/zone/update/update.go +++ b/internal/cmd/dns/zone/update/update.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 704872c11..930811f51 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -106,7 +106,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index 456867bdd..bfce6ae4c 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -42,12 +42,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index 5c0b8a824..d1c945b81 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -44,7 +44,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index eff221cba..00f28b066 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -60,12 +60,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index e123d4fe1..e46e90790 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -120,12 +120,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index b59fe4fb0..5c4fb9196 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/key-pair/delete/delete.go b/internal/cmd/key-pair/delete/delete.go index 8bccdd45d..376d21174 100644 --- a/internal/cmd/key-pair/delete/delete.go +++ b/internal/cmd/key-pair/delete/delete.go @@ -44,7 +44,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/key-pair/describe/describe.go b/internal/cmd/key-pair/describe/describe.go index b355e7433..8de535589 100644 --- a/internal/cmd/key-pair/describe/describe.go +++ b/internal/cmd/key-pair/describe/describe.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/key-pair/list/list.go b/internal/cmd/key-pair/list/list.go index 980625695..b614cf5c1 100644 --- a/internal/cmd/key-pair/list/list.go +++ b/internal/cmd/key-pair/list/list.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index 3af038018..c34c1362b 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -47,7 +47,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { model := parseInput(params.Printer, cmd, args) // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index 541293bc2..f59683a47 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -66,12 +66,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index d5f3f6c75..84146f875 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -45,7 +45,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/describe/describe.go b/internal/cmd/load-balancer/describe/describe.go index fe8669864..2b5ff659d 100644 --- a/internal/cmd/load-balancer/describe/describe.go +++ b/internal/cmd/load-balancer/describe/describe.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 2fccfb37a..1197cf7a9 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -142,7 +142,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index 5d23c5d2a..02a1f30ed 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -69,7 +69,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.LoadBalancers == nil || (resp.LoadBalancers != nil && len(*resp.LoadBalancers) == 0) { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index abbbd36a0..533a222f4 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -57,12 +57,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index e69b3ae98..3bcf0190a 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -41,12 +41,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete.go b/internal/cmd/load-balancer/observability-credentials/delete/delete.go index 12b260489..bef2362b9 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete.go @@ -46,12 +46,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe.go b/internal/cmd/load-balancer/observability-credentials/describe/describe.go index a09a94685..85c32ba7f 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 92dcb9602..714364c47 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -67,12 +67,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/observability-credentials/update/update.go b/internal/cmd/load-balancer/observability-credentials/update/update.go index 942c20131..29761043e 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update.go @@ -68,12 +68,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index fdb173fb0..2925d7f52 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -41,7 +41,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 5dec7bfca..46faf8bb9 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index b9699e7c0..ea0f6dace 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index 5d8297665..3ca65c79b 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/load-balancer/update/update.go b/internal/cmd/load-balancer/update/update.go index ab2a82d88..db183702d 100644 --- a/internal/cmd/load-balancer/update/update.go +++ b/internal/cmd/load-balancer/update/update.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index 80783e6da..c1e44ccff 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/credentials/delete/delete.go b/internal/cmd/logme/credentials/delete/delete.go index 2295be928..fabd2b838 100644 --- a/internal/cmd/logme/credentials/delete/delete.go +++ b/internal/cmd/logme/credentials/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/credentials/describe/describe.go b/internal/cmd/logme/credentials/describe/describe.go index faf1537b6..240df0f81 100644 --- a/internal/cmd/logme/credentials/describe/describe.go +++ b/internal/cmd/logme/credentials/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index 107824d39..218dff2d1 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index 89f2d9dc0..ca00f4cdc 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -81,12 +81,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/logme/instance/delete/delete.go b/internal/cmd/logme/instance/delete/delete.go index 25693c798..905c51bed 100644 --- a/internal/cmd/logme/instance/delete/delete.go +++ b/internal/cmd/logme/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/instance/describe/describe.go b/internal/cmd/logme/instance/describe/describe.go index 29b86a0a7..bf7892373 100644 --- a/internal/cmd/logme/instance/describe/describe.go +++ b/internal/cmd/logme/instance/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index 821727852..e325aee95 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/logme/instance/update/update.go b/internal/cmd/logme/instance/update/update.go index 79802ee58..a7e3ec443 100644 --- a/internal/cmd/logme/instance/update/update.go +++ b/internal/cmd/logme/instance/update/update.go @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index 2eb665d7e..8c339a1ee 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index 7e4a8a592..cf42e1ca2 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/credentials/delete/delete.go b/internal/cmd/mariadb/credentials/delete/delete.go index 5df7736dc..cbce0078d 100644 --- a/internal/cmd/mariadb/credentials/delete/delete.go +++ b/internal/cmd/mariadb/credentials/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/credentials/describe/describe.go b/internal/cmd/mariadb/credentials/describe/describe.go index c868a7d60..7a03a4377 100644 --- a/internal/cmd/mariadb/credentials/describe/describe.go +++ b/internal/cmd/mariadb/credentials/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index acb97d02f..f9a3f43d7 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index dae8ad6b3..b84368fa2 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -81,12 +81,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/mariadb/instance/delete/delete.go b/internal/cmd/mariadb/instance/delete/delete.go index 7b7b2d6e5..eaca7989a 100644 --- a/internal/cmd/mariadb/instance/delete/delete.go +++ b/internal/cmd/mariadb/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/instance/describe/describe.go b/internal/cmd/mariadb/instance/describe/describe.go index 978cdcf24..58f07db66 100644 --- a/internal/cmd/mariadb/instance/describe/describe.go +++ b/internal/cmd/mariadb/instance/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 3bba56507..7e5b8e0d6 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/mariadb/instance/update/update.go b/internal/cmd/mariadb/instance/update/update.go index 80cabdac5..26059ff6f 100644 --- a/internal/cmd/mariadb/instance/update/update.go +++ b/internal/cmd/mariadb/instance/update/update.go @@ -76,7 +76,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index 5b342f29e..c54703a1e 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index 43e8a0b81..f565aebd4 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index 75ddca216..f2e40bd83 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 7119dccbb..81c5853c8 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index 067c0e56e..ed86d7c61 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 55272a544..16cd47d24 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index d417ccbf4..e93f557ea 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -76,7 +76,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 2b8905364..05df2b9e5 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -83,12 +83,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index 86653c5a3..609307fbd 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index 2b64e3432..65765a540 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index a016550cc..633caee2c 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get MongoDB Flex instances: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index e1882bfd9..b861cc423 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 92c6c55bb..10e9f6f5c 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index afc26fe76..095077242 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -67,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/user/delete/delete.go b/internal/cmd/mongodbflex/user/delete/delete.go index d57879062..1d0818522 100644 --- a/internal/cmd/mongodbflex/user/delete/delete.go +++ b/internal/cmd/mongodbflex/user/delete/delete.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/user/describe/describe.go b/internal/cmd/mongodbflex/user/describe/describe.go index 89f919f7b..67eb3d84b 100644 --- a/internal/cmd/mongodbflex/user/describe/describe.go +++ b/internal/cmd/mongodbflex/user/describe/describe.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index 299319462..ffdb6f10a 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index 72d7ad9d4..0144a20b5 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index 3ebdf4e6d..8dded41b0 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 80c14dc37..0bc3ae47a 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -78,13 +78,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } var orgLabel string - rmApiClient, err := rmClient.ConfigureClient(params.Printer) + rmApiClient, err := rmClient.ConfigureClient(params.Printer, params.CliVersion) if err == nil { orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) if err != nil { diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index 49f618338..9664f8305 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index 6658b1feb..45c2cc4dc 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index 82147c17b..aef31e48b 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -67,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -81,7 +82,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if resp.Items == nil || len(*resp.Items) == 0 { var orgLabel string - rmApiClient, err := rmClient.ConfigureClient(params.Printer) + rmApiClient, err := rmClient.ConfigureClient(params.Printer, params.CliVersion) if err == nil { orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) if err != nil { diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index 7d81e2358..cdc54b800 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index 4b7397796..fb4f53de0 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index 45bcfa4e4..d594ebb64 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index aed963ba0..e7acd42e8 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 56ac716b4..4cd29e663 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index f455786d2..11e36eff8 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index 8e48f1ee6..e58a3a2d5 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index f8159617b..2c099c3f8 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index ab4c8c860..1fb9f13f6 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 7e9615aff..122e94f33 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" + "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -13,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -66,13 +67,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } var orgLabel string - rmApiClient, err := rmClient.ConfigureClient(params.Printer) + rmApiClient, err := rmClient.ConfigureClient(params.Printer, params.CliVersion) if err == nil { orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) if err != nil { diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index 08a8c7cac..f1024f844 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -74,12 +74,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index 925bf29b7..8450f5abc 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index aba9ed65a..b221a0b1b 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index e7282358f..eeb3c9be6 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 9cf746745..e92c5b8be 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -76,7 +76,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 339025b74..08e4e20b2 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -96,12 +96,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index a0adcb6d0..005c3e312 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index 129c52899..b4c12a317 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index 90e6efa0e..2584d7fd7 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 1b331a802..22a8cf87a 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -79,7 +79,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index f4337d7e3..fd899a4d2 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index 0b4174f47..fa4e68e99 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -46,7 +46,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index c1fd344d6..4112c0674 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index cbfa41574..8060094c1 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -67,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get Object Storage buckets: %w", err) } if resp.Buckets == nil || len(*resp.Buckets) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index 02dfba938..dac9c248c 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/credentials-group/delete/delete.go b/internal/cmd/object-storage/credentials-group/delete/delete.go index 11457da96..ff880c0f7 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete.go @@ -46,7 +46,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index e239167b0..ccea6fc84 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index bce332f93..eaef679f5 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index e8cc8a4e3..dea8797b0 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -47,7 +47,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index 33a41860f..211ac8d77 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index 0486e90ae..f6b8ee848 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -40,12 +40,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index 00959bcfa..6a064bb3c 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -40,12 +40,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index f968f0a7e..139ed39dd 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/credentials/delete/delete.go b/internal/cmd/observability/credentials/delete/delete.go index 0c85bf2b6..eeb00d2b9 100644 --- a/internal/cmd/observability/credentials/delete/delete.go +++ b/internal/cmd/observability/credentials/delete/delete.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/credentials/list/list.go b/internal/cmd/observability/credentials/list/list.go index 3bf6bf231..d5cc513fe 100644 --- a/internal/cmd/observability/credentials/list/list.go +++ b/internal/cmd/observability/credentials/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index bce33d2a6..2ad9103e6 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index 0f122fc96..5696bf623 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index a13ae2c08..7cd00b9e2 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index 14084d154..bf6de05a4 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go index 9956ebd9b..84b2bc0c4 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 5158941e5..37f3a8114 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -61,12 +61,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index eb1790ebd..ff0d1bd62 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index 7e03dbb03..506bdcbc1 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/instance/describe/describe.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index e82c2254b..011842a4e 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index 90411dd26..b314a6ecc 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index 90867c27a..7fe3feabf 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -69,7 +69,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } plans := *resp.Plans if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index 9bd89d9d7..d11d4b575 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/scrape-config/delete/delete.go b/internal/cmd/observability/scrape-config/delete/delete.go index 0bc137b3b..5ec7e3931 100644 --- a/internal/cmd/observability/scrape-config/delete/delete.go +++ b/internal/cmd/observability/scrape-config/delete/delete.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 2c6e24573..0b7eb0eb5 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go index 3a1927114..487fa32b3 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/scrape-config/list/list.go b/internal/cmd/observability/scrape-config/list/list.go index b03ec740b..95a9770cc 100644 --- a/internal/cmd/observability/scrape-config/list/list.go +++ b/internal/cmd/observability/scrape-config/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/observability/scrape-config/update/update.go b/internal/cmd/observability/scrape-config/update/update.go index 25b423452..ab39ea9e0 100644 --- a/internal/cmd/observability/scrape-config/update/update.go +++ b/internal/cmd/observability/scrape-config/update/update.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index ce5a1cf9b..fdc2760f7 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/credentials/delete/delete.go b/internal/cmd/opensearch/credentials/delete/delete.go index 97e2fc14b..faccd169e 100644 --- a/internal/cmd/opensearch/credentials/delete/delete.go +++ b/internal/cmd/opensearch/credentials/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/credentials/describe/describe.go b/internal/cmd/opensearch/credentials/describe/describe.go index d70edf933..92bdf6350 100644 --- a/internal/cmd/opensearch/credentials/describe/describe.go +++ b/internal/cmd/opensearch/credentials/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index b4d200b1e..0efb58d37 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index 336a2e5ab..bc41bfbed 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -83,12 +83,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/opensearch/instance/delete/delete.go b/internal/cmd/opensearch/instance/delete/delete.go index cd7f159d3..e0ed0db20 100644 --- a/internal/cmd/opensearch/instance/delete/delete.go +++ b/internal/cmd/opensearch/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/instance/describe/describe.go b/internal/cmd/opensearch/instance/describe/describe.go index d8722d9d5..da181a5a4 100644 --- a/internal/cmd/opensearch/instance/describe/describe.go +++ b/internal/cmd/opensearch/instance/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index 0b0aa93c8..e32b425e5 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/opensearch/instance/update/update.go b/internal/cmd/opensearch/instance/update/update.go index 85ba3f133..254a9a41b 100644 --- a/internal/cmd/opensearch/instance/update/update.go +++ b/internal/cmd/opensearch/instance/update/update.go @@ -79,7 +79,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index e2678f163..c096fb230 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/organization/member/add/add.go b/internal/cmd/organization/member/add/add.go index 246a7f27f..d3dd1f81b 100644 --- a/internal/cmd/organization/member/add/add.go +++ b/internal/cmd/organization/member/add/add.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index 105f6b14a..6e414d257 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/organization/member/remove/remove.go b/internal/cmd/organization/member/remove/remove.go index 7ff3c9147..6281b4214 100644 --- a/internal/cmd/organization/member/remove/remove.go +++ b/internal/cmd/organization/member/remove/remove.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index c8925c90e..c16d145c2 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/backup/describe/describe.go b/internal/cmd/postgresflex/backup/describe/describe.go index 758fb955a..5e0ecf5c9 100644 --- a/internal/cmd/postgresflex/backup/describe/describe.go +++ b/internal/cmd/postgresflex/backup/describe/describe.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/backup/list/list.go b/internal/cmd/postgresflex/backup/list/list.go index 3f463a670..5527343ad 100644 --- a/internal/cmd/postgresflex/backup/list/list.go +++ b/internal/cmd/postgresflex/backup/list/list.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go index a9f3bb70d..376b04bae 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index b8a31cd4e..2967fdbb3 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index 32301a4d4..7def7878c 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -84,12 +84,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/postgresflex/instance/delete/delete.go b/internal/cmd/postgresflex/instance/delete/delete.go index acf78c5ba..1c892657d 100644 --- a/internal/cmd/postgresflex/instance/delete/delete.go +++ b/internal/cmd/postgresflex/instance/delete/delete.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/instance/describe/describe.go b/internal/cmd/postgresflex/instance/describe/describe.go index 13604fb58..9d58c781b 100644 --- a/internal/cmd/postgresflex/instance/describe/describe.go +++ b/internal/cmd/postgresflex/instance/describe/describe.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index d3870566b..2431afa89 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -69,7 +69,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get PostgreSQL Flex instances: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 980a358df..3a50f8dfa 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index cbf87326d..66535e387 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index 8808e676e..00e214089 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/user/delete/delete.go b/internal/cmd/postgresflex/user/delete/delete.go index 2ed42cd8f..925453632 100644 --- a/internal/cmd/postgresflex/user/delete/delete.go +++ b/internal/cmd/postgresflex/user/delete/delete.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/user/describe/describe.go b/internal/cmd/postgresflex/user/describe/describe.go index 75e239d68..fb18ff889 100644 --- a/internal/cmd/postgresflex/user/describe/describe.go +++ b/internal/cmd/postgresflex/user/describe/describe.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index 3c8f79e77..a493855e2 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index 0d324a07b..45255b988 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/postgresflex/user/update/update.go b/internal/cmd/postgresflex/user/update/update.go index 5466348d3..4149a3b78 100644 --- a/internal/cmd/postgresflex/user/update/update.go +++ b/internal/cmd/postgresflex/user/update/update.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index d8c687bbd..17e9e950e 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -73,7 +73,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/project/delete/delete.go b/internal/cmd/project/delete/delete.go index c0d4e121e..4e83d9324 100644 --- a/internal/cmd/project/delete/delete.go +++ b/internal/cmd/project/delete/delete.go @@ -43,12 +43,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/project/describe/describe.go b/internal/cmd/project/describe/describe.go index 7fe4c7b9b..edd17d483 100644 --- a/internal/cmd/project/describe/describe.go +++ b/internal/cmd/project/describe/describe.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index c2aaccad5..364458a7c 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/project/member/add/add.go b/internal/cmd/project/member/add/add.go index 5f9456602..1d40c0ec5 100644 --- a/internal/cmd/project/member/add/add.go +++ b/internal/cmd/project/member/add/add.go @@ -59,12 +59,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index c7c220121..673b4f755 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -76,7 +76,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } members := *resp.Members if len(members) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/project/member/remove/remove.go b/internal/cmd/project/member/remove/remove.go index 9fc60a116..b4030199f 100644 --- a/internal/cmd/project/member/remove/remove.go +++ b/internal/cmd/project/member/remove/remove.go @@ -62,12 +62,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index 9ffd80067..2f49ba18b 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -71,7 +71,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } roles := *resp.Roles if len(roles) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/project/update/update.go b/internal/cmd/project/update/update.go index e217f55f5..b46641ec4 100644 --- a/internal/cmd/project/update/update.go +++ b/internal/cmd/project/update/update.go @@ -62,12 +62,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index 369efc526..82de08fcb 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index e072655db..68252751f 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -59,12 +59,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index 5382526e7..9cb01d38e 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index 18f96d46d..db2ac5050 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index cdd427605..7630ce7c5 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -47,7 +47,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index df57f864c..37756c8c2 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index 0e9a2180a..939b91ccf 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index 756c10ff5..81397affc 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -44,12 +44,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 0cbe75a6f..6195ec768 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/credentials/delete/delete.go b/internal/cmd/rabbitmq/credentials/delete/delete.go index 433348260..9421e898e 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/credentials/describe/describe.go b/internal/cmd/rabbitmq/credentials/describe/describe.go index 9ad4dcc9f..e04eb1c2e 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index 6a06c9313..d31efe256 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index 77f34ed7f..a5ea1b7af 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -83,12 +83,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index 992526969..852fa0d2e 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/instance/describe/describe.go b/internal/cmd/rabbitmq/instance/describe/describe.go index e79f476fa..734bd97ce 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe.go +++ b/internal/cmd/rabbitmq/instance/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index cad8afdb3..4556f201f 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index f75c97cac..b86b9f969 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -79,7 +79,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index fc9276a93..996cea081 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -69,7 +69,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index 17d6e4164..3e6d2d961 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/credentials/delete/delete.go b/internal/cmd/redis/credentials/delete/delete.go index 147ad731b..4d438bfba 100644 --- a/internal/cmd/redis/credentials/delete/delete.go +++ b/internal/cmd/redis/credentials/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/credentials/describe/describe.go b/internal/cmd/redis/credentials/describe/describe.go index 9ab0e9ab4..028554868 100644 --- a/internal/cmd/redis/credentials/describe/describe.go +++ b/internal/cmd/redis/credentials/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index 603dc86ed..d7edc501e 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index 86fdec837..bece1146e 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -81,12 +81,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/redis/instance/delete/delete.go b/internal/cmd/redis/instance/delete/delete.go index bb4efebda..01fa78218 100644 --- a/internal/cmd/redis/instance/delete/delete.go +++ b/internal/cmd/redis/instance/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/instance/describe/describe.go b/internal/cmd/redis/instance/describe/describe.go index c01d82ddd..22e9e4805 100644 --- a/internal/cmd/redis/instance/describe/describe.go +++ b/internal/cmd/redis/instance/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index 87f7b6d3e..cc2bcacbd 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } instances := *resp.Instances if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/redis/instance/update/update.go b/internal/cmd/redis/instance/update/update.go index 65e92c860..6d2e919f7 100644 --- a/internal/cmd/redis/instance/update/update.go +++ b/internal/cmd/redis/instance/update/update.go @@ -76,7 +76,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index 7bcb60218..7e663c8c3 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } plans := *resp.Offerings if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index ad1a8195f..cd0cfd175 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -56,12 +56,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/secrets-manager/instance/delete/delete.go b/internal/cmd/secrets-manager/instance/delete/delete.go index dda64b620..121d5427d 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete.go +++ b/internal/cmd/secrets-manager/instance/delete/delete.go @@ -45,7 +45,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/instance/describe/describe.go b/internal/cmd/secrets-manager/instance/describe/describe.go index e794a2cce..3aed94fd5 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe.go +++ b/internal/cmd/secrets-manager/instance/describe/describe.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index cf6d4c745..4098a7d76 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Instances == nil || len(*resp.Instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/secrets-manager/instance/update/update.go b/internal/cmd/secrets-manager/instance/update/update.go index 371711e55..b460360e2 100644 --- a/internal/cmd/secrets-manager/instance/update/update.go +++ b/internal/cmd/secrets-manager/instance/update/update.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index 62d54d9d7..5e8e3e25f 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/user/delete/delete.go b/internal/cmd/secrets-manager/user/delete/delete.go index fc3272435..571ef6130 100644 --- a/internal/cmd/secrets-manager/user/delete/delete.go +++ b/internal/cmd/secrets-manager/user/delete/delete.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/user/describe/describe.go b/internal/cmd/secrets-manager/user/describe/describe.go index c08e0ac32..b11949417 100644 --- a/internal/cmd/secrets-manager/user/describe/describe.go +++ b/internal/cmd/secrets-manager/user/describe/describe.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index b414e2cd9..7040d69a6 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/secrets-manager/user/update/update.go b/internal/cmd/secrets-manager/user/update/update.go index f0b6e35b9..07e9b6edd 100644 --- a/internal/cmd/secrets-manager/user/update/update.go +++ b/internal/cmd/secrets-manager/user/update/update.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 891abccc9..54f521d26 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 0d116da7e..329e4b026 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -42,12 +42,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/security-group/describe/describe.go b/internal/cmd/security-group/describe/describe.go index bde9cbc9f..1ea5bf64d 100644 --- a/internal/cmd/security-group/describe/describe.go +++ b/internal/cmd/security-group/describe/describe.go @@ -45,7 +45,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index 592c65408..1459a3c11 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -49,12 +49,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index a5b4bbc9d..d0e7bb008 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -85,12 +85,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index adca9d3eb..6acae57c7 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index feefb5d54..47cd0e554 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index 50304378e..c0bec27c6 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -82,7 +82,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { securityGroupLabel = *model.SecurityGroupId } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index a91c07971..083470467 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -53,12 +53,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index ba2aa95c5..ccabadb65 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -13,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -63,14 +64,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/delete/delete.go b/internal/cmd/server/backup/delete/delete.go index a30dec646..5fed34276 100644 --- a/internal/cmd/server/backup/delete/delete.go +++ b/internal/cmd/server/backup/delete/delete.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/backup/describe/describe.go b/internal/cmd/server/backup/describe/describe.go index 9b3ad9247..b44ec3fbe 100644 --- a/internal/cmd/server/backup/describe/describe.go +++ b/internal/cmd/server/backup/describe/describe.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index a61dce696..f456647ba 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -48,14 +48,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index 89265e748..c4a4402b6 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -48,14 +48,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index ccd29a624..775f88198 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" @@ -55,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if len(backups) == 0 { serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/restore/restore.go b/internal/cmd/server/backup/restore/restore.go index 445680053..db9a48bac 100644 --- a/internal/cmd/server/backup/restore/restore.go +++ b/internal/cmd/server/backup/restore/restore.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index 09b834c50..c400e4e06 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -13,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -71,14 +72,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/schedule/delete/delete.go b/internal/cmd/server/backup/schedule/delete/delete.go index 69dc81579..fbf35a733 100644 --- a/internal/cmd/server/backup/schedule/delete/delete.go +++ b/internal/cmd/server/backup/schedule/delete/delete.go @@ -49,14 +49,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/schedule/describe/describe.go b/internal/cmd/server/backup/schedule/describe/describe.go index cc838e0a8..49c5fd5ee 100644 --- a/internal/cmd/server/backup/schedule/describe/describe.go +++ b/internal/cmd/server/backup/schedule/describe/describe.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index 3ad1c840e..edb0c4411 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" @@ -55,14 +56,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/backup/schedule/update/update.go b/internal/cmd/server/backup/schedule/update/update.go index 4bc895fc0..bdb3d8040 100644 --- a/internal/cmd/server/backup/schedule/update/update.go +++ b/internal/cmd/server/backup/schedule/update/update.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/backup/volume-backup/delete/delete.go b/internal/cmd/server/backup/volume-backup/delete/delete.go index 1b924fe85..d6e040d56 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/backup/volume-backup/restore/restore.go b/internal/cmd/server/backup/volume-backup/restore/restore.go index db7c6b543..4d3dd8bc9 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 748d50b9b..1a766ef46 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" runcommandUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/utils" @@ -59,14 +60,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/command/describe/describe.go b/internal/cmd/server/command/describe/describe.go index a93d66988..ba09d2575 100644 --- a/internal/cmd/server/command/describe/describe.go +++ b/internal/cmd/server/command/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index f5deb62d1..a05d1a034 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" @@ -55,14 +56,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index a694b9cad..7a83bf609 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index 439df690d..a085c3210 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index 35e5f814a..1462a97ac 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 25544b3c8..33b20c247 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -118,12 +118,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index f51fab931..b614ba471 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index d9a366c2e..c5aae8216 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/describe/describe.go b/internal/cmd/server/describe/describe.go index 4873e688c..85444e6ec 100644 --- a/internal/cmd/server/describe/describe.go +++ b/internal/cmd/server/describe/describe.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index 867a0e233..29eb51222 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index 76e80cc67..11bbfe006 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index 018bf0ad7..522d13bd3 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 2e5a20bde..5ec90d0c4 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 68e670159..6f2a64163 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index 6a2517e50..58024dc3e 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index 62d4f6c8b..c3d9769c3 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 0bb65907d..76d97cc01 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -13,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -58,14 +59,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/os-update/describe/describe.go b/internal/cmd/server/os-update/describe/describe.go index e722e3994..3c8de58ee 100644 --- a/internal/cmd/server/os-update/describe/describe.go +++ b/internal/cmd/server/os-update/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index 153754db3..510411798 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -47,14 +47,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index ad0467bb5..e796767c6 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -48,14 +48,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index ed7f183b7..4092be38a 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if len(updates) == 0 { serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index f64b10728..cae0f7377 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -67,14 +67,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/os-update/schedule/delete/delete.go b/internal/cmd/server/os-update/schedule/delete/delete.go index a439bf76a..0d2762d65 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete.go +++ b/internal/cmd/server/os-update/schedule/delete/delete.go @@ -47,7 +47,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/os-update/schedule/describe/describe.go b/internal/cmd/server/os-update/schedule/describe/describe.go index f66c9b5d2..89aaba7b0 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/server/os-update/schedule/describe/describe.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index b14299303..3f8eeb6cb 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" @@ -55,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -70,7 +71,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if len(schedules) == 0 { serverLabel := model.ServerId // Get server name - if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer); err == nil { + if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index bae09473e..3394ba5ba 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 8caecd342..843c030e7 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index c8066db67..3c1aa6687 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index 465adaaa1..dbdc10ef1 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index 73aeae948..5c4efea4f 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index 8d3f19b3e..57e6ebe1b 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index e4e29042c..89232fa88 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index 6b79c6998..69bc5e4fe 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index 5c90714fd..19bfc8fa0 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index 918bab2a3..5a6f9d02a 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index ccb21bedc..aa510ef01 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index 181ab88bc..44bf3ace1 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index 2b8b35985..7d4c56241 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index fee7c9097..e4c714531 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 87ebac142..5b46ced73 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index e557fc383..d794ddcf8 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index f3ac90101..93263daf2 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index e4795996d..768643d36 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index fba36dfeb..c998de0f8 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -49,12 +49,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/service-account/delete/delete.go b/internal/cmd/service-account/delete/delete.go index 829d6ac4c..a92acdb4f 100644 --- a/internal/cmd/service-account/delete/delete.go +++ b/internal/cmd/service-account/delete/delete.go @@ -44,7 +44,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/get-jwks/get_jwks.go b/internal/cmd/service-account/get-jwks/get_jwks.go index 641cba592..441851bac 100644 --- a/internal/cmd/service-account/get-jwks/get_jwks.go +++ b/internal/cmd/service-account/get-jwks/get_jwks.go @@ -42,7 +42,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/key/create/create.go b/internal/cmd/service-account/key/create/create.go index 6d99a38fb..1b58d12b8 100644 --- a/internal/cmd/service-account/key/create/create.go +++ b/internal/cmd/service-account/key/create/create.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/key/delete/delete.go b/internal/cmd/service-account/key/delete/delete.go index ffd77b76a..e780ddd33 100644 --- a/internal/cmd/service-account/key/delete/delete.go +++ b/internal/cmd/service-account/key/delete/delete.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/key/describe/describe.go b/internal/cmd/service-account/key/describe/describe.go index 3b7c16ca4..ecf541f3f 100644 --- a/internal/cmd/service-account/key/describe/describe.go +++ b/internal/cmd/service-account/key/describe/describe.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index 194c66486..a39782f56 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/key/update/update.go b/internal/cmd/service-account/key/update/update.go index 9df30b2a9..62183d56f 100644 --- a/internal/cmd/service-account/key/update/update.go +++ b/internal/cmd/service-account/key/update/update.go @@ -67,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index 063e4176a..121b5216d 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } serviceAccounts := *resp.Items if len(serviceAccounts) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index 83c249644..5b74fdae7 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/token/list/list.go b/internal/cmd/service-account/token/list/list.go index 5a51b0ab7..956b79908 100644 --- a/internal/cmd/service-account/token/list/list.go +++ b/internal/cmd/service-account/token/list/list.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/service-account/token/revoke/revoke.go b/internal/cmd/service-account/token/revoke/revoke.go index 18dfe9fb1..0ac624a89 100644 --- a/internal/cmd/service-account/token/revoke/revoke.go +++ b/internal/cmd/service-account/token/revoke/revoke.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 5c017d90d..3f7f9a802 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -71,12 +71,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId @@ -91,7 +91,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure ServiceEnable API client - serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(params.Printer) + serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index b78925dd5..8a6e5c9cc 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -46,7 +46,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 1b6d08dc8..703ce9b0f 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index b3a94f2ef..14400f175 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index a3cde587f..6674be931 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -58,13 +58,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } // Configure ServiceEnable API client - serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(params.Printer) + serviceEnablementApiClient, err := serviceEnablementClient.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -86,7 +86,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } clusters := *resp.Items if len(clusters) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index aea878064..8ce6568e9 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index 69dd87211..4b9dfa1d6 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index 485e26a10..4e34c9ebe 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index 06522d5fb..da717570e 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -42,7 +42,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index 12685a580..ea355ada1 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -43,12 +43,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 7701c3bf5..91431b5e3 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -43,12 +43,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index e7a252456..c4565223c 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -84,7 +84,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index ce748d242..058197418 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -75,7 +75,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 6aed48591..0608e5a7d 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 06c7da8e8..258e0752a 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -78,12 +78,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index e9730faf9..910e849b4 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index c8b787456..9d4c06538 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index feffde80e..7534bb4a3 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -77,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index 3105e4fcc..dc7b25ad5 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index b48f399f6..a6490e75e 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, cmd) + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) if err != nil { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index afef2a7a3..f86f10546 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -51,7 +51,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 0c57f6185..80e137987 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/pkg/projectname/project_name.go b/internal/pkg/projectname/project_name.go index b50239b9f..84381a8c6 100644 --- a/internal/pkg/projectname/project_name.go +++ b/internal/pkg/projectname/project_name.go @@ -19,7 +19,7 @@ import ( // Returns the project name associated to the project ID set in config // // Uses the one stored in config if it's valid, otherwise gets it from the API -func GetProjectName(ctx context.Context, p *print.Printer, cmd *cobra.Command) (string, error) { +func GetProjectName(ctx context.Context, p *print.Printer, cliVersion string, cmd *cobra.Command) (string, error) { // If we can use the project name from config, return it if useProjectNameFromConfig(p, cmd) { return viper.GetString(config.ProjectNameKey), nil @@ -30,7 +30,7 @@ func GetProjectName(ctx context.Context, p *print.Printer, cmd *cobra.Command) ( return "", fmt.Errorf("found empty project ID and name") } - apiClient, err := client.ConfigureClient(p) + apiClient, err := client.ConfigureClient(p, cliVersion) if err != nil { return "", fmt.Errorf("configure resource manager client: %w", err) } diff --git a/internal/pkg/projectname/project_name_test.go b/internal/pkg/projectname/project_name_test.go index 25239c8f4..ae6d79251 100644 --- a/internal/pkg/projectname/project_name_test.go +++ b/internal/pkg/projectname/project_name_test.go @@ -42,7 +42,7 @@ func TestGetProjectName(t *testing.T) { p := print.NewPrinter() cmd := &cobra.Command{} - projectName, err := GetProjectName(context.Background(), p, cmd) + projectName, err := GetProjectName(context.Background(), p, "0.0.0-dummy", cmd) if err != nil { if tt.isValid { t.Fatalf("unexpected error: %v", err) diff --git a/internal/pkg/services/alb/client/client.go b/internal/pkg/services/alb/client/client.go index c29f9eddb..866a76ad5 100644 --- a/internal/pkg/services/alb/client/client.go +++ b/internal/pkg/services/alb/client/client.go @@ -5,29 +5,27 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) -func ConfigureClient(p *print.Printer) (*alb.APIClient, error) { - var err error - var apiClient *alb.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*alb.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.IaaSCustomEndpointKey) if customEndpoint != "" { cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - cfgOptions = append(cfgOptions, authCfgOption) } if p.IsVerbosityDebug() { @@ -36,7 +34,7 @@ func ConfigureClient(p *print.Printer) (*alb.APIClient, error) { ) } - apiClient, err = alb.NewAPIClient(cfgOptions...) + apiClient, err := alb.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/authorization/client/client.go b/internal/pkg/services/authorization/client/client.go index 19c13d663..7deb26b12 100644 --- a/internal/pkg/services/authorization/client/client.go +++ b/internal/pkg/services/authorization/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) -func ConfigureClient(p *print.Printer) (*authorization.APIClient, error) { - var err error - var apiClient *authorization.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*authorization.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.AuthorizationCustomEndpointKey) @@ -35,7 +35,7 @@ func ConfigureClient(p *print.Printer) (*authorization.APIClient, error) { ) } - apiClient, err = authorization.NewAPIClient(cfgOptions...) + apiClient, err := authorization.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/dns/client/client.go b/internal/pkg/services/dns/client/client.go index 384bc2cca..15b824da3 100644 --- a/internal/pkg/services/dns/client/client.go +++ b/internal/pkg/services/dns/client/client.go @@ -1,6 +1,8 @@ package client import ( + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -11,17 +13,16 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -func ConfigureClient(p *print.Printer) (*dns.APIClient, error) { - var err error - var apiClient *dns.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*dns.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.DNSCustomEndpointKey) @@ -35,7 +36,7 @@ func ConfigureClient(p *print.Printer) (*dns.APIClient, error) { ) } - apiClient, err = dns.NewAPIClient(cfgOptions...) + apiClient, err := dns.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/iaas/client/client.go b/internal/pkg/services/iaas/client/client.go index 4f37168e7..e32d15b4c 100644 --- a/internal/pkg/services/iaas/client/client.go +++ b/internal/pkg/services/iaas/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -func ConfigureClient(p *print.Printer) (*iaas.APIClient, error) { - var err error - var apiClient *iaas.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*iaas.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.IaaSCustomEndpointKey) if customEndpoint != "" { @@ -37,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*iaas.APIClient, error) { ) } - apiClient, err = iaas.NewAPIClient(cfgOptions...) + apiClient, err := iaas.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/load-balancer/client/client.go b/internal/pkg/services/load-balancer/client/client.go index 94d0b0a17..402498c70 100644 --- a/internal/pkg/services/load-balancer/client/client.go +++ b/internal/pkg/services/load-balancer/client/client.go @@ -5,29 +5,27 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) -func ConfigureClient(p *print.Printer) (*loadbalancer.APIClient, error) { - var err error - var apiClient *loadbalancer.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*loadbalancer.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.LoadBalancerCustomEndpointKey) if customEndpoint != "" { cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - cfgOptions = append(cfgOptions, authCfgOption) } if p.IsVerbosityDebug() { @@ -36,7 +34,7 @@ func ConfigureClient(p *print.Printer) (*loadbalancer.APIClient, error) { ) } - apiClient, err = loadbalancer.NewAPIClient(cfgOptions...) + apiClient, err := loadbalancer.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/logme/client/client.go b/internal/pkg/services/logme/client/client.go index fb3ba17a0..71a750c7f 100644 --- a/internal/pkg/services/logme/client/client.go +++ b/internal/pkg/services/logme/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/logme" ) -func ConfigureClient(p *print.Printer) (*logme.APIClient, error) { - var err error - var apiClient *logme.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*logme.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.LogMeCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*logme.APIClient, error) { ) } - apiClient, err = logme.NewAPIClient(cfgOptions...) + apiClient, err := logme.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/mariadb/client/client.go b/internal/pkg/services/mariadb/client/client.go index d21e32f03..7a7fb9f78 100644 --- a/internal/pkg/services/mariadb/client/client.go +++ b/internal/pkg/services/mariadb/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) -func ConfigureClient(p *print.Printer) (*mariadb.APIClient, error) { - var err error - var apiClient *mariadb.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*mariadb.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.MariaDBCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*mariadb.APIClient, error) { ) } - apiClient, err = mariadb.NewAPIClient(cfgOptions...) + apiClient, err := mariadb.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/mongodbflex/client/client.go b/internal/pkg/services/mongodbflex/client/client.go index 65f9ec696..b69cc40bf 100644 --- a/internal/pkg/services/mongodbflex/client/client.go +++ b/internal/pkg/services/mongodbflex/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -func ConfigureClient(p *print.Printer) (*mongodbflex.APIClient, error) { - var err error - var apiClient *mongodbflex.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*mongodbflex.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.MongoDBFlexCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*mongodbflex.APIClient, error) { ) } - apiClient, err = mongodbflex.NewAPIClient(cfgOptions...) + apiClient, err := mongodbflex.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/object-storage/client/client.go b/internal/pkg/services/object-storage/client/client.go index 13ca5c470..5eab52238 100644 --- a/internal/pkg/services/object-storage/client/client.go +++ b/internal/pkg/services/object-storage/client/client.go @@ -5,24 +5,26 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -func ConfigureClient(p *print.Printer) (*objectstorage.APIClient, error) { - var err error - var apiClient *objectstorage.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*objectstorage.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.ObjectStorageCustomEndpointKey) @@ -36,7 +38,7 @@ func ConfigureClient(p *print.Printer) (*objectstorage.APIClient, error) { ) } - apiClient, err = objectstorage.NewAPIClient(cfgOptions...) + apiClient, err := objectstorage.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/observability/client/client.go b/internal/pkg/services/observability/client/client.go index e629915d3..23698b5ff 100644 --- a/internal/pkg/services/observability/client/client.go +++ b/internal/pkg/services/observability/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" ) -func ConfigureClient(p *print.Printer) (*observability.APIClient, error) { - var err error - var apiClient *observability.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*observability.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.ObservabilityCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*observability.APIClient, error) { ) } - apiClient, err = observability.NewAPIClient(cfgOptions...) + apiClient, err := observability.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/opensearch/client/client.go b/internal/pkg/services/opensearch/client/client.go index ce7a8f188..b1948a389 100644 --- a/internal/pkg/services/opensearch/client/client.go +++ b/internal/pkg/services/opensearch/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -func ConfigureClient(p *print.Printer) (*opensearch.APIClient, error) { - var err error - var apiClient *opensearch.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*opensearch.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.OpenSearchCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*opensearch.APIClient, error) { ) } - apiClient, err = opensearch.NewAPIClient(cfgOptions...) + apiClient, err := opensearch.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/postgresflex/client/client.go b/internal/pkg/services/postgresflex/client/client.go index d40584a4f..ad125cd0c 100644 --- a/internal/pkg/services/postgresflex/client/client.go +++ b/internal/pkg/services/postgresflex/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) -func ConfigureClient(p *print.Printer) (*postgresflex.APIClient, error) { - var err error - var apiClient *postgresflex.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*postgresflex.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.PostgresFlexCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*postgresflex.APIClient, error) { ) } - apiClient, err = postgresflex.NewAPIClient(cfgOptions...) + apiClient, err := postgresflex.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/rabbitmq/client/client.go b/internal/pkg/services/rabbitmq/client/client.go index a4a7778ac..90c4df9fa 100644 --- a/internal/pkg/services/rabbitmq/client/client.go +++ b/internal/pkg/services/rabbitmq/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -func ConfigureClient(p *print.Printer) (*rabbitmq.APIClient, error) { - var err error - var apiClient *rabbitmq.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*rabbitmq.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.RabbitMQCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*rabbitmq.APIClient, error) { ) } - apiClient, err = rabbitmq.NewAPIClient(cfgOptions...) + apiClient, err := rabbitmq.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/redis/client/client.go b/internal/pkg/services/redis/client/client.go index 039da32f7..1966b0ad2 100644 --- a/internal/pkg/services/redis/client/client.go +++ b/internal/pkg/services/redis/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) -func ConfigureClient(p *print.Printer) (*redis.APIClient, error) { - var err error - var apiClient *redis.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*redis.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.RedisCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*redis.APIClient, error) { ) } - apiClient, err = redis.NewAPIClient(cfgOptions...) + apiClient, err := redis.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/resourcemanager/client/client.go b/internal/pkg/services/resourcemanager/client/client.go index ce1ae5620..5cca3a34b 100644 --- a/internal/pkg/services/resourcemanager/client/client.go +++ b/internal/pkg/services/resourcemanager/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) -func ConfigureClient(p *print.Printer) (*resourcemanager.APIClient, error) { - var err error - var apiClient *resourcemanager.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*resourcemanager.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.ResourceManagerEndpointKey) @@ -35,7 +35,7 @@ func ConfigureClient(p *print.Printer) (*resourcemanager.APIClient, error) { ) } - apiClient, err = resourcemanager.NewAPIClient(cfgOptions...) + apiClient, err := resourcemanager.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/runcommand/client/client.go b/internal/pkg/services/runcommand/client/client.go index 254978f4d..86f6d3d5d 100644 --- a/internal/pkg/services/runcommand/client/client.go +++ b/internal/pkg/services/runcommand/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) -func ConfigureClient(p *print.Printer) (*runcommand.APIClient, error) { - var err error - var apiClient *runcommand.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*runcommand.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.RunCommandCustomEndpointKey) if customEndpoint != "" { @@ -36,7 +36,7 @@ func ConfigureClient(p *print.Printer) (*runcommand.APIClient, error) { ) } - apiClient, err = runcommand.NewAPIClient(cfgOptions...) + apiClient, err := runcommand.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/secrets-manager/client/client.go b/internal/pkg/services/secrets-manager/client/client.go index ad1d8136f..3ef6e1402 100644 --- a/internal/pkg/services/secrets-manager/client/client.go +++ b/internal/pkg/services/secrets-manager/client/client.go @@ -5,24 +5,25 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) -func ConfigureClient(p *print.Printer) (*secretsmanager.APIClient, error) { - var err error - var apiClient *secretsmanager.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*secretsmanager.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + sdkConfig.WithRegion(region), + authCfgOption, + } customEndpoint := viper.GetString(config.SecretsManagerCustomEndpointKey) @@ -36,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*secretsmanager.APIClient, error) { ) } - apiClient, err = secretsmanager.NewAPIClient(cfgOptions...) + apiClient, err := secretsmanager.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/serverbackup/client/client.go b/internal/pkg/services/serverbackup/client/client.go index 589166e13..1184ce684 100644 --- a/internal/pkg/services/serverbackup/client/client.go +++ b/internal/pkg/services/serverbackup/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) -func ConfigureClient(p *print.Printer) (*serverbackup.APIClient, error) { - var err error - var apiClient *serverbackup.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*serverbackup.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.ServerBackupCustomEndpointKey) if customEndpoint != "" { @@ -37,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*serverbackup.APIClient, error) { ) } - apiClient, err = serverbackup.NewAPIClient(cfgOptions...) + apiClient, err := serverbackup.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/serverosupdate/client/client.go b/internal/pkg/services/serverosupdate/client/client.go index 1f1f2033e..ec39a5477 100644 --- a/internal/pkg/services/serverosupdate/client/client.go +++ b/internal/pkg/services/serverosupdate/client/client.go @@ -5,22 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) -func ConfigureClient(p *print.Printer) (*serverupdate.APIClient, error) { - var apiClient *serverupdate.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*serverupdate.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.ServerOsUpdateCustomEndpointKey) if customEndpoint != "" { @@ -35,7 +36,7 @@ func ConfigureClient(p *print.Printer) (*serverupdate.APIClient, error) { ) } - apiClient, err = serverupdate.NewAPIClient(cfgOptions...) + apiClient, err := serverupdate.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/service-account/client/client.go b/internal/pkg/services/service-account/client/client.go index b4ba6919d..cb35d2c4d 100644 --- a/internal/pkg/services/service-account/client/client.go +++ b/internal/pkg/services/service-account/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) -func ConfigureClient(p *print.Printer) (*serviceaccount.APIClient, error) { - var err error - var apiClient *serviceaccount.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*serviceaccount.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.ServiceAccountCustomEndpointKey) @@ -35,7 +35,7 @@ func ConfigureClient(p *print.Printer) (*serviceaccount.APIClient, error) { ) } - apiClient, err = serviceaccount.NewAPIClient(cfgOptions...) + apiClient, err := serviceaccount.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/service-enablement/client/client.go b/internal/pkg/services/service-enablement/client/client.go index 8fad8c06b..66b952376 100644 --- a/internal/pkg/services/service-enablement/client/client.go +++ b/internal/pkg/services/service-enablement/client/client.go @@ -6,22 +6,22 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" ) -func ConfigureClient(p *print.Printer) (*serviceenablement.APIClient, error) { - var err error - var apiClient *serviceenablement.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*serviceenablement.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.ServiceEnablementCustomEndpointKey) if customEndpoint != "" { @@ -37,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*serviceenablement.APIClient, error) { ) } - apiClient, err = serviceenablement.NewAPIClient(cfgOptions...) + apiClient, err := serviceenablement.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/ske/client/client.go b/internal/pkg/services/ske/client/client.go index 788fcb4c3..a361f73d2 100644 --- a/internal/pkg/services/ske/client/client.go +++ b/internal/pkg/services/ske/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/ske" ) -func ConfigureClient(p *print.Printer) (*ske.APIClient, error) { - var err error - var apiClient *ske.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*ske.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.SKECustomEndpointKey) if customEndpoint != "" { @@ -37,7 +37,7 @@ func ConfigureClient(p *print.Printer) (*ske.APIClient, error) { ) } - apiClient, err = ske.NewAPIClient(cfgOptions...) + apiClient, err := ske.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/services/sqlserverflex/client/client.go b/internal/pkg/services/sqlserverflex/client/client.go index 2767ae937..30e937f59 100644 --- a/internal/pkg/services/sqlserverflex/client/client.go +++ b/internal/pkg/services/sqlserverflex/client/client.go @@ -5,23 +5,23 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) -func ConfigureClient(p *print.Printer) (*sqlserverflex.APIClient, error) { - var err error - var apiClient *sqlserverflex.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - +func ConfigureClient(p *print.Printer, cliVersion string) (*sqlserverflex.APIClient, error) { authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) if err != nil { p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - cfgOptions = append(cfgOptions, authCfgOption) + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } customEndpoint := viper.GetString(config.SQLServerFlexCustomEndpointKey) @@ -35,7 +35,7 @@ func ConfigureClient(p *print.Printer) (*sqlserverflex.APIClient, error) { ) } - apiClient, err = sqlserverflex.NewAPIClient(cfgOptions...) + apiClient, err := sqlserverflex.NewAPIClient(cfgOptions...) if err != nil { p.Debug(print.ErrorLevel, "create new API client: %v", err) return nil, &errors.AuthError{} diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index 5649155cd..7aff6e713 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -12,6 +12,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" ) // Ptr Returns the pointer to any type T @@ -124,3 +125,7 @@ func Base64Encode(message []byte) string { base64.StdEncoding.Encode(b, message) return string(b) } + +func UserAgentConfigOption(cliVersion string) sdkConfig.ConfigurationOption { + return sdkConfig.WithUserAgent(fmt.Sprintf("stackit-cli/%s", cliVersion)) +} diff --git a/internal/pkg/utils/utils_test.go b/internal/pkg/utils/utils_test.go index 6ef165d9b..894f4f2e2 100644 --- a/internal/pkg/utils/utils_test.go +++ b/internal/pkg/utils/utils_test.go @@ -1,8 +1,11 @@ package utils import ( + "reflect" "testing" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) @@ -108,3 +111,41 @@ func TestValidateURLDomain(t *testing.T) { }) } } + +func TestUserAgentConfigOption(t *testing.T) { + type args struct { + providerVersion string + } + tests := []struct { + name string + args args + want sdkConfig.ConfigurationOption + }{ + { + name: "TestUserAgentConfigOption", + args: args{ + providerVersion: "1.0.0", + }, + want: sdkConfig.WithUserAgent("stackit-cli/1.0.0"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + clientConfigActual := sdkConfig.Configuration{} + err := tt.want(&clientConfigActual) + if err != nil { + t.Errorf("error configuring client: %v", err) + } + + clientConfigExpected := sdkConfig.Configuration{} + err = UserAgentConfigOption(tt.args.providerVersion)(&clientConfigExpected) + if err != nil { + t.Errorf("error configuring client: %v", err) + } + + if !reflect.DeepEqual(clientConfigActual, clientConfigExpected) { + t.Errorf("UserAgentConfigOption() = %v, want %v", clientConfigActual, clientConfigExpected) + } + }) + } +} From 1bb3c3379e956a76e7b167044107301263b8e227 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 13 May 2025 11:39:11 +0200 Subject: [PATCH 005/422] chore(deps): update renovatebot/github-action action to v42.0.2 (#743) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 952f88e2f..92e3fbd8c 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v42.0.1 + uses: renovatebot/github-action@v42.0.2 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 09684be711d6e62513fdc50647b59742a5ec3b0f Mon Sep 17 00:00:00 2001 From: Pere Manent Date: Tue, 13 May 2025 13:10:45 +0200 Subject: [PATCH 006/422] Add stackit git commands: list, describe, create and delete. (#725) * Add stackit git commands: list, describe, create and delete. * Add stackit git list instances command * Add stackit git list instances command * Git. Move list package and add describe command * Stackit Git create instance command * Add delete command to the stackit git cli * Stop using new variables for the globalflags.ProjectIdFlag and Docs generation * Stop using new variables for the globalflags.ProjectIdFlag and minor issues * Add docs of the stackit git instance command * Stackit git: add vertical table on describe and limit list command * Delete toolchain opetion from go.mod file * Get go.mod and go.sum from main --- docs/stackit.md | 1 + docs/stackit_git.md | 37 +++ docs/stackit_git_create.md | 41 +++ docs/stackit_git_delete.md | 40 +++ docs/stackit_git_describe.md | 40 +++ docs/stackit_git_list.md | 44 +++ go.mod | 1 + go.sum | 2 + internal/cmd/git/create/create.go | 167 ++++++++++++ internal/cmd/git/create/create_test.go | 257 ++++++++++++++++++ internal/cmd/git/delete/delete.go | 132 +++++++++ internal/cmd/git/delete/delete_test.go | 182 +++++++++++++ internal/cmd/git/describe/describe.go | 152 +++++++++++ internal/cmd/git/describe/describe_test.go | 226 +++++++++++++++ internal/cmd/git/git.go | 34 +++ internal/cmd/git/list/list.go | 163 +++++++++++ internal/cmd/git/list/list_test.go | 237 ++++++++++++++++ internal/cmd/root.go | 2 + internal/pkg/config/config.go | 3 + internal/pkg/services/git/client/client.go | 45 +++ internal/pkg/services/git/utils/utils.go | 23 ++ internal/pkg/services/git/utils/utils_test.go | 66 +++++ 22 files changed, 1895 insertions(+) create mode 100644 docs/stackit_git.md create mode 100644 docs/stackit_git_create.md create mode 100644 docs/stackit_git_delete.md create mode 100644 docs/stackit_git_describe.md create mode 100644 docs/stackit_git_list.md create mode 100644 internal/cmd/git/create/create.go create mode 100644 internal/cmd/git/create/create_test.go create mode 100644 internal/cmd/git/delete/delete.go create mode 100644 internal/cmd/git/delete/delete_test.go create mode 100644 internal/cmd/git/describe/describe.go create mode 100644 internal/cmd/git/describe/describe_test.go create mode 100644 internal/cmd/git/git.go create mode 100644 internal/cmd/git/list/list.go create mode 100644 internal/cmd/git/list/list_test.go create mode 100644 internal/pkg/services/git/client/client.go create mode 100644 internal/pkg/services/git/utils/utils.go create mode 100644 internal/pkg/services/git/utils/utils_test.go diff --git a/docs/stackit.md b/docs/stackit.md index 2dc456b83..3cc35f2f9 100644 --- a/docs/stackit.md +++ b/docs/stackit.md @@ -33,6 +33,7 @@ stackit [flags] * [stackit config](./stackit_config.md) - Provides functionality for CLI configuration options * [stackit curl](./stackit_curl.md) - Executes an authenticated HTTP request to an endpoint * [stackit dns](./stackit_dns.md) - Provides functionality for DNS +* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git * [stackit image](./stackit_image.md) - Manage server images * [stackit key-pair](./stackit_key-pair.md) - Provides functionality for SSH key pairs * [stackit load-balancer](./stackit_load-balancer.md) - Provides functionality for Load Balancer diff --git a/docs/stackit_git.md b/docs/stackit_git.md new file mode 100644 index 000000000..8a959c7d2 --- /dev/null +++ b/docs/stackit_git.md @@ -0,0 +1,37 @@ +## stackit git + +Provides functionality for STACKIT Git + +### Synopsis + +Provides functionality for STACKIT Git. + +``` +stackit git [flags] +``` + +### Options + +``` + -h, --help Help for "stackit git" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit git create](./stackit_git_create.md) - Creates STACKIT Git instance +* [stackit git delete](./stackit_git_delete.md) - Deletes STACKIT Git instance +* [stackit git describe](./stackit_git_describe.md) - Describes STACKIT Git instance +* [stackit git list](./stackit_git_list.md) - Lists all instances of STACKIT Git. + diff --git a/docs/stackit_git_create.md b/docs/stackit_git_create.md new file mode 100644 index 000000000..fa7a2a97d --- /dev/null +++ b/docs/stackit_git_create.md @@ -0,0 +1,41 @@ +## stackit git create + +Creates STACKIT Git instance + +### Synopsis + +Create a STACKIT Git instance by name. + +``` +stackit git create [flags] +``` + +### Examples + +``` + Create a instance with name 'my-new-instance' + $ stackit git create --name my-new-instance +``` + +### Options + +``` + -h, --help Help for "stackit git create" + --name string The name of the instance. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git + diff --git a/docs/stackit_git_delete.md b/docs/stackit_git_delete.md new file mode 100644 index 000000000..6f863ee60 --- /dev/null +++ b/docs/stackit_git_delete.md @@ -0,0 +1,40 @@ +## stackit git delete + +Deletes STACKIT Git instance + +### Synopsis + +Deletes a STACKIT Git instance by its internal ID. + +``` +stackit git delete INSTANCE_ID [flags] +``` + +### Examples + +``` + Delete a instance with ID "xxx" + $ stackit git delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit git delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git + diff --git a/docs/stackit_git_describe.md b/docs/stackit_git_describe.md new file mode 100644 index 000000000..e2aedcc40 --- /dev/null +++ b/docs/stackit_git_describe.md @@ -0,0 +1,40 @@ +## stackit git describe + +Describes STACKIT Git instance + +### Synopsis + +Describes a STACKIT Git instance by its internal ID. + +``` +stackit git describe INSTANCE_ID [flags] +``` + +### Examples + +``` + Describe instance "xxx" + $ stackit git describe xxx +``` + +### Options + +``` + -h, --help Help for "stackit git describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git + diff --git a/docs/stackit_git_list.md b/docs/stackit_git_list.md new file mode 100644 index 000000000..c0f65927b --- /dev/null +++ b/docs/stackit_git_list.md @@ -0,0 +1,44 @@ +## stackit git list + +Lists all instances of STACKIT Git. + +### Synopsis + +Lists all instances of STACKIT Git for the current project. + +``` +stackit git list [flags] +``` + +### Examples + +``` + List all STACKIT Git instances + $ stackit git instance list + + Lists up to 10 STACKIT Git instances + $ stackit git instance list --limit=10 +``` + +### Options + +``` + -h, --help Help for "stackit git list" + --limit int Limit the output to the first n elements +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git + diff --git a/go.mod b/go.mod index d4fa80e97..5e4de09de 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 + github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 diff --git a/go.sum b/go.sum index 8735251de..d16afaad1 100644 --- a/go.sum +++ b/go.sum @@ -570,6 +570,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 h1:aXVMNdiH github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 h1:WJnA6YTOlBxMJf9PRuxkXduxj+fyWi+wOks69PvN1qI= github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= +github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 h1:/NXxiJf/NFpj+DFXc07vsx+0he/xufdhIskXUlSeyyw= +github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 h1:zh6e2eHgqex++fr6N0RK7wMMBGesC3QhBd42FdTq2Z8= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 h1:StQg5p4h1aLFwIHQWWe5l44aFue+ZvQMGDbypP1DMYw= diff --git a/internal/cmd/git/create/create.go b/internal/cmd/git/create/create.go new file mode 100644 index 000000000..6df750b37 --- /dev/null +++ b/internal/cmd/git/create/create.go @@ -0,0 +1,167 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-sdk-go/services/git/wait" +) + +const ( + nameFlag = "name" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Id *string + Name string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates STACKIT Git instance", + Long: "Create a STACKIT Git instance by name.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a instance with name 'my-new-instance'`, + `$ stackit git create --name my-new-instance`, + ), + ), + RunE: func(cmd *cobra.Command, _ []string) (err error) { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer) + if err != nil { + return err + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create the instance %q?", model.Name) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + request := buildRequest(ctx, model, apiClient) + + result, err := request.Execute() + if err != nil { + return fmt.Errorf("create stackit git instance: %w", err) + } + model.Id = result.Id + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating stackit git instance") + _, err = wait.CreateGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, *model.Id).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for stackit git Instance creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model, result) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(nameFlag, "", "The name of the instance.") + if err := flags.MarkFlagsRequired(cmd, nameFlag); err != nil { + cobra.CheckErr(err) + } +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + name := flags.FlagToStringValue(p, cmd, nameFlag) + + model := inputModel{ + GlobalFlagModel: globalFlags, + Name: name, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClient) git.ApiCreateInstanceRequest { + return apiClient.CreateInstance(ctx, model.ProjectId).CreateInstancePayload(createPayload(model)) +} + +func createPayload(model *inputModel) git.CreateInstancePayload { + return git.CreateInstancePayload{ + Name: &model.Name, + } +} + +func outputResult(p *print.Printer, model *inputModel, resp *git.Instance) error { + if model == nil { + return fmt.Errorf("input model is nil") + } + var outputFormat string + if model.GlobalFlagModel != nil { + outputFormat = model.OutputFormat + } + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal instance: %w", err) + } + p.Outputln(string(details)) + + return nil + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal iminstanceage: %w", err) + } + p.Outputln(string(details)) + + return nil + default: + p.Outputf("Created instance %q with id %s\n", model.Name, utils.PtrString(model.Id)) + return nil + } +} diff --git a/internal/cmd/git/create/create_test.go b/internal/cmd/git/create/create_test.go new file mode 100644 index 000000000..33ed0cc7e --- /dev/null +++ b/internal/cmd/git/create/create_test.go @@ -0,0 +1,257 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &git.APIClient{} + testProjectId = uuid.NewString() + + testName = "test-instance" +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + + nameFlag: testName, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + Name: testName, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureCreatePayload(mods ...func(payload *git.CreateInstancePayload)) (payload git.CreateInstancePayload) { + payload = git.CreateInstancePayload{ + Name: &testName, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func fixtureRequest(mods ...func(request *git.ApiCreateInstanceRequest)) git.ApiCreateInstanceRequest { + request := testClient.CreateInstance(testCtx, testProjectId) + + request = request.CreateInstancePayload(fixtureCreatePayload()) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "name missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + if err := globalflags.Configure(cmd.Flags()); err != nil { + t.Errorf("cannot configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if err := cmd.ValidateFlagGroups(); err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flag groups: %v", err) + } + + if err := cmd.ValidateRequiredFlags(); err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest git.ApiCreateInstanceRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "name flag", + model: fixtureInputModel(func(model *inputModel) { + model.Name = "new-name" + }), + expectedRequest: fixtureRequest(func(request *git.ApiCreateInstanceRequest) { + *request = request.CreateInstancePayload(fixtureCreatePayload(func(payload *git.CreateInstancePayload) { + payload.Name = utils.Ptr("new-name") + })) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(git.NullableString{}), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + resp *git.Instance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "nil", + args: args{ + model: nil, + resp: nil, + }, + wantErr: true, + }, + { + name: "empty input", + args: args{ + model: &inputModel{}, + resp: &git.Instance{}, + }, + wantErr: false, + }, + { + name: "output json", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + OutputFormat: print.JSONOutputFormat, + }, + }, + resp: nil, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/git/delete/delete.go b/internal/cmd/git/delete/delete.go new file mode 100644 index 000000000..67ae11438 --- /dev/null +++ b/internal/cmd/git/delete/delete.go @@ -0,0 +1,132 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" + gitUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-sdk-go/services/git/wait" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string +} + +const instanceIdArg = "INSTANCE_ID" + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", instanceIdArg), + Short: "Deletes STACKIT Git instance", + Long: "Deletes a STACKIT Git instance by its internal ID.", + Args: args.SingleArg(instanceIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample(`Delete a instance with ID "xxx"`, `$ stackit git delete xxx`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer) + if err != nil { + return err + } + + projectName, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectName = model.ProjectId + } + + instanceName, err := gitUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get stackit git intance name: %v", err) + instanceName = model.InstanceId + } else if instanceName == "" { + instanceName = model.InstanceId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete the stackit git instance %q for %q?", instanceName, projectName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + request := buildRequest(ctx, model, apiClient) + + err = request.Execute() + if err != nil { + return fmt.Errorf("delete instance: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Deleting stackit git instance") + _, err = wait.DeleteGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for stackit git instance deletion: %w", err) + } + s.Stop() + } + + operationState := "Deleted" + if model.Async { + operationState = "Triggered deletion of" + } + params.Printer.Info("%s stackit git instance %s \n", operationState, model.InstanceId) + + return nil + }, + } + + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceId: cliArgs[0], + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClient) git.ApiDeleteInstanceRequest { + return apiClient.DeleteInstance(ctx, model.ProjectId, model.InstanceId) +} diff --git a/internal/cmd/git/delete/delete_test.go b/internal/cmd/git/delete/delete_test.go new file mode 100644 index 000000000..8c90a4f1d --- /dev/null +++ b/internal/cmd/git/delete/delete_test.go @@ -0,0 +1,182 @@ +package delete + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &git.APIClient{} + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + InstanceId: testInstanceId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *git.ApiDeleteInstanceRequest)) git.ApiDeleteInstanceRequest { + request := testClient.DeleteInstance(testCtx, testProjectId, testInstanceId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + args []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + args: []string{testInstanceId}, + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "no arguments", + flagValues: fixtureFlagValues(), + args: nil, + isValid: false, + }, + { + description: "multiple arguments", + flagValues: fixtureFlagValues(), + args: []string{"foo", "bar"}, + isValid: false, + }, + { + description: "invalid instance id", + flagValues: fixtureFlagValues(), + args: []string{"foo"}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + cmd.SetArgs(tt.args) + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if err := cmd.ValidateArgs(tt.args); err != nil { + if !tt.isValid { + return + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.args) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest git.ApiDeleteInstanceRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/git/describe/describe.go b/internal/cmd/git/describe/describe.go new file mode 100644 index 000000000..8e2f266e1 --- /dev/null +++ b/internal/cmd/git/describe/describe.go @@ -0,0 +1,152 @@ +package describe + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string +} + +const instanceIdArg = "INSTANCE_ID" + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", instanceIdArg), + Short: "Describes STACKIT Git instance", + Long: "Describes a STACKIT Git instance by its internal ID.", + Args: args.SingleArg(instanceIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample(`Describe instance "xxx"`, `$ stackit git describe xxx`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer) + if err != nil { + return err + } + + // Call API + request := buildRequest(ctx, model, apiClient) + + instance, err := request.Execute() + if err != nil { + return fmt.Errorf("get instance: %w", err) + } + + if err := outputResult(params.Printer, model.OutputFormat, instance); err != nil { + return err + } + + return nil + }, + } + + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceId: cliArgs[0], + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClient) git.ApiGetInstanceRequest { + return apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId) +} + +func outputResult(p *print.Printer, outputFormat string, resp *git.Instance) error { + if resp == nil { + return fmt.Errorf("instance not found") + } + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal instance: %w", err) + } + p.Outputln(string(details)) + + return nil + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal instance: %w", err) + } + p.Outputln(string(details)) + + return nil + default: + table := tables.NewTable() + if id := resp.Id; id != nil { + table.AddRow("ID", *id) + table.AddSeparator() + } + if name := resp.Name; name != nil { + table.AddRow("NAME", *name) + table.AddSeparator() + } + if url := resp.Url; url != nil { + table.AddRow("URL", *url) + table.AddSeparator() + } + if version := resp.Version; version != nil { + table.AddRow("VERSION", *version) + table.AddSeparator() + } + if state := resp.State; state != nil { + table.AddRow("STATE", *state) + table.AddSeparator() + } + if created := resp.Created; created != nil { + table.AddRow("CREATED", *created) + table.AddSeparator() + } + + if err := table.Display(p); err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + } +} diff --git a/internal/cmd/git/describe/describe_test.go b/internal/cmd/git/describe/describe_test.go new file mode 100644 index 000000000..17cd8dae8 --- /dev/null +++ b/internal/cmd/git/describe/describe_test.go @@ -0,0 +1,226 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &git.APIClient{} + testProjectId = uuid.NewString() + testInstanceId = []string{uuid.NewString()} +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + InstanceId: testInstanceId[0], + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *git.ApiGetInstanceRequest)) git.ApiGetInstanceRequest { + request := testClient.GetInstance(testCtx, testProjectId, testInstanceId[0]) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + args []string + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + args: testInstanceId, + isValid: true, + }, + { + description: "no values", + flagValues: map[string]string{}, + args: testInstanceId, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + args: testInstanceId, + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + args: testInstanceId, + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + args: testInstanceId, + isValid: false, + }, + { + description: "no instance id passed", + flagValues: fixtureFlagValues(), + args: nil, + isValid: false, + }, + { + description: "multiple instance ids passed", + flagValues: fixtureFlagValues(), + args: []string{uuid.NewString(), uuid.NewString()}, + isValid: false, + }, + { + description: "invalid instance id passed", + flagValues: fixtureFlagValues(), + args: []string{"foobar"}, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + if err := globalflags.Configure(cmd.Flags()); err != nil { + t.Errorf("cannot configure global flags: %v", err) + } + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if err := cmd.ValidateRequiredFlags(); err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + if err := cmd.ValidateArgs(tt.args); err != nil { + if !tt.isValid { + return + } + } + + model, err := parseInput(p, cmd, tt.args) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest git.ApiGetInstanceRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resp *git.Instance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{ + resp: &git.Instance{}, + }, + wantErr: false, + }, + { + name: "nil", + args: args{}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/git/git.go b/internal/cmd/git/git.go new file mode 100644 index 000000000..fcacb4fcd --- /dev/null +++ b/internal/cmd/git/git.go @@ -0,0 +1,34 @@ +package git + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/git/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "git", + Short: "Provides functionality for STACKIT Git", + Long: "Provides functionality for STACKIT Git.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand( + list.NewCmd(params), + describe.NewCmd(params), + create.NewCmd(params), + delete.NewCmd(params), + ) +} diff --git a/internal/cmd/git/list/list.go b/internal/cmd/git/list/list.go new file mode 100644 index 000000000..0057342ff --- /dev/null +++ b/internal/cmd/git/list/list.go @@ -0,0 +1,163 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +const limitFlag = "limit" + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all instances of STACKIT Git.", + Long: "Lists all instances of STACKIT Git for the current project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all STACKIT Git instances`, + "$ stackit git instance list"), + examples.NewExample( + "Lists up to 10 STACKIT Git instances", + "$ stackit git instance list --limit=10", + ), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get STACKIT Git instances: %w", err) + } + instances := *resp.Instances + if len(instances) == 0 { + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + params.Printer.Info("No instances found for project %q\n", projectLabel) + return nil + } else if model.Limit != nil && len(instances) > int(*model.Limit) { + instances = (instances)[:*model.Limit] + } + return outputResult(params.Printer, model.OutputFormat, instances) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClient) git.ApiListInstancesRequest { + return apiClient.ListInstances(ctx, model.ProjectId) +} + +func outputResult(p *print.Printer, outputFormat string, instances []git.Instance) error { + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(instances, "", " ") + if err != nil { + return fmt.Errorf("marshal Observability instance list: %w", err) + } + p.Outputln(string(details)) + + return nil + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal Observability instance list: %w", err) + } + p.Outputln(string(details)) + + return nil + default: + table := tables.NewTable() + table.SetHeader("ID", "NAME", "URL", "VERSION", "STATE", "CREATED") + for i := range instances { + instance := (instances)[i] + table.AddRow( + utils.PtrString(instance.Id), + utils.PtrString(instance.Name), + utils.PtrString(instance.Url), + utils.PtrString(instance.Version), + utils.PtrString(instance.State), + utils.PtrString(instance.Created), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + } +} diff --git a/internal/cmd/git/list/list_test.go b/internal/cmd/git/list/list_test.go new file mode 100644 index 000000000..f73297388 --- /dev/null +++ b/internal/cmd/git/list/list_test.go @@ -0,0 +1,237 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &git.APIClient{} +var testProjectId = uuid.NewString() + +const ( + testLimit = 10 +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *git.ApiListInstancesRequest)) git.ApiListInstancesRequest { + request := testClient.ListInstances(testCtx, testProjectId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "with limit flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["limit"] = strconv.Itoa(testLimit) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(testLimit)) + }), + }, + { + description: "with limit flag == 0", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["limit"] = strconv.Itoa(0) + }), + isValid: false, + }, + { + description: "with limit flag < 0", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["limit"] = strconv.Itoa(-1) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest git.ApiListInstancesRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instances []git.Instance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty instances slice", + args: args{ + instances: []git.Instance{}, + }, + wantErr: false, + }, + { + name: "set empty instances in instances slice", + args: args{ + instances: []git.Instance{{}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 6da6491d6..750bdfa9a 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -14,6 +14,7 @@ import ( configCmd "github.com/stackitcloud/stackit-cli/internal/cmd/config" "github.com/stackitcloud/stackit-cli/internal/cmd/curl" "github.com/stackitcloud/stackit-cli/internal/cmd/dns" + "github.com/stackitcloud/stackit-cli/internal/cmd/git" "github.com/stackitcloud/stackit-cli/internal/cmd/image" keypair "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair" loadbalancer "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer" @@ -191,6 +192,7 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(image.NewCmd(params)) cmd.AddCommand(quota.NewCmd(params)) cmd.AddCommand(affinityGroups.NewCmd(params)) + cmd.AddCommand(git.NewCmd(params)) } // traverseCommands calls f for c and all of its children. diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index da282c335..957d7c475 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -45,6 +45,7 @@ const ( SQLServerFlexCustomEndpointKey = "sqlserverflex_custom_endpoint" IaaSCustomEndpointKey = "iaas_custom_endpoint" TokenCustomEndpointKey = "token_custom_endpoint" + GitCustomEndpointKey = "git_custom_endpoint" ProjectNameKey = "project_name" DefaultProfileName = "default" @@ -103,6 +104,7 @@ var ConfigKeys = []string{ SQLServerFlexCustomEndpointKey, IaaSCustomEndpointKey, TokenCustomEndpointKey, + GitCustomEndpointKey, } var defaultConfigFolderPath string @@ -187,6 +189,7 @@ func setConfigDefaults() { viper.SetDefault(SQLServerFlexCustomEndpointKey, "") viper.SetDefault(IaaSCustomEndpointKey, "") viper.SetDefault(TokenCustomEndpointKey, "") + viper.SetDefault(GitCustomEndpointKey, "") } func getConfigFilePath(configFolder string) string { diff --git a/internal/pkg/services/git/client/client.go b/internal/pkg/services/git/client/client.go new file mode 100644 index 000000000..dde3b7be6 --- /dev/null +++ b/internal/pkg/services/git/client/client.go @@ -0,0 +1,45 @@ +package client + +import ( + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/spf13/viper" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +func ConfigureClient(p *print.Printer) (*git.APIClient, error) { + var err error + var apiClient *git.APIClient + var cfgOptions []sdkConfig.ConfigurationOption + + authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) + if err != nil { + p.Debug(print.ErrorLevel, "configure authentication: %v", err) + return nil, &errors.AuthError{} + } + cfgOptions = append(cfgOptions, authCfgOption) + + customEndpoint := viper.GetString(config.GitCustomEndpointKey) + + if customEndpoint != "" { + cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) + } + + if p.IsVerbosityDebug() { + cfgOptions = append(cfgOptions, + sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), + ) + } + + apiClient, err = git.NewAPIClient(cfgOptions...) + if err != nil { + p.Debug(print.ErrorLevel, "create new API client: %v", err) + return nil, &errors.AuthError{} + } + + return apiClient, nil +} diff --git a/internal/pkg/services/git/utils/utils.go b/internal/pkg/services/git/utils/utils.go new file mode 100644 index 000000000..3a875c920 --- /dev/null +++ b/internal/pkg/services/git/utils/utils.go @@ -0,0 +1,23 @@ +package utils + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type GitClient interface { + GetInstanceExecute(ctx context.Context, projectId string, instanceId string) (*git.Instance, error) +} + +func GetInstanceName(ctx context.Context, apiClient GitClient, projectId, instanceId string) (string, error) { + resp, err := apiClient.GetInstanceExecute(ctx, projectId, instanceId) + if err != nil { + return "", fmt.Errorf("get instance: %w", err) + } + if resp.Name == nil { + return "", nil + } + return *resp.Name, nil +} diff --git a/internal/pkg/services/git/utils/utils_test.go b/internal/pkg/services/git/utils/utils_test.go new file mode 100644 index 000000000..7ec5dc494 --- /dev/null +++ b/internal/pkg/services/git/utils/utils_test.go @@ -0,0 +1,66 @@ +package utils + +import ( + "context" + "fmt" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type GitClientMocked struct { + GetInstanceFails bool + GetInstanceResp *git.Instance +} + +func (m *GitClientMocked) GetInstanceExecute(_ context.Context, _, _ string) (*git.Instance, error) { + if m.GetInstanceFails { + return nil, fmt.Errorf("could not get instance") + } + return m.GetInstanceResp, nil +} + +func TestGetinstanceName(t *testing.T) { + tests := []struct { + name string + instanceResp *git.Instance + instanceErr bool + want string + wantErr bool + }{ + { + name: "successful retrieval", + instanceResp: &git.Instance{Name: utils.Ptr("test-instance")}, + want: "test-instance", + wantErr: false, + }, + { + name: "error on retrieval", + instanceErr: true, + wantErr: true, + }, + { + name: "nil name", + instanceErr: false, + instanceResp: &git.Instance{}, + want: "", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + client := &GitClientMocked{ + GetInstanceFails: tt.instanceErr, + GetInstanceResp: tt.instanceResp, + } + got, err := GetInstanceName(context.Background(), client, "", "") + if (err != nil) != tt.wantErr { + t.Errorf("GetInstanceName() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("GetInstanceName() = %v, want %v", got, tt.want) + } + }) + } +} From aacb3cba5b097ba48c948f1d90eedef03949c532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Tue, 13 May 2025 13:50:59 +0200 Subject: [PATCH 007/422] fix panic in auth.TokenExpired (#736) --- internal/pkg/auth/user_token_flow.go | 2 ++ internal/pkg/auth/user_token_flow_test.go | 37 +++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/internal/pkg/auth/user_token_flow.go b/internal/pkg/auth/user_token_flow.go index 8a49c6b45..215db2fa3 100644 --- a/internal/pkg/auth/user_token_flow.go +++ b/internal/pkg/auth/user_token_flow.go @@ -118,6 +118,8 @@ func TokenExpired(token string) (bool, error) { expirationTimestampNumeric, err := tokenParsed.Claims.GetExpirationTime() if err != nil { return false, fmt.Errorf("get expiration timestamp from access token: %w", err) + } else if expirationTimestampNumeric == nil { + return false, nil } expirationTimestamp := expirationTimestampNumeric.Time now := time.Now() diff --git a/internal/pkg/auth/user_token_flow_test.go b/internal/pkg/auth/user_token_flow_test.go index 6aeac368f..cd31350ad 100644 --- a/internal/pkg/auth/user_token_flow_test.go +++ b/internal/pkg/auth/user_token_flow_test.go @@ -381,3 +381,40 @@ func createTokens(accessTokenExpiresAt, refreshTokenExpiresAt time.Time) (access return accessToken, refreshToken, nil } + +func TestTokenExpired(t *testing.T) { + tests := []struct { + desc string + token string + expected bool + }{ + { + desc: "token without exp", + token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c`, + expected: false, + }, + { + desc: "exp 0", + token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjB9.rIhVGrtR0B0gUYPZDnB6LZ_w7zckH_9qFZBWG4rCkRY`, + expected: true, + }, + { + desc: "exp 9007199254740991", + token: `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjIyNTc2MDkwNzExMTExMTExfQ.aStshPjoSKTIcBeESbLJWvbMVuw-XWInXcf1P7tiWaE`, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.desc, func(t *testing.T) { + actual, err := TokenExpired(tt.token) + if err != nil { + t.Fatalf("TokenExpired() error = %v", err) + } + + if actual != tt.expected { + t.Errorf("TokenExpired() = %v, want %v", actual, tt.expected) + } + }) + } +} From e42e4eae189df0bf6c809d5a075f28fa00822c3b Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Tue, 13 May 2025 17:30:34 +0200 Subject: [PATCH 008/422] fix(postgresql): Display correct error message when project id is not set (#745) Signed-off-by: Alexander Dahmen --- internal/cmd/postgresflex/options/options.go | 4 +++ .../cmd/postgresflex/options/options_test.go | 35 ++++++++++++------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index 66535e387..8a3bd6287 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -10,6 +10,7 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -99,6 +100,9 @@ func configureFlags(cmd *cobra.Command) { func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } flavors := flags.FlagToBoolValue(p, cmd, flavorsFlag) versions := flags.FlagToBoolValue(p, cmd, versionsFlag) storages := flags.FlagToBoolValue(p, cmd, storagesFlag) diff --git a/internal/cmd/postgresflex/options/options_test.go b/internal/cmd/postgresflex/options/options_test.go index 7643dad69..54df1ccf9 100644 --- a/internal/cmd/postgresflex/options/options_test.go +++ b/internal/cmd/postgresflex/options/options_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/google/go-cmp/cmp" + "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -16,6 +17,7 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testProjectId = uuid.NewString() type postgresFlexClientMocked struct { listFlavorsFails bool @@ -63,10 +65,11 @@ func (c *postgresFlexClientMocked) ListStoragesExecute(_ context.Context, _, _, func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - flavorsFlag: "true", - versionsFlag: "true", - storagesFlag: "true", - flavorIdFlag: "2.4", + globalflags.ProjectIdFlag: testProjectId, + flavorsFlag: "true", + versionsFlag: "true", + storagesFlag: "true", + flavorIdFlag: "2.4", } for _, mod := range mods { mod(flagValues) @@ -76,10 +79,13 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModelAllFalse(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{Verbosity: globalflags.VerbosityDefault}, - Flavors: false, - Versions: false, - Storages: false, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + Flavors: false, + Versions: false, + Storages: false, } for _, mod := range mods { mod(model) @@ -89,11 +95,14 @@ func fixtureInputModelAllFalse(mods ...func(model *inputModel)) *inputModel { func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{Verbosity: globalflags.VerbosityDefault}, - Flavors: true, - Versions: true, - Storages: true, - FlavorId: utils.Ptr("2.4"), + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + Flavors: true, + Versions: true, + Storages: true, + FlavorId: utils.Ptr("2.4"), } for _, mod := range mods { mod(model) From 050383e0943908a520409ce05c56956dc09cb735 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 14 May 2025 09:02:42 +0200 Subject: [PATCH 009/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/ske to v0.22.4 (#746) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5e4de09de..01ff6a218 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.3 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.4 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.24.0 diff --git a/go.sum b/go.sum index d16afaad1..265567e0c 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3 h1:qCn6ZS/ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3 h1:rDsIPzaNJ4bnKJp9XFNzna+pXylGYVHUBPl5hqBWhX8= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.3 h1:dN6MOgb9CXaZ9hsdCIrrNGyw7EggPvE5kaTvNKvrEzI= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.3/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.4 h1:whyCGfzlLcyb23uKGJLrftjT57vqa1jS3Xz5voUHK+M= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.4/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3 h1:MF46ffu+A8eu17N7LGFG2T50PhjDw2L0f68Uu316r8U= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From 056988638e883ac56ff98da7022b22be63cce941 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 17:34:47 +0200 Subject: [PATCH 010/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#755) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mongodbflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.0.1 to 1.2.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.0.1...services/cdn/v1.2.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mongodbflex dependency-version: 1.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 01ff6a218..f647f857e 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3 diff --git a/go.sum b/go.sum index 265567e0c..20844f876 100644 --- a/go.sum +++ b/go.sum @@ -580,8 +580,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 h1:wM/Gop6sG/fkpzs github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2 h1:JoPz34UT1Gx7TV6GpOzWdNBq78co7MV12jynADI4AMc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1 h1:CBGVT+5ilIFVtz5gDnQ58zNapFCLpjOftuVeATdg1qo= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.0.1/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 h1:RFe45uLzTSmd69yaQe5zLDY3+1hYi6/lSZUVcjbb6+c= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 h1:anITBRTlQoneEawVg4hHjs4IceFJLFq9KdDU+d5y5DU= From 646f07f0cc0387a4fe5ed80ddf3ef209f9a84518 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 17:38:06 +0200 Subject: [PATCH 011/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#754) Bumps [github.com/stackitcloud/stackit-sdk-go/services/rabbitmq](https://github.com/stackitcloud/stackit-sdk-go) from 0.22.2 to 0.24.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.22.2...services/ske/v0.24.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/rabbitmq dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f647f857e..d7936bede 100644 --- a/go.mod +++ b/go.mod @@ -241,7 +241,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/go.sum b/go.sum index 20844f876..644ac8ffe 100644 --- a/go.sum +++ b/go.sum @@ -590,8 +590,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 h1:p1bub8QayR github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 h1:AIQueG1oSdKbxK8ASZZYkmqzJ7NhKzKcR5AQsndoF18= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.2 h1:++lyru25B7J8cKaEBCw9ZKgXDIJGmQvmFXR+BpAcR4g= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.22.2/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 h1:YEfhKt3T25uY7vs8QcAPfdTs1GLil0BcrLCJ5RhMyR0= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2 h1:KKANO+wsLVkuH8N+xuYrEx+rDcliv48zYk3I7QzdX3A= github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3 h1:4DNnEZj4uSyE+gDS+j9MCUuax9nfnttfro+JJE8QRSE= From 9a7bfd11badf548a2b5c43891bde1222792df298 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 15:46:25 +0000 Subject: [PATCH 012/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mariadb (#753) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mariadb](https://github.com/stackitcloud/stackit-sdk-go) from 0.22.2 to 0.24.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.22.2...services/ske/v0.24.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mariadb dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d7936bede..eceb1d08e 100644 --- a/go.mod +++ b/go.mod @@ -238,7 +238,7 @@ require ( github.com/spf13/cast v1.7.1 // indirect github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 diff --git a/go.sum b/go.sum index 644ac8ffe..e6cf43226 100644 --- a/go.sum +++ b/go.sum @@ -578,8 +578,8 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 h1:StQg5p4h1 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 h1:wM/Gop6sG/fkpzsZGhrPN2AzkKxHup175WaFBGaeQ7s= github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2 h1:JoPz34UT1Gx7TV6GpOzWdNBq78co7MV12jynADI4AMc= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.22.2/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 h1:t/Ten9AuoWFmrDq5gAI3kVZShF3i8zEAaeBsYYqiaao= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 h1:RFe45uLzTSmd69yaQe5zLDY3+1hYi6/lSZUVcjbb6+c= From f94c636b2e17710a6d3ba3eb39d4b4e6e951434f Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 20 May 2025 09:05:31 +0200 Subject: [PATCH 013/422] fix(deps): update module github.com/lmittmann/tint to v1.1.0 (#758) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eceb1d08e..476f8d185 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf github.com/jedib0t/go-pretty/v6 v6.6.7 - github.com/lmittmann/tint v1.0.7 + github.com/lmittmann/tint v1.1.0 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 diff --git a/go.sum b/go.sum index e6cf43226..d9adcad8c 100644 --- a/go.sum +++ b/go.sum @@ -400,8 +400,8 @@ github.com/ldez/usetesting v0.4.3 h1:pJpN0x3fMupdTf/IapYjnkhiY1nSTN+pox1/GyBRw3k github.com/ldez/usetesting v0.4.3/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lmittmann/tint v1.0.7 h1:D/0OqWZ0YOGZ6AyC+5Y2kD8PBEzBk6rFHVSfOqCkF9Y= -github.com/lmittmann/tint v1.0.7/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/lmittmann/tint v1.1.0 h1:0hDmvuGv3U+Cep/jHpPxwjrCFjT6syam7iY7nTmA7ug= +github.com/lmittmann/tint v1.1.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= From 2c3c0a3f17b694512dfd59b8196faf5f7aa58777 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 20 May 2025 09:07:55 +0200 Subject: [PATCH 014/422] chore(deps): update renovatebot/github-action action to v42.0.3 (#757) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 92e3fbd8c..9c914fc30 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v42.0.2 + uses: renovatebot/github-action@v42.0.3 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From e655dcaf32a3478a0c635c1e1e87c0ca3f27f085 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 20 May 2025 15:37:31 +0200 Subject: [PATCH 015/422] fix(deps): update stackit sdk modules (#750) * fix(deps): update stackit sdk modules * fix: compile errors --------- Co-authored-by: Renovate Bot Co-authored-by: Marcel Jacek --- docs/stackit_dns_record-set_create.md | 2 +- docs/stackit_dns_zone_create.md | 2 +- go.mod | 28 +++++----- go.sum | 56 +++++++++---------- internal/cmd/dns/record-set/create/create.go | 17 ++++-- .../cmd/dns/record-set/create/create_test.go | 4 +- internal/cmd/dns/zone/create/create.go | 16 +++++- internal/cmd/dns/zone/create/create_test.go | 11 ++-- .../cmd/load-balancer/create/create_test.go | 4 +- .../generate-payload/generate_payload.go | 4 +- .../generate-payload/generate_payload_test.go | 8 +-- .../cmd/load-balancer/update/update_test.go | 4 +- .../scrape-config/create/create_test.go | 11 ++-- .../scrape-config/update/update_test.go | 2 +- .../cmd/ske/cluster/create/create_test.go | 9 +-- .../cmd/ske/cluster/update/update_test.go | 9 +-- internal/cmd/ske/options/options.go | 2 +- internal/pkg/services/dns/utils/utils.go | 2 +- .../pkg/services/observability/utils/utils.go | 6 +- .../observability/utils/utils_test.go | 12 ++-- .../services/serverbackup/utils/utils_test.go | 2 +- .../service-enablement/utils/utils.go | 3 +- .../service-enablement/utils/utils_test.go | 11 ++-- internal/pkg/services/ske/utils/utils.go | 2 +- internal/pkg/services/ske/utils/utils_test.go | 16 +++--- 25 files changed, 128 insertions(+), 115 deletions(-) diff --git a/docs/stackit_dns_record-set_create.md b/docs/stackit_dns_record-set_create.md index f692b80ad..dfb740ad9 100644 --- a/docs/stackit_dns_record-set_create.md +++ b/docs/stackit_dns_record-set_create.md @@ -25,7 +25,7 @@ stackit dns record-set create [flags] --name string Name of the record, should be compliant with RFC1035, Section 2.3.4 --record strings Records belonging to the record set --ttl int Time to live, if not provided defaults to the zone's default TTL - --type string Record type, one of ["A" "AAAA" "SOA" "CNAME" "NS" "MX" "TXT" "SRV" "PTR" "ALIAS" "DNAME" "CAA"] (default "A") + --type string Record type, one of ["A" "AAAA" "SOA" "CNAME" "NS" "MX" "TXT" "SRV" "PTR" "ALIAS" "DNAME" "CAA" "DNSKEY" "DS" "LOC" "NAPTR" "SSHFP" "TLSA" "URI" "CERT" "SVCB"] (default "A") --zone-id string Zone ID ``` diff --git a/docs/stackit_dns_zone_create.md b/docs/stackit_dns_zone_create.md index 081628e19..0a0efde1c 100644 --- a/docs/stackit_dns_zone_create.md +++ b/docs/stackit_dns_zone_create.md @@ -36,7 +36,7 @@ stackit dns zone create [flags] --primary strings Primary name server for secondary zone --refresh-time int Refresh time --retry-time int Retry time - --type string Zone type + --type string Zone type, one of: ["primary" "secondary"] ``` ### Options inherited from parent commands diff --git a/go.mod b/go.mod index 476f8d185..681e23976 100644 --- a/go.mod +++ b/go.mod @@ -16,23 +16,23 @@ require ( github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.22.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.2 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.4 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.24.0 golang.org/x/oauth2 v0.30.0 @@ -236,13 +236,13 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.23.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.23.0 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/go.sum b/go.sum index d9adcad8c..990d6b2de 100644 --- a/go.sum +++ b/go.sum @@ -564,54 +564,54 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.1 h1:TTrVoB1lERd/qfWzpe6HpwCJSjtaGnUI7UE7ITb5IT0= github.com/stackitcloud/stackit-sdk-go/core v0.17.1/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3 h1:JVRsMN5uKPxy9ynsxmhGfAecz87LjqN5G5Vg8MRwyRc= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.2.3/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1 h1:7JbFIXiq3IlFST7N7kS0gxX5EKX/rYs87kUVtR00sHw= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 h1:aXVMNdiHCtT07bro52KjnxEBMDNK9DweJBlk+G4ElCM= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3 h1:WJnA6YTOlBxMJf9PRuxkXduxj+fyWi+wOks69PvN1qI= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.13.3/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.14.0 h1:aji1vxn1LVfM+SCfOSXUz0Pwv+ZQjyt9PmV0ejHLy5U= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.14.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 h1:/NXxiJf/NFpj+DFXc07vsx+0he/xufdhIskXUlSeyyw= github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 h1:zh6e2eHgqex++fr6N0RK7wMMBGesC3QhBd42FdTq2Z8= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3 h1:StQg5p4h1aLFwIHQWWe5l44aFue+ZvQMGDbypP1DMYw= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.0.3/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2 h1:wM/Gop6sG/fkpzsZGhrPN2AzkKxHup175WaFBGaeQ7s= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.22.2/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0 h1:9gUobm//GzVGYTbfa39tNRceEjQskNuNVZyUS9rOZ4Y= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.23.0 h1:ksxHeILZutooun0Hy/cY8qikC9owya1UDJR+FSQSlRw= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.23.0/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 h1:t/Ten9AuoWFmrDq5gAI3kVZShF3i8zEAaeBsYYqiaao= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 h1:RFe45uLzTSmd69yaQe5zLDY3+1hYi6/lSZUVcjbb6+c= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2 h1:anITBRTlQoneEawVg4hHjs4IceFJLFq9KdDU+d5y5DU= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.5.2/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2 h1:p1bub8QayR+NkYtGd8DNSjxlRmoyR7Dr97LiwWVW1Ow= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.21.2/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0 h1:QqlFcMv/TbIG95u/xHB/9aLvElplj1lKnTIyUSwEtT4= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.22.0 h1:XDt4NCiWdpjbbw9UevsxLJ3SGkO1bSoJnV96RSHNNoI= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.22.0/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 h1:AIQueG1oSdKbxK8ASZZYkmqzJ7NhKzKcR5AQsndoF18= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 h1:YEfhKt3T25uY7vs8QcAPfdTs1GLil0BcrLCJ5RhMyR0= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2 h1:KKANO+wsLVkuH8N+xuYrEx+rDcliv48zYk3I7QzdX3A= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.22.2/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3 h1:4DNnEZj4uSyE+gDS+j9MCUuax9nfnttfro+JJE8QRSE= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.13.3/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.2 h1:+YwMWWvZlUtw6TEfTqXPdUyN9hbkECU4DULwgIMu6A0= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.0.2/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.23.0 h1:arcom/1Chl3+SkDZYRNx5IemkLlqU2mnXrQmg9dsxQI= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.23.0/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 h1:Rpbt83RyXS0AMw97g5L9oQdCAmVBGAyHpeCcDXesuEk= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 h1:nvwaviIDf5ffAydfQBrl48K1nPowyDq05ompo9ZzFzY= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4 h1:UCX1qy44q22bDGv7BhLtOrWCzriS9m4MQsIOX6n+lgM= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.3 h1:OR5CZnxZMbGXsYPOZL00En3RhXeUuEJcZVN9iSxxTs8= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.0.3/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 h1:cKQAuKSihSX1Jpacub2rZ1StItiO7SIO0y+Fi2yukd4= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 h1:iLyXsBF+lP7iE4rnoK3hO8l4wHcgySRXD65oeUgt6Jc= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3 h1:qCn6ZS/oJEqA4PBMLMDvvctQ4eQEoCQSSWES394+AcQ= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.6.3/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3 h1:rDsIPzaNJ4bnKJp9XFNzna+pXylGYVHUBPl5hqBWhX8= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.0.3/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.4 h1:whyCGfzlLcyb23uKGJLrftjT57vqa1jS3Xz5voUHK+M= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.22.4/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3 h1:MF46ffu+A8eu17N7LGFG2T50PhjDw2L0f68Uu316r8U= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.0.3/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0 h1:QiHkjmforciAfBnf/oMjGmoZWYYD38ZrgLNWK149xQQ= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0 h1:Wb/eEqbnwLw+lsTlAC8qTFoLMtXOTWcZDUDSiUB7GnM= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0 h1:kPAYBLDJC8W3GvDt+KtqDl2EZJgbU9l1tUj0JbCWA+4= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0 h1:awy7JzBwAVJEKcJVt1DBZtZ0qtdT2aEuWCkgQvKky9w= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 49db52860..045f6ce29 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -30,8 +30,8 @@ const ( ttlFlag = "ttl" typeFlag = "type" - defaultType = "A" - txtType = "TXT" + defaultType = dns.CREATERECORDSETPAYLOADTYPE_A + txtType = dns.CREATERECORDSETPAYLOADTYPE_TXT ) type inputModel struct { @@ -41,7 +41,7 @@ type inputModel struct { Name *string Records []string TTL *int64 - Type string + Type dns.CreateRecordSetPayloadTypes } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -109,14 +109,17 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { - typeFlagOptions := []string{"A", "AAAA", "SOA", "CNAME", "NS", "MX", "TXT", "SRV", "PTR", "ALIAS", "DNAME", "CAA"} + var typeFlagOptions []string + for _, val := range dns.AllowedCreateRecordSetPayloadTypesEnumValues { + typeFlagOptions = append(typeFlagOptions, string(val)) + } cmd.Flags().Var(flags.UUIDFlag(), zoneIdFlag, "Zone ID") cmd.Flags().String(commentFlag, "", "User comment") cmd.Flags().String(nameFlag, "", "Name of the record, should be compliant with RFC1035, Section 2.3.4") cmd.Flags().Int64(ttlFlag, 0, "Time to live, if not provided defaults to the zone's default TTL") cmd.Flags().StringSlice(recordFlag, []string{}, "Records belonging to the record set") - cmd.Flags().Var(flags.EnumFlag(false, defaultType, typeFlagOptions...), typeFlag, fmt.Sprintf("Record type, one of %q", typeFlagOptions)) + cmd.Flags().Var(flags.EnumFlag(false, string(defaultType), typeFlagOptions...), typeFlag, fmt.Sprintf("Record type, one of %q", typeFlagOptions)) err := flags.MarkFlagsRequired(cmd, zoneIdFlag, nameFlag, recordFlag) cobra.CheckErr(err) @@ -128,6 +131,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { return nil, &errors.ProjectIdError{} } + recordType := flags.FlagWithDefaultToStringValue(p, cmd, typeFlag) + model := inputModel{ GlobalFlagModel: globalFlags, ZoneId: flags.FlagToStringValue(p, cmd, zoneIdFlag), @@ -135,7 +140,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Name: flags.FlagToStringPointer(p, cmd, nameFlag), Records: flags.FlagToStringSliceValue(p, cmd, recordFlag), TTL: flags.FlagToInt64Pointer(p, cmd, ttlFlag), - Type: flags.FlagWithDefaultToStringValue(p, cmd, typeFlag), + Type: dns.CreateRecordSetPayloadTypes(recordType), } if model.Type == txtType { diff --git a/internal/cmd/dns/record-set/create/create_test.go b/internal/cmd/dns/record-set/create/create_test.go index 99a216aeb..789e46626 100644 --- a/internal/cmd/dns/record-set/create/create_test.go +++ b/internal/cmd/dns/record-set/create/create_test.go @@ -75,7 +75,7 @@ func fixtureRequest(mods ...func(request *dns.ApiCreateRecordSetRequest)) dns.Ap {Content: utils.Ptr("1.1.1.1")}, }, Ttl: utils.Ptr(int64(3600)), - Type: utils.Ptr("SOA"), + Type: dns.CREATERECORDSETPAYLOADTYPE_SOA.Ptr(), }) for _, mod := range mods { mod(&request) @@ -247,7 +247,7 @@ func TestParseInput(t *testing.T) { { description: "TXT record with > 255 characters", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[typeFlag] = txtType + flagValues[typeFlag] = string(txtType) flagValues[recordFlag] = strings.Join(recordTxtOver255Char, "") }), isValid: true, diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index 4855e4337..081602f18 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -46,7 +46,7 @@ type inputModel struct { DefaultTTL *int64 Primaries *[]string Acl *string - Type *string + Type *dns.CreateZonePayloadTypes RetryTime *int64 RefreshTime *int64 NegativeCache *int64 @@ -124,12 +124,17 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { + var typeFlagOptions []string + for _, val := range dns.AllowedCreateZonePayloadTypesEnumValues { + typeFlagOptions = append(typeFlagOptions, string(val)) + } + cmd.Flags().String(nameFlag, "", "User given name of the zone") cmd.Flags().String(dnsNameFlag, "", "Fully qualified domain name of the DNS zone") cmd.Flags().Int64(defaultTTLFlag, 1000, "Default time to live") cmd.Flags().StringSlice(primaryFlag, []string{}, "Primary name server for secondary zone") cmd.Flags().String(aclFlag, "", "Access control list") - cmd.Flags().String(typeFlag, "", "Zone type") + cmd.Flags().Var(flags.EnumFlag(false, "", append(typeFlagOptions, "")...), typeFlag, fmt.Sprintf("Zone type, one of: %q", typeFlagOptions)) cmd.Flags().Int64(retryTimeFlag, 0, "Retry time") cmd.Flags().Int64(refreshTimeFlag, 0, "Refresh time") cmd.Flags().Int64(negativeCacheFlag, 0, "Negative cache") @@ -148,6 +153,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { return nil, &errors.ProjectIdError{} } + var zoneType *dns.CreateZonePayloadTypes + if zoneTypeString := flags.FlagToStringPointer(p, cmd, typeFlag); zoneTypeString != nil && *zoneTypeString != "" { + zoneType = dns.CreateZonePayloadTypes(*zoneTypeString).Ptr() + } + model := inputModel{ GlobalFlagModel: globalFlags, Name: flags.FlagToStringPointer(p, cmd, nameFlag), @@ -155,7 +165,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { DefaultTTL: flags.FlagToInt64Pointer(p, cmd, defaultTTLFlag), Primaries: flags.FlagToStringSlicePointer(p, cmd, primaryFlag), Acl: flags.FlagToStringPointer(p, cmd, aclFlag), - Type: flags.FlagToStringPointer(p, cmd, typeFlag), + Type: zoneType, RetryTime: flags.FlagToInt64Pointer(p, cmd, retryTimeFlag), RefreshTime: flags.FlagToInt64Pointer(p, cmd, refreshTimeFlag), NegativeCache: flags.FlagToInt64Pointer(p, cmd, negativeCacheFlag), diff --git a/internal/cmd/dns/zone/create/create_test.go b/internal/cmd/dns/zone/create/create_test.go index 39412b8ac..536711d80 100644 --- a/internal/cmd/dns/zone/create/create_test.go +++ b/internal/cmd/dns/zone/create/create_test.go @@ -29,7 +29,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st dnsNameFlag: "example.com", defaultTTLFlag: "3600", aclFlag: "0.0.0.0/0", - typeFlag: "master", + typeFlag: string(dns.CREATEZONEPAYLOADTYPE_PRIMARY), primaryFlag: "1.1.1.1", retryTimeFlag: "600", refreshTimeFlag: "3600", @@ -56,7 +56,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { DefaultTTL: utils.Ptr(int64(3600)), Primaries: utils.Ptr([]string{"1.1.1.1"}), Acl: utils.Ptr("0.0.0.0/0"), - Type: utils.Ptr("master"), + Type: dns.CREATEZONEPAYLOADTYPE_PRIMARY.Ptr(), RetryTime: utils.Ptr(int64(600)), RefreshTime: utils.Ptr(int64(3600)), NegativeCache: utils.Ptr(int64(60)), @@ -79,7 +79,7 @@ func fixtureRequest(mods ...func(request *dns.ApiCreateZoneRequest)) dns.ApiCrea DefaultTTL: utils.Ptr(int64(3600)), Primaries: utils.Ptr([]string{"1.1.1.1"}), Acl: utils.Ptr("0.0.0.0/0"), - Type: utils.Ptr("master"), + Type: dns.CREATEZONEPAYLOADTYPE_PRIMARY.Ptr(), RetryTime: utils.Ptr(int64(600)), RefreshTime: utils.Ptr(int64(3600)), NegativeCache: utils.Ptr(int64(60)), @@ -139,7 +139,6 @@ func TestParseInput(t *testing.T) { defaultTTLFlag: "0", aclFlag: "", typeFlag: "", - primaryFlag: "", retryTimeFlag: "0", refreshTimeFlag: "0", negativeCacheFlag: "0", @@ -157,9 +156,9 @@ func TestParseInput(t *testing.T) { Name: utils.Ptr(""), DnsName: utils.Ptr(""), DefaultTTL: utils.Ptr(int64(0)), - Primaries: utils.Ptr([]string{}), + Primaries: nil, Acl: utils.Ptr(""), - Type: utils.Ptr(""), + Type: nil, RetryTime: utils.Ptr(int64(0)), RefreshTime: utils.Ptr(int64(0)), NegativeCache: utils.Ptr(int64(0)), diff --git a/internal/cmd/load-balancer/create/create_test.go b/internal/cmd/load-balancer/create/create_test.go index eca1281a8..66cdb2754 100644 --- a/internal/cmd/load-balancer/create/create_test.go +++ b/internal/cmd/load-balancer/create/create_test.go @@ -36,7 +36,7 @@ var testPayload = &loadbalancer.CreateLoadBalancerPayload{ { DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { Name: utils.Ptr(""), @@ -55,7 +55,7 @@ var testPayload = &loadbalancer.CreateLoadBalancerPayload{ Networks: &[]loadbalancer.Network{ { NetworkId: utils.Ptr(""), - Role: utils.Ptr(""), + Role: loadbalancer.NetworkRole("").Ptr(), }, }, Options: &loadbalancer.LoadBalancerOptions{ diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 1197cf7a9..42cbb4a59 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -35,7 +35,7 @@ var ( defaultPayloadListener = &loadbalancer.Listener{ DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { Name: utils.Ptr(""), @@ -52,7 +52,7 @@ var ( defaultPayloadNetwork = &loadbalancer.Network{ NetworkId: utils.Ptr(""), - Role: utils.Ptr(""), + Role: loadbalancer.NetworkRole("").Ptr(), } defaultPayloadTargetPool = &loadbalancer.TargetPool{ diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index 5943215b8..66a0891ec 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -226,7 +226,7 @@ func TestModifyListeners(t *testing.T) { { DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), Name: utils.Ptr(""), ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { @@ -244,7 +244,7 @@ func TestModifyListeners(t *testing.T) { { DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), Name: utils.Ptr(""), ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { @@ -265,7 +265,7 @@ func TestModifyListeners(t *testing.T) { { DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), Name: nil, ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { @@ -283,7 +283,7 @@ func TestModifyListeners(t *testing.T) { { DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), Name: nil, ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { diff --git a/internal/cmd/load-balancer/update/update_test.go b/internal/cmd/load-balancer/update/update_test.go index 9d97f07fc..b57d57336 100644 --- a/internal/cmd/load-balancer/update/update_test.go +++ b/internal/cmd/load-balancer/update/update_test.go @@ -33,7 +33,7 @@ var testPayload = loadbalancer.UpdateLoadBalancerPayload{ { DisplayName: utils.Ptr(""), Port: utils.Ptr(int64(0)), - Protocol: utils.Ptr(""), + Protocol: loadbalancer.ListenerProtocol("").Ptr(), ServerNameIndicators: &[]loadbalancer.ServerNameIndicator{ { Name: utils.Ptr(""), @@ -52,7 +52,7 @@ var testPayload = loadbalancer.UpdateLoadBalancerPayload{ Networks: &[]loadbalancer.Network{ { NetworkId: utils.Ptr(""), - Role: utils.Ptr(""), + Role: loadbalancer.NetworkRole("").Ptr(), }, }, Options: &loadbalancer.LoadBalancerOptions{ diff --git a/internal/cmd/observability/scrape-config/create/create_test.go b/internal/cmd/observability/scrape-config/create/create_test.go index 54c0573e3..533bf457b 100644 --- a/internal/cmd/observability/scrape-config/create/create_test.go +++ b/internal/cmd/observability/scrape-config/create/create_test.go @@ -2,6 +2,7 @@ package create import ( "context" + "fmt" "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -34,7 +35,7 @@ var testPayload = &observability.CreateScrapeConfigPayload{ JobName: utils.Ptr("default-name"), MetricsRelabelConfigs: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: utils.Ptr("replace"), + Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), Modulus: utils.Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -48,7 +49,7 @@ var testPayload = &observability.CreateScrapeConfigPayload{ "key2": []interface{}{}, }, SampleLimit: utils.Ptr(1.0), - Scheme: utils.Ptr("scheme"), + Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS.Ptr(), ScrapeInterval: utils.Ptr("interval"), ScrapeTimeout: utils.Ptr("timeout"), StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{ @@ -69,7 +70,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ projectIdFlag: testProjectId, instanceIdFlag: testInstanceId, - payloadFlag: `{ + payloadFlag: fmt.Sprintf(`{ "jobName": "default-name", "basicAuth": { "username": "username", @@ -95,7 +96,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "key2": [] }, "sampleLimit": 1.0, - "scheme": "scheme", + "scheme": "%s", "scrapeInterval": "interval", "scrapeTimeout": "timeout", "staticConfigs": [ @@ -110,7 +111,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "tlsConfig": { "insecureSkipVerify": true } - }`, + }`, observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS), } for _, mod := range mods { mod(flagValues) diff --git a/internal/cmd/observability/scrape-config/update/update_test.go b/internal/cmd/observability/scrape-config/update/update_test.go index ad5870231..595b4f09e 100644 --- a/internal/cmd/observability/scrape-config/update/update_test.go +++ b/internal/cmd/observability/scrape-config/update/update_test.go @@ -34,7 +34,7 @@ var testPayload = observability.UpdateScrapeConfigPayload{ MetricsPath: utils.Ptr("/metrics"), MetricsRelabelConfigs: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: utils.Ptr("replace"), + Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), Modulus: utils.Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index 3cc543398..f64a03eb1 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -2,6 +2,7 @@ package create import ( "context" + "fmt" "testing" "time" @@ -47,7 +48,7 @@ var testPayload = &ske.CreateOrUpdateClusterPayload{ Size: utils.Ptr(int64(40)), }, AvailabilityZones: &[]string{"eu01-3"}, - Cri: &ske.CRI{Name: utils.Ptr("cri")}, + Cri: &ske.CRI{Name: ske.CRINAME_DOCKER.Ptr()}, }, }, Extensions: &ske.Extension{ @@ -81,7 +82,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ projectIdFlag: testProjectId, - payloadFlag: `{ + payloadFlag: fmt.Sprintf(`{ "name": "cli-jp", "kubernetes": { "version": "1.25.15" @@ -100,7 +101,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "maximum": 2, "maxSurge": 1, "volume": { "type": "storage_premium_perf0", "size": 40 }, - "cri": { "name": "cri" }, + "cri": { "name": "%s" }, "availabilityZones": ["eu01-3"] } ], @@ -115,7 +116,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "start": "0000-01-01T03:00:00+02:00" } } - }`, + }`, ske.CRINAME_DOCKER), } for _, mod := range mods { mod(flagValues) diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index e4ec07b3f..8eab71453 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -2,6 +2,7 @@ package update import ( "context" + "fmt" "testing" "time" @@ -47,7 +48,7 @@ var testPayload = ske.CreateOrUpdateClusterPayload{ Size: utils.Ptr(int64(40)), }, AvailabilityZones: &[]string{"eu01-3"}, - Cri: &ske.CRI{Name: utils.Ptr("cri")}, + Cri: &ske.CRI{Name: ske.CRINAME_DOCKER.Ptr()}, }, }, Extensions: &ske.Extension{ @@ -81,7 +82,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ projectIdFlag: testProjectId, - payloadFlag: `{ + payloadFlag: fmt.Sprintf(`{ "name": "cli-jp", "kubernetes": { "version": "1.25.15" @@ -100,7 +101,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "maximum": 2, "maxSurge": 1, "volume": { "type": "storage_premium_perf0", "size": 40 }, - "cri": { "name": "cri" }, + "cri": { "name": "%s" }, "availabilityZones": ["eu01-3"] } ], @@ -115,7 +116,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "start": "0000-01-01T03:00:00+02:00" } } - }`, + }`, ske.CRINAME_DOCKER), } for _, mod := range mods { mod(flagValues) diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 0608e5a7d..dbcfa7613 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -275,7 +275,7 @@ func buildMachineImagesTable(resp *ske.ProviderOptions) tables.Table { criNames := make([]string, 0) for i := range *version.Cri { cri := (*version.Cri)[i] - criNames = append(criNames, *cri.Name) + criNames = append(criNames, string(*cri.Name)) } criNamesString := strings.Join(criNames, ", ") diff --git a/internal/pkg/services/dns/utils/utils.go b/internal/pkg/services/dns/utils/utils.go index 351cf2e47..141fb50e0 100644 --- a/internal/pkg/services/dns/utils/utils.go +++ b/internal/pkg/services/dns/utils/utils.go @@ -35,7 +35,7 @@ func GetRecordSetType(ctx context.Context, apiClient DNSClient, projectId, zoneI if err != nil { return utils.Ptr(""), fmt.Errorf("get DNS recordset: %w", err) } - return resp.Rrset.Type, nil + return (*string)(resp.Rrset.Type), nil } func FormatTxtRecord(input string) (string, error) { diff --git a/internal/pkg/services/observability/utils/utils.go b/internal/pkg/services/observability/utils/utils.go index fef48457e..234da09be 100644 --- a/internal/pkg/services/observability/utils/utils.go +++ b/internal/pkg/services/observability/utils/utils.go @@ -31,7 +31,7 @@ var ( DefaultCreateScrapeConfigPayload = observability.CreateScrapeConfigPayload{ JobName: utils.Ptr("default-name"), MetricsPath: utils.Ptr("/metrics"), - Scheme: utils.Ptr("https"), + Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS.Ptr(), ScrapeInterval: utils.Ptr("5m"), ScrapeTimeout: utils.Ptr("2m"), StaticConfigs: utils.Ptr(defaultStaticConfigs), @@ -106,7 +106,7 @@ func MapToUpdateScrapeConfigPayload(resp *observability.GetScrapeConfigResponse) MetricsRelabelConfigs: metricsRelabelConfigs, Params: params, SampleLimit: utils.ConvertInt64PToFloat64P(data.SampleLimit), - Scheme: data.Scheme, + Scheme: observability.UpdateScrapeConfigPayloadGetSchemeAttributeType(data.Scheme), ScrapeInterval: data.ScrapeInterval, ScrapeTimeout: data.ScrapeTimeout, StaticConfigs: staticConfigs, @@ -127,7 +127,7 @@ func mapMetricsRelabelConfig(metricsRelabelConfigs *[]observability.MetricsRelab var mappedConfigs []observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner for _, config := range *metricsRelabelConfigs { mappedConfig := observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ - Action: config.Action, + Action: observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInnerGetActionAttributeType(config.Action), Modulus: utils.ConvertInt64PToFloat64P(config.Modulus), Regex: config.Regex, Replacement: config.Replacement, diff --git a/internal/pkg/services/observability/utils/utils_test.go b/internal/pkg/services/observability/utils/utils_test.go index 36484e547..0b5083aad 100644 --- a/internal/pkg/services/observability/utils/utils_test.go +++ b/internal/pkg/services/observability/utils/utils_test.go @@ -48,7 +48,7 @@ func fixtureGetScrapeConfigResponse(mods ...func(*observability.GetScrapeConfigR MetricsPath: utils.Ptr("/metrics"), MetricsRelabelConfigs: &[]observability.MetricsRelabelConfig{ { - Action: utils.Ptr("replace"), + Action: observability.METRICSRELABELCONFIGACTION_REPLACE.Ptr(), Modulus: &number, Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -62,7 +62,7 @@ func fixtureGetScrapeConfigResponse(mods ...func(*observability.GetScrapeConfigR "key2": {}, }, SampleLimit: &number, - Scheme: utils.Ptr("scheme"), + Scheme: observability.JOBSCHEME_HTTP.Ptr(), ScrapeInterval: utils.Ptr("interval"), ScrapeTimeout: utils.Ptr("timeout"), StaticConfigs: &[]observability.StaticConfigs{ @@ -99,7 +99,7 @@ func fixtureUpdateScrapeConfigPayload(mods ...func(*observability.UpdateScrapeCo MetricsPath: utils.Ptr("/metrics"), MetricsRelabelConfigs: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: utils.Ptr("replace"), + Action: utils.Ptr(observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInnerAction("replace")), Modulus: utils.Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -113,7 +113,7 @@ func fixtureUpdateScrapeConfigPayload(mods ...func(*observability.UpdateScrapeCo "key2": []string{}, }, SampleLimit: utils.Ptr(1.0), - Scheme: utils.Ptr("scheme"), + Scheme: observability.UPDATESCRAPECONFIGPAYLOADSCHEME_HTTP.Ptr(), ScrapeInterval: utils.Ptr("interval"), ScrapeTimeout: utils.Ptr("timeout"), StaticConfigs: &[]observability.UpdateScrapeConfigPayloadStaticConfigsInner{ @@ -432,7 +432,7 @@ func TestMapMetricsRelabelConfig(t *testing.T) { description: "base case", config: &[]observability.MetricsRelabelConfig{ { - Action: utils.Ptr("replace"), + Action: observability.METRICSRELABELCONFIGACTION_REPLACE.Ptr(), Modulus: utils.Int64Ptr(1), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -443,7 +443,7 @@ func TestMapMetricsRelabelConfig(t *testing.T) { }, expected: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ { - Action: utils.Ptr("replace"), + Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), Modulus: utils.Float64Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), diff --git a/internal/pkg/services/serverbackup/utils/utils_test.go b/internal/pkg/services/serverbackup/utils/utils_test.go index b9ca14087..73b915b3a 100644 --- a/internal/pkg/services/serverbackup/utils/utils_test.go +++ b/internal/pkg/services/serverbackup/utils/utils_test.go @@ -88,7 +88,7 @@ func TestCanDisableBackupService(t *testing.T) { LastRestoredAt: utils.Ptr("test timestamp"), Name: utils.Ptr("test name"), Size: utils.Ptr(int64(5)), - Status: utils.Ptr("test status"), + Status: serverbackup.BACKUPSTATUS_BACKING_UP.Ptr(), VolumeBackups: nil, }, }, diff --git a/internal/pkg/services/service-enablement/utils/utils.go b/internal/pkg/services/service-enablement/utils/utils.go index a6e29254c..5f1976164 100644 --- a/internal/pkg/services/service-enablement/utils/utils.go +++ b/internal/pkg/services/service-enablement/utils/utils.go @@ -6,7 +6,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/core/oapierror" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" - "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/wait" ) const ( @@ -29,5 +28,5 @@ func ProjectEnabled(ctx context.Context, apiClient ServiceEnablementClient, proj } return false, err } - return *project.State == wait.ServiceStateEnabled, nil + return *project.State == serviceenablement.SERVICESTATUSSTATE_ENABLED, nil } diff --git a/internal/pkg/services/service-enablement/utils/utils_test.go b/internal/pkg/services/service-enablement/utils/utils_test.go index 3c364847a..b898adb69 100644 --- a/internal/pkg/services/service-enablement/utils/utils_test.go +++ b/internal/pkg/services/service-enablement/utils/utils_test.go @@ -5,12 +5,9 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/uuid" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" - "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement/wait" ) var ( @@ -45,7 +42,7 @@ func TestProjectEnabled(t *testing.T) { }{ { description: "project enabled", - getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateEnabled)}, + getProjectResp: &serviceenablement.ServiceStatus{State: serviceenablement.SERVICESTATUSSTATE_ENABLED.Ptr()}, isValid: true, expectedOutput: true, }, @@ -57,19 +54,19 @@ func TestProjectEnabled(t *testing.T) { }, { description: "project disabled 1", - getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateEnabling)}, + getProjectResp: &serviceenablement.ServiceStatus{State: serviceenablement.SERVICESTATUSSTATE_ENABLING.Ptr()}, isValid: true, expectedOutput: false, }, { description: "project disabled 2", - getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateDisabled)}, + getProjectResp: &serviceenablement.ServiceStatus{State: serviceenablement.SERVICESTATUSSTATE_DISABLING.Ptr()}, isValid: true, expectedOutput: false, }, { description: "project disabled 3", - getProjectResp: &serviceenablement.ServiceStatus{State: utils.Ptr(wait.ServiceStateDisabling)}, + getProjectResp: &serviceenablement.ServiceStatus{State: serviceenablement.SERVICESTATUSSTATE_DISABLING.Ptr()}, isValid: true, expectedOutput: false, }, diff --git a/internal/pkg/services/ske/utils/utils.go b/internal/pkg/services/ske/utils/utils.go index 452d4b584..283760f63 100644 --- a/internal/pkg/services/ske/utils/utils.go +++ b/internal/pkg/services/ske/utils/utils.go @@ -17,7 +17,7 @@ import ( const ( defaultNodepoolAvailabilityZone = "eu01-3" - defaultNodepoolCRI = "containerd" + defaultNodepoolCRI = ske.CRINAME_CONTAINERD defaultNodepoolMachineType = "b1.2" defaultNodepoolMachineImageName = "flatcar" defaultNodepoolMaxSurge = 1 diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index e19c16116..9c6c37ace 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -167,10 +167,10 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt Version: utils.Ptr("1.2.3"), Cri: &[]ske.CRI{ { - Name: utils.Ptr("not-containerd"), + Name: ske.CRINAME_DOCKER.Ptr(), }, { - Name: utils.Ptr("containerd"), + Name: ske.CRINAME_CONTAINERD.Ptr(), }, }, }, @@ -179,10 +179,10 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt Version: utils.Ptr("3.2.1"), Cri: &[]ske.CRI{ { - Name: utils.Ptr("not-containerd"), + Name: ske.CRINAME_DOCKER.Ptr(), }, { - Name: utils.Ptr("containerd"), + Name: ske.CRINAME_CONTAINERD.Ptr(), }, }, }, @@ -196,7 +196,7 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt Version: utils.Ptr("4.4.4"), Cri: &[]ske.CRI{ { - Name: utils.Ptr("containerd"), + Name: ske.CRINAME_CONTAINERD.Ptr(), }, }, }, @@ -219,7 +219,7 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt Version: utils.Ptr("4.4.4"), Cri: &[]ske.CRI{ { - Name: utils.Ptr("containerd"), + Name: ske.CRINAME_CONTAINERD.Ptr(), }, }, }, @@ -233,7 +233,7 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt Version: utils.Ptr("4.4.4"), Cri: &[]ske.CRI{ { - Name: utils.Ptr("not-containerd"), + Name: ske.CRINAME_DOCKER.Ptr(), }, }, }, @@ -264,7 +264,7 @@ func fixtureGetDefaultPayload(mods ...func(*ske.CreateOrUpdateClusterPayload)) * "eu01-3", }, Cri: &ske.CRI{ - Name: utils.Ptr("containerd"), + Name: ske.CRINAME_CONTAINERD.Ptr(), }, Machine: &ske.Machine{ Type: utils.Ptr("b1.2"), From 02c137056ba4aee724fcce3b6c6d5a9ce162251d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 13:46:48 +0000 Subject: [PATCH 016/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/redis (#759) Bumps [github.com/stackitcloud/stackit-sdk-go/services/redis](https://github.com/stackitcloud/stackit-sdk-go) from 0.22.2 to 0.24.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.22.2...services/ske/v0.24.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/redis dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 681e23976..f4bd3108a 100644 --- a/go.mod +++ b/go.mod @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/go.sum b/go.sum index 990d6b2de..ce2106369 100644 --- a/go.sum +++ b/go.sum @@ -592,8 +592,8 @@ github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 h1:AIQueG1oS github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 h1:YEfhKt3T25uY7vs8QcAPfdTs1GLil0BcrLCJ5RhMyR0= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.23.0 h1:arcom/1Chl3+SkDZYRNx5IemkLlqU2mnXrQmg9dsxQI= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.23.0/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0 h1:FZdQwBKyW86l1EwiEUSDsAfhF9si337kNAnagz9ND6A= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 h1:Rpbt83RyXS0AMw97g5L9oQdCAmVBGAyHpeCcDXesuEk= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 h1:nvwaviIDf5ffAydfQBrl48K1nPowyDq05ompo9ZzFzY= From c05dbcfa26f00c9a5ee1bcac36384486cfdcc834 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 15:47:14 +0200 Subject: [PATCH 017/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/dns (#760) Bumps [github.com/stackitcloud/stackit-sdk-go/services/dns](https://github.com/stackitcloud/stackit-sdk-go) from 0.13.3 to 0.15.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/dns/v0.13.3...core/v0.15.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/dns dependency-version: 0.15.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f4bd3108a..bbe503aa8 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.14.0 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 diff --git a/go.sum b/go.sum index ce2106369..b71e12411 100644 --- a/go.sum +++ b/go.sum @@ -568,8 +568,8 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1 h1:7JbFIXiq3IlFST7N7k github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 h1:aXVMNdiHCtT07bro52KjnxEBMDNK9DweJBlk+G4ElCM= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.14.0 h1:aji1vxn1LVfM+SCfOSXUz0Pwv+ZQjyt9PmV0ejHLy5U= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.14.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 h1:GQAA9gqhKN0ZRc1vRYURHeVjSghh+iF+5DK0HdeuakI= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 h1:/NXxiJf/NFpj+DFXc07vsx+0he/xufdhIskXUlSeyyw= github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 h1:zh6e2eHgqex++fr6N0RK7wMMBGesC3QhBd42FdTq2Z8= From 398a00513665666daf939e041de6e76daa995084 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 16:26:01 +0200 Subject: [PATCH 018/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/secretsmanager (#764) Bumps [github.com/stackitcloud/stackit-sdk-go/services/secretsmanager](https://github.com/stackitcloud/stackit-sdk-go) from 0.11.4 to 0.12.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/secretsmanager/v0.11.4...core/v0.12.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/secretsmanager dependency-version: 0.12.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bbe503aa8..2343ac1c1 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0 diff --git a/go.sum b/go.sum index b71e12411..4c033e056 100644 --- a/go.sum +++ b/go.sum @@ -598,8 +598,8 @@ github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 h1:Rpbt8 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 h1:nvwaviIDf5ffAydfQBrl48K1nPowyDq05ompo9ZzFzY= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4 h1:UCX1qy44q22bDGv7BhLtOrWCzriS9m4MQsIOX6n+lgM= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.11.4/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 h1:oGR3wRC0xfX2Itpwbh/SrT/k2fnmMSzvy2U9U2lDQPs= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 h1:cKQAuKSihSX1Jpacub2rZ1StItiO7SIO0y+Fi2yukd4= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 h1:iLyXsBF+lP7iE4rnoK3hO8l4wHcgySRXD65oeUgt6Jc= From d806060671e6c4937be20d13a30f7008b805d5f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 16:26:18 +0200 Subject: [PATCH 019/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#763) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serviceaccount](https://github.com/stackitcloud/stackit-sdk-go) from 0.7.0 to 0.8.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.7.0...core/v0.8.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serviceaccount dependency-version: 0.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2343ac1c1..1753cbf79 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0 diff --git a/go.sum b/go.sum index 4c033e056..7331de7a1 100644 --- a/go.sum +++ b/go.sum @@ -604,8 +604,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 h1:cKQAuKSih github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 h1:iLyXsBF+lP7iE4rnoK3hO8l4wHcgySRXD65oeUgt6Jc= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0 h1:QiHkjmforciAfBnf/oMjGmoZWYYD38ZrgLNWK149xQQ= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.7.0/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0 h1:rgSKhgnybB3vrAKAafnuOLjyhn4LtxUxvmgmi810N3U= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0 h1:Wb/eEqbnwLw+lsTlAC8qTFoLMtXOTWcZDUDSiUB7GnM= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0 h1:kPAYBLDJC8W3GvDt+KtqDl2EZJgbU9l1tUj0JbCWA+4= From 6cf705d8333079cb3f86ce82c2ddc2e9fe7edf86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 16:26:38 +0200 Subject: [PATCH 020/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/logme (#762) Bumps [github.com/stackitcloud/stackit-sdk-go/services/logme](https://github.com/stackitcloud/stackit-sdk-go) from 0.23.0 to 0.24.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.23.0...services/ske/v0.24.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/logme dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1753cbf79..5a28c6ac0 100644 --- a/go.mod +++ b/go.mod @@ -237,7 +237,7 @@ require ( github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0 diff --git a/go.sum b/go.sum index 7331de7a1..1d1a6d7fc 100644 --- a/go.sum +++ b/go.sum @@ -576,8 +576,8 @@ github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 h1:zh6e2eHgqex++fr6 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0 h1:9gUobm//GzVGYTbfa39tNRceEjQskNuNVZyUS9rOZ4Y= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.23.0 h1:ksxHeILZutooun0Hy/cY8qikC9owya1UDJR+FSQSlRw= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.23.0/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0 h1:5J2TH9ig5cp+5pCHugrsDJuFsRnIOQHQUqsxlweRXL0= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 h1:t/Ten9AuoWFmrDq5gAI3kVZShF3i8zEAaeBsYYqiaao= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= From 84c119946fd414e4e7c2199d7dda5ac825eb0007 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 22 May 2025 11:33:27 +0200 Subject: [PATCH 021/422] fix(deps): update stackit sdk modules (#761) * adjust tests for new interfaces --------- Co-authored-by: Renovate Bot Co-authored-by: Marcel Jacek --- go.mod | 32 +++++----- go.sum | 64 +++++++++---------- internal/cmd/beta/alb/list/list_test.go | 5 +- internal/cmd/beta/alb/plans/plans_test.go | 1 - internal/cmd/beta/alb/quotas/quotas_test.go | 1 - internal/cmd/git/create/create_test.go | 2 +- internal/cmd/image/create/create_test.go | 6 +- internal/cmd/image/list/list_test.go | 4 +- internal/cmd/image/update/update_test.go | 6 +- .../observability-credentials/add/add_test.go | 2 +- .../target-pool/add-target/add_target_test.go | 6 +- .../remove-target/remove_target_test.go | 2 +- .../network-area/route/create/create_test.go | 2 +- .../disable/disable_test.go | 2 +- .../public-read-access/enable/enable_test.go | 2 +- .../single-sign-on/disable/disable_test.go | 2 +- .../single-sign-on/enable/enable_test.go | 2 +- internal/cmd/project/list/list_test.go | 2 +- .../cmd/security-group/create/create_test.go | 4 +- internal/cmd/security-group/list/list_test.go | 4 +- .../cmd/security-group/update/update_test.go | 2 +- internal/cmd/server/reboot/reboot_test.go | 2 +- .../load-balancer/utils/utils_test.go | 2 +- 23 files changed, 77 insertions(+), 80 deletions(-) diff --git a/go.mod b/go.mod index 5a28c6ac0..da11cae93 100644 --- a/go.mod +++ b/go.mod @@ -16,23 +16,23 @@ require ( github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 + github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.22.0 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.15.0 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.24.0 golang.org/x/oauth2 v0.30.0 @@ -236,11 +236,11 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 1d1a6d7fc..60169ba09 100644 --- a/go.sum +++ b/go.sum @@ -564,54 +564,54 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.1 h1:TTrVoB1lERd/qfWzpe6HpwCJSjtaGnUI7UE7ITb5IT0= github.com/stackitcloud/stackit-sdk-go/core v0.17.1/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1 h1:7JbFIXiq3IlFST7N7kS0gxX5EKX/rYs87kUVtR00sHw= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.3.1/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3 h1:aXVMNdiHCtT07bro52KjnxEBMDNK9DweJBlk+G4ElCM= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.6.3/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0 h1:l53lihnLUbAORdQPoUL2NlczWfeXfW5gHhoAIPsqGfI= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 h1:GQAA9gqhKN0ZRc1vRYURHeVjSghh+iF+5DK0HdeuakI= github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= -github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3 h1:/NXxiJf/NFpj+DFXc07vsx+0he/xufdhIskXUlSeyyw= -github.com/stackitcloud/stackit-sdk-go/services/git v0.3.3/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2 h1:zh6e2eHgqex++fr6N0RK7wMMBGesC3QhBd42FdTq2Z8= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.22.2/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0 h1:9gUobm//GzVGYTbfa39tNRceEjQskNuNVZyUS9rOZ4Y= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.1.0/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 h1:s0A2EPBrnBxfKStKA/B1izbyYHw/0m2RdqN3Inkv9hI= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0 h1:3D34kZSosO25ydqUz72y8sg6yigthKf35DO8SFUyzFU= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.0 h1:gaTgjmEIvq7Nmji5YHh1haFvA/8dWyOgCg3lw6drjL4= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.0/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0 h1:5J2TH9ig5cp+5pCHugrsDJuFsRnIOQHQUqsxlweRXL0= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 h1:t/Ten9AuoWFmrDq5gAI3kVZShF3i8zEAaeBsYYqiaao= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3 h1:RFe45uLzTSmd69yaQe5zLDY3+1hYi6/lSZUVcjbb6+c= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.1.3/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0 h1:QqlFcMv/TbIG95u/xHB/9aLvElplj1lKnTIyUSwEtT4= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.6.0/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.22.0 h1:XDt4NCiWdpjbbw9UevsxLJ3SGkO1bSoJnV96RSHNNoI= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.22.0/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4 h1:AIQueG1oSdKbxK8ASZZYkmqzJ7NhKzKcR5AQsndoF18= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.0.4/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 h1:+dKIPVz9ydKbX3x6+1NvYk++OA378w74p+N6SjDmzBQ= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.0 h1:TMHTJvVZj2Ne0tBgKxeSB5kUVP0dx3WQ2YZhbSIMp0E= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.0/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 h1:/OaZCyrD8LFa4W6a2Vu2QSVMJwLLBr8ZdBKzX00MV1Q= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 h1:r29a9GoBLVw2VZSzdPftlIsE5t7shdxobwoT6NVUIjU= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 h1:YEfhKt3T25uY7vs8QcAPfdTs1GLil0BcrLCJ5RhMyR0= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0 h1:FZdQwBKyW86l1EwiEUSDsAfhF9si337kNAnagz9ND6A= github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0 h1:Rpbt83RyXS0AMw97g5L9oQdCAmVBGAyHpeCcDXesuEk= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.14.0/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0 h1:nvwaviIDf5ffAydfQBrl48K1nPowyDq05ompo9ZzFzY= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.1.0/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.15.0 h1:lFxbZmcD+YyMVN35k2UxCpGoqhR+FyfgaOEcdWSOrwQ= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.15.0/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.0 h1:fMtKiC1VwABJXckRTyxLWWMDCNrbVdpCwQ63aBKgR5k= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.0/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 h1:oGR3wRC0xfX2Itpwbh/SrT/k2fnmMSzvy2U9U2lDQPs= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0 h1:cKQAuKSihSX1Jpacub2rZ1StItiO7SIO0y+Fi2yukd4= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.1.0/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3 h1:iLyXsBF+lP7iE4rnoK3hO8l4wHcgySRXD65oeUgt6Jc= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.0.3/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.0 h1:h3tF+yBqrFeRpvyeeGTM33ExA/YYbjwfKYvuZj7gQyM= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.0/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 h1:WJA2v8XCISdrcbnJXstsjVE+QAFVsDpfJHNp0ORe1Bc= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0 h1:rgSKhgnybB3vrAKAafnuOLjyhn4LtxUxvmgmi810N3U= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0 h1:Wb/eEqbnwLw+lsTlAC8qTFoLMtXOTWcZDUDSiUB7GnM= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.1.0/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0 h1:kPAYBLDJC8W3GvDt+KtqDl2EZJgbU9l1tUj0JbCWA+4= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.23.0/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0 h1:awy7JzBwAVJEKcJVt1DBZtZ0qtdT2aEuWCkgQvKky9w= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.1.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.0 h1:7CETDuCaEkA+YDbje6jaWhWO8w05lVxELTs93he9YG8= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.0/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.0 h1:VuX2xLDdPeeXH2+E4FPnTRxGXu68cI62titv4W1V5ic= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.0/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 h1:WvPLO1c7oT/MWmCRTt7jRyxus2g3DIluIW5iAsUpSFM= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/internal/cmd/beta/alb/list/list_test.go b/internal/cmd/beta/alb/list/list_test.go index 547787166..f0fb05146 100644 --- a/internal/cmd/beta/alb/list/list_test.go +++ b/internal/cmd/beta/alb/list/list_test.go @@ -5,12 +5,12 @@ import ( "strconv" "testing" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -49,7 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *alb.ApiListLoadBalancersRequest)) alb.ApiListLoadBalancersRequest { - request := testClient.ListLoadBalancers(context.Background(), testProjectId, testRegion) + request := testClient.ListLoadBalancers(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -160,7 +160,6 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), - cmpopts.IgnoreFields(alb.ApiListLoadBalancersRequest{}, "ctx"), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/beta/alb/plans/plans_test.go b/internal/cmd/beta/alb/plans/plans_test.go index bfbda8586..84b5c9002 100644 --- a/internal/cmd/beta/alb/plans/plans_test.go +++ b/internal/cmd/beta/alb/plans/plans_test.go @@ -156,7 +156,6 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), - cmpopts.IgnoreFields(alb.ApiListLoadBalancersRequest{}, "ctx"), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/beta/alb/quotas/quotas_test.go b/internal/cmd/beta/alb/quotas/quotas_test.go index 1ff2aaacd..6240e20d3 100644 --- a/internal/cmd/beta/alb/quotas/quotas_test.go +++ b/internal/cmd/beta/alb/quotas/quotas_test.go @@ -156,7 +156,6 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), - cmpopts.IgnoreFields(alb.ApiListLoadBalancersRequest{}, "ctx"), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/git/create/create_test.go b/internal/cmd/git/create/create_test.go index 33ed0cc7e..26499bf8b 100644 --- a/internal/cmd/git/create/create_test.go +++ b/internal/cmd/git/create/create_test.go @@ -184,7 +184,7 @@ func TestBuildRequest(t *testing.T) { model.Name = "new-name" }), expectedRequest: fixtureRequest(func(request *git.ApiCreateInstanceRequest) { - *request = request.CreateInstancePayload(fixtureCreatePayload(func(payload *git.CreateInstancePayload) { + *request = (*request).CreateInstancePayload(fixtureCreatePayload(func(payload *git.CreateInstancePayload) { payload.Name = utils.Ptr("new-name") })) }), diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index cdf15ce81..e0ed042c9 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -339,7 +339,7 @@ func TestBuildRequest(t *testing.T) { model.Labels = nil }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateImageRequest) { - *request = request.CreateImagePayload(fixtureCreatePayload(func(payload *iaas.CreateImagePayload) { + *request = (*request).CreateImagePayload(fixtureCreatePayload(func(payload *iaas.CreateImagePayload) { payload.Labels = nil })) }), @@ -350,7 +350,7 @@ func TestBuildRequest(t *testing.T) { model.Config.CdromBus = utils.Ptr("foobar") }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateImageRequest) { - *request = request.CreateImagePayload(fixtureCreatePayload(func(payload *iaas.CreateImagePayload) { + *request = (*request).CreateImagePayload(fixtureCreatePayload(func(payload *iaas.CreateImagePayload) { payload.Config.CdromBus = iaas.NewNullableString(utils.Ptr("foobar")) })) }), @@ -361,7 +361,7 @@ func TestBuildRequest(t *testing.T) { model.Config.Uefi = false }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateImageRequest) { - *request = request.CreateImagePayload(fixtureCreatePayload(func(payload *iaas.CreateImagePayload) { + *request = (*request).CreateImagePayload(fixtureCreatePayload(func(payload *iaas.CreateImagePayload) { payload.Config.Uefi = utils.Ptr(false) })) }), diff --git a/internal/cmd/image/list/list_test.go b/internal/cmd/image/list/list_test.go index c357d3bc1..6437127df 100644 --- a/internal/cmd/image/list/list_test.go +++ b/internal/cmd/image/list/list_test.go @@ -184,7 +184,7 @@ func TestBuildRequest(t *testing.T) { model.LabelSelector = utils.Ptr("") }), expectedRequest: fixtureRequest(func(request *iaas.ApiListImagesRequest) { - *request = request.LabelSelector("") + *request = (*request).LabelSelector("") }), }, { @@ -193,7 +193,7 @@ func TestBuildRequest(t *testing.T) { model.LabelSelector = utils.Ptr("foo=bar") }), expectedRequest: fixtureRequest(func(request *iaas.ApiListImagesRequest) { - *request = request.LabelSelector("foo=bar") + *request = (*request).LabelSelector("foo=bar") }), }, } diff --git a/internal/cmd/image/update/update_test.go b/internal/cmd/image/update/update_test.go index bb313b3c2..17216cbb9 100644 --- a/internal/cmd/image/update/update_test.go +++ b/internal/cmd/image/update/update_test.go @@ -373,7 +373,7 @@ func TestBuildRequest(t *testing.T) { model.Labels = nil }), expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateImageRequest) { - *request = request.UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { + *request = (*request).UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { payload.Labels = nil })) }), @@ -384,7 +384,7 @@ func TestBuildRequest(t *testing.T) { model.Name = utils.Ptr("something else") }), expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateImageRequest) { - *request = request.UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { + *request = (*request).UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { payload.Name = utils.Ptr("something else") })) }), @@ -395,7 +395,7 @@ func TestBuildRequest(t *testing.T) { model.Config.CdromBus = utils.Ptr("something else") }), expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateImageRequest) { - *request = request.UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { + *request = (*request).UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { payload.Config.CdromBus.Set(utils.Ptr("something else")) })) }), diff --git a/internal/cmd/load-balancer/observability-credentials/add/add_test.go b/internal/cmd/load-balancer/observability-credentials/add/add_test.go index 5ee5523f8..bedebaf95 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add_test.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add_test.go @@ -189,7 +189,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), - cmpopts.IgnoreFields(loadbalancer.ApiCreateCredentialsRequest{}, "xRequestID"), + cmpopts.IgnoreFields(loadbalancer.CreateCredentialsRequest{}, "xRequestID"), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go index 61d2fe4a6..7d7b1799f 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go @@ -338,7 +338,7 @@ func TestBuildRequest(t *testing.T) { }, } }) - *request = request.UpdateTargetPoolPayload(*payload) + *request = (*request).UpdateTargetPoolPayload(*payload) }), }, { @@ -357,7 +357,7 @@ func TestBuildRequest(t *testing.T) { }, } }) - *request = request.UpdateTargetPoolPayload(*payload) + *request = (*request).UpdateTargetPoolPayload(*payload) }), }, { @@ -376,7 +376,7 @@ func TestBuildRequest(t *testing.T) { }, } }) - *request = request.UpdateTargetPoolPayload(*payload) + *request = (*request).UpdateTargetPoolPayload(*payload) }), }, { diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go index d945f3c8e..14bb4fadc 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go @@ -320,7 +320,7 @@ func TestBuildRequest(t *testing.T) { payload := fixturePayload(func(payload *loadbalancer.UpdateTargetPoolPayload) { payload.Targets = utils.Ptr((*payload.Targets)[1:]) }) - *request = request.UpdateTargetPoolPayload(*payload) + *request = (*request).UpdateTargetPoolPayload(*payload) }), }, { diff --git a/internal/cmd/network-area/route/create/create_test.go b/internal/cmd/network-area/route/create/create_test.go index 182555c0c..a1ab93772 100644 --- a/internal/cmd/network-area/route/create/create_test.go +++ b/internal/cmd/network-area/route/create/create_test.go @@ -241,7 +241,7 @@ func TestBuildRequest(t *testing.T) { model.Labels = utils.Ptr(map[string]string{"key": "value"}) }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkAreaRouteRequest) { - *request = request.CreateNetworkAreaRoutePayload(fixturePayload(func(payload *iaas.CreateNetworkAreaRoutePayload) { + *request = (*request).CreateNetworkAreaRoutePayload(fixturePayload(func(payload *iaas.CreateNetworkAreaRoutePayload) { (*payload.Ipv4)[0].Labels = utils.Ptr(map[string]interface{}{"key": "value"}) })) }), diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go index a8db1bd9d..9dc5019d2 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go @@ -262,7 +262,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go index d425e7078..6d1fbea0a 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go @@ -262,7 +262,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go index 53c087352..e536ab098 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go @@ -262,7 +262,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go index cdc464409..033227257 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go @@ -262,7 +262,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, expectedRequest: fixtureRequest(func(request *observability.ApiUpdateGrafanaConfigsRequest) { - *request = request.UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { + *request = (*request).UpdateGrafanaConfigsPayload(*fixturePayload(func(payload *observability.UpdateGrafanaConfigsPayload) { payload.GenericOauth = nil })) }), diff --git a/internal/cmd/project/list/list_test.go b/internal/cmd/project/list/list_test.go index 79397409f..6d187a9bc 100644 --- a/internal/cmd/project/list/list_test.go +++ b/internal/cmd/project/list/list_test.go @@ -67,7 +67,7 @@ func fixtureRequest(mods ...func(request *resourcemanager.ApiListProjectsRequest testCreationTimeAfter, err := time.Parse(creationTimeAfterFormat, testCreationTimeAfter) if err != nil { - return resourcemanager.ApiListProjectsRequest{} + return resourcemanager.ListProjectsRequest{} } request = request.CreationTimeStart(testCreationTimeAfter) request = request.Member("member") diff --git a/internal/cmd/security-group/create/create_test.go b/internal/cmd/security-group/create/create_test.go index 9b2561489..7b9cbd21e 100644 --- a/internal/cmd/security-group/create/create_test.go +++ b/internal/cmd/security-group/create/create_test.go @@ -227,7 +227,7 @@ func TestBuildRequest(t *testing.T) { model.Labels = nil }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateSecurityGroupRequest) { - *request = request.CreateSecurityGroupPayload(iaas.CreateSecurityGroupPayload{ + *request = (*request).CreateSecurityGroupPayload(iaas.CreateSecurityGroupPayload{ Description: &testDescription, Labels: nil, Name: &testName, @@ -241,7 +241,7 @@ func TestBuildRequest(t *testing.T) { model.Stateful = utils.Ptr(false) }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateSecurityGroupRequest) { - *request = request.CreateSecurityGroupPayload(iaas.CreateSecurityGroupPayload{ + *request = (*request).CreateSecurityGroupPayload(iaas.CreateSecurityGroupPayload{ Description: &testDescription, Labels: utils.Ptr(toStringAnyMapPtr(testLabels)), Name: &testName, diff --git a/internal/cmd/security-group/list/list_test.go b/internal/cmd/security-group/list/list_test.go index a78e3501a..bade91812 100644 --- a/internal/cmd/security-group/list/list_test.go +++ b/internal/cmd/security-group/list/list_test.go @@ -178,7 +178,7 @@ func TestBuildRequest(t *testing.T) { model.LabelSelector = utils.Ptr("") }), expectedRequest: fixtureRequest(func(request *iaas.ApiListSecurityGroupsRequest) { - *request = request.LabelSelector("") + *request = (*request).LabelSelector("") }), }, { @@ -187,7 +187,7 @@ func TestBuildRequest(t *testing.T) { model.LabelSelector = utils.Ptr("foo=bar") }), expectedRequest: fixtureRequest(func(request *iaas.ApiListSecurityGroupsRequest) { - *request = request.LabelSelector("foo=bar") + *request = (*request).LabelSelector("foo=bar") }), }, } diff --git a/internal/cmd/security-group/update/update_test.go b/internal/cmd/security-group/update/update_test.go index 3bc10055a..1d89a9e48 100644 --- a/internal/cmd/security-group/update/update_test.go +++ b/internal/cmd/security-group/update/update_test.go @@ -268,7 +268,7 @@ func TestBuildRequest(t *testing.T) { model.Labels = nil }), expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateSecurityGroupRequest) { - *request = request.UpdateSecurityGroupPayload(iaas.UpdateSecurityGroupPayload{ + *request = (*request).UpdateSecurityGroupPayload(iaas.UpdateSecurityGroupPayload{ Description: &testDescription, Labels: nil, Name: &testName, diff --git a/internal/cmd/server/reboot/reboot_test.go b/internal/cmd/server/reboot/reboot_test.go index 77e99f506..cfcda6783 100644 --- a/internal/cmd/server/reboot/reboot_test.go +++ b/internal/cmd/server/reboot/reboot_test.go @@ -199,7 +199,7 @@ func TestBuildRequest(t *testing.T) { model.HardReboot = true }), expectedRequest: fixtureRequest(func(request *iaas.ApiRebootServerRequest) { - *request = request.Action("hard") + *request = (*request).Action("hard") }), }, } diff --git a/internal/pkg/services/load-balancer/utils/utils_test.go b/internal/pkg/services/load-balancer/utils/utils_test.go index e33fd75b8..5941b2c93 100644 --- a/internal/pkg/services/load-balancer/utils/utils_test.go +++ b/internal/pkg/services/load-balancer/utils/utils_test.go @@ -56,7 +56,7 @@ func (m *loadBalancerClientMocked) ListLoadBalancersExecute(_ context.Context, _ } func (m *loadBalancerClientMocked) UpdateTargetPool(_ context.Context, _, _, _, _ string) loadbalancer.ApiUpdateTargetPoolRequest { - return loadbalancer.ApiUpdateTargetPoolRequest{} + return loadbalancer.UpdateTargetPoolRequest{} } func fixtureLoadBalancer(mods ...func(*loadbalancer.LoadBalancer)) *loadbalancer.LoadBalancer { From c944b623a708bef4a1492912c8cd7b47f3672981 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 19:04:05 +0200 Subject: [PATCH 022/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/core (#765) Bumps [github.com/stackitcloud/stackit-sdk-go/core](https://github.com/stackitcloud/stackit-sdk-go) from 0.17.1 to 0.17.2. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.17.1...core/v0.17.2) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/core dependency-version: 0.17.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index da11cae93..083a9ff21 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 - github.com/stackitcloud/stackit-sdk-go/core v0.17.1 + github.com/stackitcloud/stackit-sdk-go/core v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 diff --git a/go.sum b/go.sum index 60169ba09..b6ec7f43d 100644 --- a/go.sum +++ b/go.sum @@ -562,8 +562,8 @@ github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.17.1 h1:TTrVoB1lERd/qfWzpe6HpwCJSjtaGnUI7UE7ITb5IT0= -github.com/stackitcloud/stackit-sdk-go/core v0.17.1/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= +github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= +github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0 h1:l53lihnLUbAORdQPoUL2NlczWfeXfW5gHhoAIPsqGfI= github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= From c97358d37e0ad47a1196685942b7584bee6730d8 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 27 May 2025 09:43:56 +0200 Subject: [PATCH 023/422] chore(deps): update renovatebot/github-action action to v42.0.4 (#768) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 9c914fc30..fad54ed06 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v42.0.3 + uses: renovatebot/github-action@v42.0.4 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 763c365dc46c54b24b93e03f851c74504e793182 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 May 2025 09:44:27 +0200 Subject: [PATCH 024/422] chore(deps): bump renovatebot/github-action from 42.0.3 to 42.0.4 (#767) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 42.0.3 to 42.0.4. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v42.0.3...v42.0.4) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 42.0.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From 9af83eb2358fc4f6bbf19f6fc88a10cba620e07d Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 30 May 2025 10:40:37 +0200 Subject: [PATCH 025/422] fix(deps): update module github.com/goccy/go-yaml to v1.18.0 (#772) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 083a9ff21..6443731c8 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.24 require ( github.com/fatih/color v1.18.0 - github.com/goccy/go-yaml v1.17.1 + github.com/goccy/go-yaml v1.18.0 github.com/golang-jwt/jwt/v5 v5.2.2 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index b6ec7f43d..bee34c2e2 100644 --- a/go.sum +++ b/go.sum @@ -213,8 +213,8 @@ github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUW github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.17.1 h1:LI34wktB2xEE3ONG/2Ar54+/HJVBriAGJ55PHls4YuY= -github.com/goccy/go-yaml v1.17.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= From 178938c8ff48db33c2a02e6aa4be536afe12e27b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 10:41:00 +0200 Subject: [PATCH 026/422] chore(deps): bump github.com/goccy/go-yaml from 1.17.1 to 1.18.0 (#771) Bumps [github.com/goccy/go-yaml](https://github.com/goccy/go-yaml) from 1.17.1 to 1.18.0. - [Release notes](https://github.com/goccy/go-yaml/releases) - [Changelog](https://github.com/goccy/go-yaml/blob/master/CHANGELOG.md) - [Commits](https://github.com/goccy/go-yaml/compare/v1.17.1...v1.18.0) --- updated-dependencies: - dependency-name: github.com/goccy/go-yaml dependency-version: 1.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> From d9564a888641fa34a4677f0d7b88eb9c381cd32e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 08:51:52 +0000 Subject: [PATCH 027/422] chore(deps): bump github.com/lmittmann/tint from 1.1.0 to 1.1.1 (#769) Bumps [github.com/lmittmann/tint](https://github.com/lmittmann/tint) from 1.1.0 to 1.1.1. - [Release notes](https://github.com/lmittmann/tint/releases) - [Commits](https://github.com/lmittmann/tint/compare/v1.1.0...v1.1.1) --- updated-dependencies: - dependency-name: github.com/lmittmann/tint dependency-version: 1.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6443731c8..3b1bfcf65 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf github.com/jedib0t/go-pretty/v6 v6.6.7 - github.com/lmittmann/tint v1.1.0 + github.com/lmittmann/tint v1.1.1 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 diff --git a/go.sum b/go.sum index bee34c2e2..4fedc90e9 100644 --- a/go.sum +++ b/go.sum @@ -400,8 +400,8 @@ github.com/ldez/usetesting v0.4.3 h1:pJpN0x3fMupdTf/IapYjnkhiY1nSTN+pox1/GyBRw3k github.com/ldez/usetesting v0.4.3/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lmittmann/tint v1.1.0 h1:0hDmvuGv3U+Cep/jHpPxwjrCFjT6syam7iY7nTmA7ug= -github.com/lmittmann/tint v1.1.0/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/lmittmann/tint v1.1.1 h1:xmmGuinUsCSxWdwH1OqMUQ4tzQsq3BdjJLAAmVKJ9Dw= +github.com/lmittmann/tint v1.1.1/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= From b31f6328a831a70e83a93575a9d33670f77fa79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 3 Jun 2025 14:28:51 +0200 Subject: [PATCH 028/422] feat(ci): add check for goreleaser configuration (#766) --- .github/workflows/ci.yaml | 12 ++++++++++++ .goreleaser.yaml | 8 ++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 66c094cd5..239a463dc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,3 +25,15 @@ jobs: - name: Test run: make test + + config: + name: Check GoReleaser config + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Check GoReleaser + uses: goreleaser/goreleaser-action@v6 + with: + args: check \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 6e766acc7..01e963403 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -45,10 +45,10 @@ builds: ' archives: - - format: tar.gz + - formats: [ 'tar.gz' ] format_overrides: - goos: windows - format: zip + formats: [ 'zip' ] release: # If set to auto, the GitHub release will be marked as "Pre-release" @@ -66,7 +66,7 @@ changelog: nfpms: - id: linux-packages # IDs of the builds for which to create packages for - builds: + ids: - linux-builds package_name: stackit vendor: STACKIT @@ -114,7 +114,7 @@ brews: snapcrafts: # IDs of the builds for which to create packages for - - builds: + - ids: - linux-builds # The name of the snap name: stackit From f26bc5de893f5a2f9175ce48224f60fe3e9e7ed7 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 5 Jun 2025 08:27:13 +0200 Subject: [PATCH 029/422] fix(deps): update stackit sdk modules (#779) Co-authored-by: Renovate Bot --- go.mod | 34 ++++++++++++++--------------- go.sum | 68 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index 3b1bfcf65..73689825e 100644 --- a/go.mod +++ b/go.mod @@ -16,22 +16,22 @@ require ( github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.2 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 + github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.15.0 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.0 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.24.0 @@ -236,13 +236,13 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/go.sum b/go.sum index 4fedc90e9..66574ce96 100644 --- a/go.sum +++ b/go.sum @@ -564,52 +564,52 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0 h1:l53lihnLUbAORdQPoUL2NlczWfeXfW5gHhoAIPsqGfI= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.0/go.mod h1:IYXv5QX/LEYfF02eN1/1KKo979yPewWhrbhpRnG2yOg= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.1 h1:9IS0yj2ooxzwz9Lb2UtdLrz+Cnn4ckPsebMGuCDKbag= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.1/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 h1:GQAA9gqhKN0ZRc1vRYURHeVjSghh+iF+5DK0HdeuakI= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 h1:s0A2EPBrnBxfKStKA/B1izbyYHw/0m2RdqN3Inkv9hI= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 h1:+7iIR5r2epGNkAcuERX4kEg1H8hz2yR9+/zLYqZR7Xk= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+XZRs8yWw8YMVw+HfjcuMhieR4= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0 h1:3D34kZSosO25ydqUz72y8sg6yigthKf35DO8SFUyzFU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.0 h1:gaTgjmEIvq7Nmji5YHh1haFvA/8dWyOgCg3lw6drjL4= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.0/go.mod h1:h3oM6cS23Yfynp8Df1hNr0FxtY5Alii/2g8Wqi5SIVE= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0 h1:5J2TH9ig5cp+5pCHugrsDJuFsRnIOQHQUqsxlweRXL0= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.0/go.mod h1:+3jizYma6Dq3XVn6EMMdSBF9eIm0w6hCJvrStB3AIL0= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0 h1:t/Ten9AuoWFmrDq5gAI3kVZShF3i8zEAaeBsYYqiaao= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.0/go.mod h1:qgvi3qiAzB1wKpMJ5CPnEaUToeiwgnQxGvlkjdisaLU= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1 h1:AN8rN13biq3vcJzi2GqGLx84AsuMdnBlPgQj1i83Lmo= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs4xt/7Jj4LBe+JsSdHy+Md2ynUg4Y= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 h1:7nN7ZCuWSbJMy5KqoOqSbp5JKIOvyuDqVRtxVvT1iyE= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 h1:TWz7qJ4Mg5pquDXODSZ1dzhS95ZYn3w1aKjuRU2VqCg= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 h1:+dKIPVz9ydKbX3x6+1NvYk++OA378w74p+N6SjDmzBQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.0 h1:TMHTJvVZj2Ne0tBgKxeSB5kUVP0dx3WQ2YZhbSIMp0E= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.0/go.mod h1:1gMNjPCqT868oIqdWGkiReS1G/qpM4bYKYBmDRi8sqg= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 h1:/OaZCyrD8LFa4W6a2Vu2QSVMJwLLBr8ZdBKzX00MV1Q= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 h1:6OObzh2zk7wg75zYstcj0kjOjaxWc4joqA6qdeo8DP4= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 h1:E6vCqPn1NiPHnbnvqLNQNz6a/cmeyRb5iA9cDUPtP58= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 h1:r29a9GoBLVw2VZSzdPftlIsE5t7shdxobwoT6NVUIjU= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0 h1:YEfhKt3T25uY7vs8QcAPfdTs1GLil0BcrLCJ5RhMyR0= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.0/go.mod h1:9JoCgKe2IKmawcuAYIuxrAMMb6pk5XiY80Z3sU7IWy0= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0 h1:FZdQwBKyW86l1EwiEUSDsAfhF9si337kNAnagz9ND6A= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.0/go.mod h1:mID7cr40WzI4wdvveYhLzvkk+zPfolfo5+VcDGo5slU= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.15.0 h1:lFxbZmcD+YyMVN35k2UxCpGoqhR+FyfgaOEcdWSOrwQ= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.15.0/go.mod h1:Picm0mP7TUBTAu+MzWtedz61LczMnWH4ghPjwB/g5DE= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.0 h1:fMtKiC1VwABJXckRTyxLWWMDCNrbVdpCwQ63aBKgR5k= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.0/go.mod h1:qId86UiowpDDs0L+mstdzz3xXtnW+R56wh7q8CQltb4= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 h1:2rDFwJtZOFYFUiJqJ9uIwM+mu+BbtuVaUHARRJtrZPU= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1/go.mod h1:YL0l9l9xzJy2BmV+U9XkcXlQaHbE2KyA37GpGvBXIJ4= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1 h1:4H+GL4eLEO116Vlh0pe+udGGYnMohA8YhLW9KYGdEOc= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1/go.mod h1:PAQH8+1DDGc6uibvC3nDtfRLu8uxutIr25mPJvrCOy8= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 h1:y8QUHaEdprQJ3VJgOpTVT1nOyTByKsw6k6ccQBoe1wo= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0/go.mod h1:TBvZpbCju0Zmq8GoS4CEtUg2MqtdqWrGeEAOXwkJNQo= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1 h1:CjlTuoLg1qlAQt+/5a2ElnyEx/Zf1j7j61OJykKfdIM= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 h1:oGR3wRC0xfX2Itpwbh/SrT/k2fnmMSzvy2U9U2lDQPs= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.0 h1:h3tF+yBqrFeRpvyeeGTM33ExA/YYbjwfKYvuZj7gQyM= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.0/go.mod h1:j2GV/ePXEccwq0WV7DtmKpsZcJ2X45Be3D4oAlJdddo= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.1 h1:0Kro/2d0GnqhOFTYq/4r9HwjZB/aT2erC1nyNmI0lnk= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.1/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 h1:WJA2v8XCISdrcbnJXstsjVE+QAFVsDpfJHNp0ORe1Bc= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0 h1:rgSKhgnybB3vrAKAafnuOLjyhn4LtxUxvmgmi810N3U= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.0/go.mod h1:e3WMlYcUZZ5bpndWuCrxEQqIOPsYPuus9O/EG2eIfG4= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.0 h1:7CETDuCaEkA+YDbje6jaWhWO8w05lVxELTs93he9YG8= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.0/go.mod h1:TYWEik7b2aJrCJrRWU3mn1p1hmShCwizRthT3xl6z0o= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.0 h1:VuX2xLDdPeeXH2+E4FPnTRxGXu68cI62titv4W1V5ic= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.0/go.mod h1:nJTJ3qT2xHmOs2aqQgBPfOLp322gE9pvpRaluTlRmN8= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1 h1:01AIQQtHdJ96La6BPVTRp6SLiGe5LXF+JmDKXbt4ZX0= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1TsWatlsexLeKdkb3L8chcxaXJOy/cLXctsRxhb4xg= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1 h1:X1Q/uHa7voS8mrZZYeJm8TWJ7bW78OMIsHXDd+IB79M= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 h1:WvPLO1c7oT/MWmCRTt7jRyxus2g3DIluIW5iAsUpSFM= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From d23703f3f9b6dcafa096bd717200e625273132f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 17:20:22 +0200 Subject: [PATCH 030/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#781) Bumps [github.com/stackitcloud/stackit-sdk-go/services/iaas](https://github.com/stackitcloud/stackit-sdk-go) from 0.23.0 to 0.24.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.23.0...services/ske/v0.24.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/iaas dependency-version: 0.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 73689825e..37aae7089 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 diff --git a/go.sum b/go.sum index 66574ce96..fb577f0c0 100644 --- a/go.sum +++ b/go.sum @@ -572,8 +572,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 h1:+7iIR5r2epGNkAcuE github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+XZRs8yWw8YMVw+HfjcuMhieR4= github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0 h1:3D34kZSosO25ydqUz72y8sg6yigthKf35DO8SFUyzFU= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.23.0/go.mod h1:QNH50Pq0Hu21lLDOwa02PIjRjTl0LfEdHoz5snGQRn8= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0/go.mod h1:TaMx7kukGpRm0BkNCmS7u2x12q1pgfbD55DAnLIjOIQ= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1 h1:AN8rN13biq3vcJzi2GqGLx84AsuMdnBlPgQj1i83Lmo= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs4xt/7Jj4LBe+JsSdHy+Md2ynUg4Y= From 6c8da29b73fbd3ec7a5770f00219ee0551c19b29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 15:28:01 +0000 Subject: [PATCH 031/422] chore(deps): bump golang.org/x/mod from 0.24.0 to 0.25.0 (#780) Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.24.0 to 0.25.0. - [Commits](https://github.com/golang/mod/compare/v0.24.0...v0.25.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.25.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 37aae7089..83d1c3a8f 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.24.0 + golang.org/x/mod v0.25.0 golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.32.0 golang.org/x/text v0.25.0 diff --git a/go.sum b/go.sum index fb577f0c0..5c27f0587 100644 --- a/go.sum +++ b/go.sum @@ -752,8 +752,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 6dde93a18c77e777234d90bb2a5083728f01474b Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 6 Jun 2025 13:18:27 +0200 Subject: [PATCH 032/422] fix(deps): update module golang.org/x/text to v0.26.0 (#784) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 83d1c3a8f..76f2bebba 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( golang.org/x/mod v0.25.0 golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.32.0 - golang.org/x/text v0.25.0 + golang.org/x/text v0.26.0 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 ) @@ -206,7 +206,7 @@ require ( go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/sync v0.14.0 // indirect + golang.org/x/sync v0.15.0 // indirect golang.org/x/tools v0.33.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 5c27f0587..337a68c44 100644 --- a/go.sum +++ b/go.sum @@ -819,8 +819,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -896,8 +896,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 507e45a8156432acc19944f671e1ccb0f89576f6 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 6 Jun 2025 13:34:51 +0200 Subject: [PATCH 033/422] chore(deps): update module golang.org/x/tools to v0.34.0 (#783) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 76f2bebba..5d7f96d18 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( ) require ( - golang.org/x/net v0.40.0 // indirect + golang.org/x/net v0.41.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -207,7 +207,7 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.15.0 // indirect - golang.org/x/tools v0.33.0 // indirect + golang.org/x/tools v0.34.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.6.1 // indirect diff --git a/go.sum b/go.sum index 337a68c44..28c2201a4 100644 --- a/go.sum +++ b/go.sum @@ -794,8 +794,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -961,8 +961,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= 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= From 833ff47953e6f3a4564b99174ba50ccc16d6878e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 10 Jun 2025 09:11:50 +0200 Subject: [PATCH 034/422] fix(deps): update module github.com/lmittmann/tint to v1.1.2 (#785) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5d7f96d18..f5f9b909b 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf github.com/jedib0t/go-pretty/v6 v6.6.7 - github.com/lmittmann/tint v1.1.1 + github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.6 diff --git a/go.sum b/go.sum index 28c2201a4..2ea97887b 100644 --- a/go.sum +++ b/go.sum @@ -400,8 +400,8 @@ github.com/ldez/usetesting v0.4.3 h1:pJpN0x3fMupdTf/IapYjnkhiY1nSTN+pox1/GyBRw3k github.com/ldez/usetesting v0.4.3/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lmittmann/tint v1.1.1 h1:xmmGuinUsCSxWdwH1OqMUQ4tzQsq3BdjJLAAmVKJ9Dw= -github.com/lmittmann/tint v1.1.1/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w= +github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= From 9e00bf9f253db61b0f72dc4a2df15f8f425293c2 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 11 Jun 2025 10:27:39 +0200 Subject: [PATCH 035/422] chore(deps): update renovatebot/github-action action to v42.0.5 (#788) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index fad54ed06..a51dda518 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v42.0.4 + uses: renovatebot/github-action@v42.0.5 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 81fefcd1ffe6e41ab1859e71005b38dc9ccf8492 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:24:36 +0200 Subject: [PATCH 036/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#792) Bumps [github.com/stackitcloud/stackit-sdk-go/services/loadbalancer](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.2.1...services/loadbalancer/v1.3.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/loadbalancer dependency-version: 1.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f5f9b909b..608303720 100644 --- a/go.mod +++ b/go.mod @@ -236,7 +236,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 diff --git a/go.sum b/go.sum index 2ea97887b..79b6f3d73 100644 --- a/go.sum +++ b/go.sum @@ -574,8 +574,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+ github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0/go.mod h1:TaMx7kukGpRm0BkNCmS7u2x12q1pgfbD55DAnLIjOIQ= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1 h1:AN8rN13biq3vcJzi2GqGLx84AsuMdnBlPgQj1i83Lmo= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.2.1/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.3.0 h1:ELclQQLM8pd/60WNC506XeECwu5GupIldvvJOqwZvGw= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.3.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs4xt/7Jj4LBe+JsSdHy+Md2ynUg4Y= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 h1:7nN7ZCuWSbJMy5KqoOqSbp5JKIOvyuDqVRtxVvT1iyE= From 462b064d6a2dc5f1c3826f0a2211054fa991f5b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:32:45 +0200 Subject: [PATCH 037/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#793) Bumps [github.com/stackitcloud/stackit-sdk-go/services/ske](https://github.com/stackitcloud/stackit-sdk-go) from 0.24.1 to 0.25.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.24.1...services/ske/v0.25.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/ske dependency-version: 0.25.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 608303720..abc9ade22 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.25.0 diff --git a/go.sum b/go.sum index 79b6f3d73..2487a8862 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1 h1:01AIQQt github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1TsWatlsexLeKdkb3L8chcxaXJOy/cLXctsRxhb4xg= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1 h1:X1Q/uHa7voS8mrZZYeJm8TWJ7bW78OMIsHXDd+IB79M= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.24.1/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.25.0 h1:9ufUW3J/d29TizLd32Kt4b+4RUN1FRod9Q3X1HbTg58= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.25.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 h1:WvPLO1c7oT/MWmCRTt7jRyxus2g3DIluIW5iAsUpSFM= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From 2c00ad0eea0e3e1d09c2fbb60be05c1ee4d4254b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:52:21 +0200 Subject: [PATCH 038/422] fix(cli): List mongodb storages returns empty result (#778) --- internal/cmd/mongodbflex/options/options.go | 2 +- internal/cmd/postgresflex/options/options.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 10e9f6f5c..55ad63408 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -225,7 +225,7 @@ func outputResultAsTable(p *print.Printer, model *inputModel, options *options) if model.Versions && len(*options.Versions) != 0 { content = append(content, buildVersionsTable(*options.Versions)) } - if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) == 0 { + if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) > 0 { content = append(content, buildStoragesTable(*options.Storages.Storages)) } diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index 8a3bd6287..c327e030b 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -222,7 +222,7 @@ func outputResultAsTable(p *print.Printer, model inputModel, options *options) e if model.Versions && len(*options.Versions) != 0 { content = append(content, buildVersionsTable(*options.Versions)) } - if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) == 0 { + if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) > 0 { content = append(content, buildStoragesTable(*options.Storages.Storages)) } From 472ff267cdef810d84817df5b4db020334c375fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Fri, 13 Jun 2025 12:48:00 +0200 Subject: [PATCH 039/422] refactor(cli): add ConvertStringMapToInterfaceMap util function (#790) --- internal/cmd/image/create/create.go | 10 +- internal/cmd/image/update/update.go | 11 +-- internal/cmd/key-pair/create/create.go | 11 +-- internal/cmd/key-pair/update/update.go | 10 +- internal/cmd/network-area/create/create.go | 11 +-- .../cmd/network-area/route/create/create.go | 11 +-- .../cmd/network-area/route/update/update.go | 8 +- internal/cmd/network-area/update/update.go | 11 +-- .../cmd/network-interface/create/create.go | 12 +-- .../cmd/network-interface/update/update.go | 12 +-- internal/cmd/network/create/create.go | 11 +-- internal/cmd/network/update/update.go | 11 +-- internal/cmd/public-ip/create/create.go | 11 +-- internal/cmd/public-ip/update/update.go | 11 +-- internal/cmd/security-group/create/create.go | 10 +- internal/cmd/security-group/update/update.go | 10 +- internal/cmd/server/create/create.go | 10 +- internal/cmd/server/update/update.go | 11 +-- internal/pkg/utils/utils.go | 15 +++ internal/pkg/utils/utils_test.go | 99 +++++++++++++++++++ 20 files changed, 133 insertions(+), 173 deletions(-) diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 930811f51..d25c6adc4 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -340,18 +340,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func createPayload(_ context.Context, model *inputModel) iaas.CreateImagePayload { - var labelsMap *map[string]any - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } payload := iaas.CreateImagePayload{ DiskFormat: &model.DiskFormat, Name: &model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), MinDiskSize: model.MinDiskSize, MinRam: model.MinRam, Protected: model.Protected, diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index e46e90790..02cd034fb 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -243,17 +243,10 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateImageRequest { request := apiClient.UpdateImage(ctx, model.ProjectId, model.Id) payload := iaas.NewUpdateImagePayload() - var labelsMap *map[string]any - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } + // Config *ImageConfig `json:"config,omitempty"` payload.DiskFormat = model.DiskFormat - payload.Labels = labelsMap + payload.Labels = utils.ConvertStringMapToInterfaceMap(model.Labels) payload.MinDiskSize = model.MinDiskSize payload.MinRam = model.MinRam payload.Name = model.Name diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index 5c4fb9196..a95ee34ec 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -124,18 +124,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateKeyPairRequest { req := apiClient.CreateKeyPair(ctx) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.CreateKeyPairPayload{ Name: model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), PublicKey: model.PublicKey, } diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index c34c1362b..b8b7ffbbd 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -87,16 +87,8 @@ func configureFlags(cmd *cobra.Command) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateKeyPairRequest { req := apiClient.UpdateKeyPair(ctx, *model.KeyPairName) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } payload := iaas.UpdateKeyPairPayload{ - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } return req.UpdateKeyPairPayload(payload) } diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 0bc3ae47a..870e6a439 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -172,18 +172,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } } - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.CreateNetworkAreaPayload{ Name: model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), AddressFamily: &iaas.CreateAreaAddressFamily{ Ipv4: &iaas.CreateAreaIPv4{ DefaultNameservers: model.DnsNameServers, diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 4cd29e663..781a4c3d0 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -147,21 +147,12 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRouteRequest { req := apiClient.CreateNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.CreateNetworkAreaRoutePayload{ Ipv4: &[]iaas.Route{ { Prefix: model.Prefix, Nexthop: model.Nexthop, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), }, }, } diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index 1fb9f13f6..2866508b2 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -130,14 +130,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateNetworkAreaRouteRequest { req := apiClient.UpdateNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.RouteId) - // convert map[string]string to map[string]interface{} - labelsMap := make(map[string]interface{}) - for k, v := range *model.Labels { - labelsMap[k] = v - } - payload := iaas.UpdateNetworkAreaRoutePayload{ - Labels: &labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } req = req.UpdateNetworkAreaRoutePayload(payload) diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 122e94f33..0cc0e2e1e 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -153,18 +153,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiPartialUpdateNetworkAreaRequest { req := apiClient.PartialUpdateNetworkArea(ctx, *model.OrganizationId, model.AreaId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.PartialUpdateNetworkAreaPayload{ Name: model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), AddressFamily: &iaas.UpdateAreaAddressFamily{ Ipv4: &iaas.UpdateAreaIPv4{ DefaultNameservers: model.DnsNameServers, diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index f1024f844..f96687591 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -207,21 +207,11 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNicRequest { req := apiClient.CreateNic(ctx, model.ProjectId, *model.NetworkId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - convertedMap := make(map[string]interface{}, len(*model.Labels)) - for k, v := range *model.Labels { - convertedMap[k] = v - } - labelsMap = &convertedMap - } - payload := iaas.CreateNicPayload{ AllowedAddresses: model.AllowedAddresses, Ipv4: model.Ipv4, Ipv6: model.Ipv6, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), Name: model.Name, NicSecurity: model.NicSecurity, SecurityGroups: model.SecurityGroups, diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index e92c5b8be..92b3e02ab 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -199,19 +199,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateNicRequest { req := apiClient.UpdateNic(ctx, model.ProjectId, *model.NetworkId, model.NicId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - convertedMap := make(map[string]interface{}, len(*model.Labels)) - for k, v := range *model.Labels { - convertedMap[k] = v - } - labelsMap = &convertedMap - } - payload := iaas.UpdateNicPayload{ AllowedAddresses: model.AllowedAddresses, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), Name: model.Name, NicSecurity: model.NicSecurity, SecurityGroups: model.SecurityGroups, diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 08e4e20b2..ce5871590 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -229,15 +229,6 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } } - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - routed := true if model.NonRouted { routed = false @@ -245,7 +236,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli payload := iaas.CreateNetworkPayload{ Name: model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), Routed: &routed, } diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 22a8cf87a..712342cfc 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -179,15 +179,6 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli req := apiClient.PartialUpdateNetwork(ctx, model.ProjectId, model.NetworkId) addressFamily := &iaas.UpdateNetworkAddressFamily{} - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - if model.IPv6DnsNameServers != nil || model.NoIPv6Gateway || model.IPv6Gateway != nil { addressFamily.Ipv6 = &iaas.UpdateNetworkIPv6Body{ Nameservers: model.IPv6DnsNameServers, @@ -214,7 +205,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli payload := iaas.PartialUpdateNetworkPayload{ Name: model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } if addressFamily.Ipv4 != nil || addressFamily.Ipv6 != nil { diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 68252751f..9d29b78d2 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -126,18 +126,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreatePublicIPRequest { req := apiClient.CreatePublicIP(ctx, model.ProjectId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.CreatePublicIPPayload{ NetworkInterface: iaas.NewNullableString(model.AssociatedResourceId), - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } return req.CreatePublicIPPayload(payload) diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index 939b91ccf..78ae5d13e 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -130,17 +130,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdatePublicIPRequest { req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.PublicIpId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.UpdatePublicIPPayload{ - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } return req.UpdatePublicIPPayload(payload) diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 54f521d26..5bce0c52b 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -127,17 +127,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateSecurityGroupRequest { request := apiClient.CreateSecurityGroup(ctx, model.ProjectId) - var labelsMap *map[string]any - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } payload := iaas.CreateSecurityGroupPayload{ Description: model.Description, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), Name: model.Name, Stateful: model.Stateful, } diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index 083470467..487dca9e0 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -135,15 +135,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli request := apiClient.UpdateSecurityGroup(ctx, model.ProjectId, model.SecurityGroupId) payload := iaas.NewUpdateSecurityGroupPayload() payload.Description = model.Description - var labelsMap *map[string]any - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload.Labels = labelsMap + payload.Labels = utils.ConvertStringMapToInterfaceMap(model.Labels) payload.Name = model.Name request = request.UpdateSecurityGroupPayload(*payload) diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 33b20c247..882c971cb 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -281,14 +281,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateServerRequest { req := apiClient.CreateServer(ctx, model.ProjectId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } var userData *[]byte if model.UserData != nil { @@ -307,7 +299,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli ServiceAccountMails: model.ServiceAccountMails, UserData: userData, Volumes: model.Volumes, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } if model.BootVolumePerformanceClass != nil || model.BootVolumeSize != nil || model.BootVolumeDeleteOnTermination != nil || model.BootVolumeSourceId != nil || model.BootVolumeSourceType != nil { diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index 7d4c56241..bc6f821a1 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -129,18 +129,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateServerRequest { req := apiClient.UpdateServer(ctx, model.ProjectId, model.ServerId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.UpdateServerPayload{ Name: model.Name, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } return req.UpdateServerPayload(payload) diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index 7aff6e713..a26d7b4b2 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -129,3 +129,18 @@ func Base64Encode(message []byte) string { func UserAgentConfigOption(cliVersion string) sdkConfig.ConfigurationOption { return sdkConfig.WithUserAgent(fmt.Sprintf("stackit-cli/%s", cliVersion)) } + +// ConvertStringMapToInterfaceMap converts a map[string]string to a pointer to map[string]interface{}. +// Returns nil if the input map is empty. +// +//nolint:gocritic // Linter wants to have a non-pointer type for the map, but this would mean a nil check has to be done before every usage of this func. +func ConvertStringMapToInterfaceMap(m *map[string]string) *map[string]interface{} { + if m == nil || len(*m) == 0 { + return nil + } + result := make(map[string]interface{}, len(*m)) + for k, v := range *m { + result[k] = v + } + return &result +} diff --git a/internal/pkg/utils/utils_test.go b/internal/pkg/utils/utils_test.go index 894f4f2e2..86588bad8 100644 --- a/internal/pkg/utils/utils_test.go +++ b/internal/pkg/utils/utils_test.go @@ -149,3 +149,102 @@ func TestUserAgentConfigOption(t *testing.T) { }) } } + +func TestConvertStringMapToInterfaceMap(t *testing.T) { + tests := []struct { + name string + input *map[string]string + expected *map[string]interface{} + }{ + { + name: "nil input", + input: nil, + expected: nil, + }, + { + name: "empty map", + input: &map[string]string{}, + expected: nil, + }, + { + name: "single key-value pair", + input: &map[string]string{ + "key1": "value1", + }, + expected: &map[string]interface{}{ + "key1": "value1", + }, + }, + { + name: "multiple key-value pairs", + input: &map[string]string{ + "key1": "value1", + "key2": "value2", + "key3": "value3", + }, + expected: &map[string]interface{}{ + "key1": "value1", + "key2": "value2", + "key3": "value3", + }, + }, + { + name: "special characters in values", + input: &map[string]string{ + "key1": "value with spaces", + "key2": "value,with,commas", + "key3": "value\nwith\nnewlines", + }, + expected: &map[string]interface{}{ + "key1": "value with spaces", + "key2": "value,with,commas", + "key3": "value\nwith\nnewlines", + }, + }, + { + name: "empty values", + input: &map[string]string{ + "key1": "", + "key2": "value2", + }, + expected: &map[string]interface{}{ + "key1": "", + "key2": "value2", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := ConvertStringMapToInterfaceMap(tt.input) + + // Check if both are nil + if result == nil && tt.expected == nil { + return + } + + // Check if one is nil and other isn't + if (result == nil && tt.expected != nil) || (result != nil && tt.expected == nil) { + t.Errorf("ConvertStringMapToInterfaceMap() = %v, want %v", result, tt.expected) + return + } + + // Compare maps + if len(*result) != len(*tt.expected) { + t.Errorf("ConvertStringMapToInterfaceMap() map length = %d, want %d", len(*result), len(*tt.expected)) + return + } + + for k, v := range *result { + expectedVal, ok := (*tt.expected)[k] + if !ok { + t.Errorf("ConvertStringMapToInterfaceMap() unexpected key %s in result", k) + continue + } + if v != expectedVal { + t.Errorf("ConvertStringMapToInterfaceMap() value for key %s = %v, want %v", k, v, expectedVal) + } + } + }) + } +} From 056ae2e7275d21d67ee85ff5ab4ef75295895e2e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 13 Jun 2025 12:54:35 +0200 Subject: [PATCH 040/422] fix(deps): update stackit sdk modules (#796) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index abc9ade22..29ef475e5 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.2 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.1 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 @@ -236,7 +236,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 diff --git a/go.sum b/go.sum index 2487a8862..3560b9d7b 100644 --- a/go.sum +++ b/go.sum @@ -564,8 +564,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.1 h1:9IS0yj2ooxzwz9Lb2UtdLrz+Cnn4ckPsebMGuCDKbag= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.4.1/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 h1:7UKUi7Od7KpuVjV4I/jUAV5NEatUomwWFd/IRODbioY= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 h1:+7iIR5r2epGNkAcuERX4kEg1H8hz2yR9+/zLYqZR7Xk= @@ -574,8 +574,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+ github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0/go.mod h1:TaMx7kukGpRm0BkNCmS7u2x12q1pgfbD55DAnLIjOIQ= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.3.0 h1:ELclQQLM8pd/60WNC506XeECwu5GupIldvvJOqwZvGw= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.3.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs4xt/7Jj4LBe+JsSdHy+Md2ynUg4Y= github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 h1:7nN7ZCuWSbJMy5KqoOqSbp5JKIOvyuDqVRtxVvT1iyE= From d3f7641e51902b1e0602ae840c289f5a79f99983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 16 Jun 2025 17:03:42 +0200 Subject: [PATCH 041/422] fix(iaas): prevent nil pointer dereference on empty volume name (#799) relates to STACKITCLI-208 --- internal/cmd/affinity-groups/delete/delete.go | 4 +- internal/cmd/image/delete/delete.go | 6 +- internal/cmd/image/update/update.go | 6 +- internal/cmd/network-area/delete/delete.go | 2 - .../cmd/network-area/describe/describe.go | 5 +- .../network-range/delete/delete.go | 2 - .../network-area/network-range/list/list.go | 6 +- .../cmd/network-area/route/create/create.go | 2 - .../cmd/network-area/route/delete/delete.go | 2 - internal/cmd/network-area/route/list/list.go | 6 +- .../cmd/network-area/route/update/update.go | 6 +- internal/cmd/server/volume/attach/attach.go | 6 +- .../cmd/server/volume/describe/describe.go | 6 +- internal/cmd/server/volume/detach/detach.go | 6 +- internal/cmd/server/volume/list/list.go | 5 +- internal/cmd/server/volume/update/update.go | 6 +- internal/cmd/volume/delete/delete.go | 10 +- internal/pkg/services/iaas/utils/utils.go | 41 ++++++- .../pkg/services/iaas/utils/utils_test.go | 113 +++++++++++++++++- 19 files changed, 173 insertions(+), 67 deletions(-) diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index eab65fd66..a05c2e7bc 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -7,7 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -93,7 +93,7 @@ func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClie func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index bfce6ae4c..10a49e46d 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -7,7 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -57,8 +57,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get image name: %v", err) imageName = model.ImageId - } else if imageName == "" { - imageName = model.ImageId } if !model.AssumeYes { @@ -87,7 +85,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index 02cd034fb..f461a388d 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -7,7 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -135,8 +135,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.WarningLevel, "cannot retrieve image name: %v", err) imageLabel = model.Id - } else if imageLabel == "" { - imageLabel = model.Id } if !model.AssumeYes { @@ -194,7 +192,7 @@ func configureFlags(cmd *cobra.Command) { func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index 9664f8305..b545fca4b 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -63,8 +63,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = model.AreaId - } else if networkAreaLabel == "" { - networkAreaLabel = model.AreaId } if !model.AssumeYes { diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index 45c2cc4dc..e086f3dd9 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -3,6 +3,7 @@ package describe import ( "context" "encoding/json" + "errors" "fmt" "strings" @@ -79,7 +80,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if model.ShowAttachedProjects { projects, err = iaasUtils.ListAttachedProjects(ctx, apiClient, *model.OrganizationId, model.AreaId) - if err != nil { + if err != nil && errors.Is(err, iaasUtils.ErrItemsNil) { + projects = []string{} + } else if err != nil { return fmt.Errorf("get attached projects: %w", err) } } diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index fb4f53de0..feec26e6b 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -61,8 +61,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId - } else if networkAreaLabel == "" { - networkAreaLabel = *model.NetworkAreaId } networkRangeLabel, err := iaasUtils.GetNetworkRangePrefix(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId, model.NetworkRangeId) if err != nil { diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index e7acd42e8..e4531121f 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -8,7 +8,7 @@ import ( "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -81,8 +81,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get organization name: %v", err) networkAreaLabel = *model.NetworkAreaId - } else if networkAreaLabel == "" { - networkAreaLabel = *model.NetworkAreaId } params.Printer.Info("No network ranges found for SNA %q\n", networkAreaLabel) return nil @@ -114,7 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) if limit != nil && *limit < 1 { - return nil, &errors.FlagValidationError{ + return nil, &cliErr.FlagValidationError{ Flag: limitFlag, Details: "must be greater than 0", } diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 781a4c3d0..bc0eaf5c3 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -74,8 +74,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId - } else if networkAreaLabel == "" { - networkAreaLabel = *model.NetworkAreaId } if !model.AssumeYes { diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index 11e36eff8..114a5d11d 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -61,8 +61,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId - } else if networkAreaLabel == "" { - networkAreaLabel = *model.NetworkAreaId } if !model.AssumeYes { diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index 2c099c3f8..2ea248551 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -80,8 +80,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId - } else if networkAreaLabel == "" { - networkAreaLabel = *model.NetworkAreaId } params.Printer.Info("No static routes found for STACKIT Network Area %q\n", networkAreaLabel) return nil @@ -113,7 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) if limit != nil && *limit < 1 { - return nil, &errors.FlagValidationError{ + return nil, &cliErr.FlagValidationError{ Flag: limitFlag, Details: "must be greater than 0", } diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index 2866508b2..f644da320 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -70,8 +70,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId - } else if networkAreaLabel == "" { - networkAreaLabel = *model.NetworkAreaId } // Call API @@ -104,7 +102,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu labels := flags.FlagToStringToStringPointer(p, cmd, labelFlag) if labels == nil { - return nil, &errors.EmptyUpdateError{} + return nil, &cliErr.EmptyUpdateError{} } model := inputModel{ diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index e4c714531..00217c513 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -69,8 +69,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } else if volumeLabel == "" { - volumeLabel = model.VolumeId } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) @@ -115,7 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu volumeId := inputArgs[0] globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 5b46ced73..be160a2ca 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -69,8 +69,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } else if volumeLabel == "" { - volumeLabel = model.VolumeId } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) @@ -106,7 +104,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu volumeId := inputArgs[0] globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index d794ddcf8..ebd4fb70d 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -7,7 +7,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -59,8 +59,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } else if volumeLabel == "" { - volumeLabel = model.VolumeId } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) @@ -105,7 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu volumeId := inputArgs[0] globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index 93263daf2..1fab049e4 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -83,6 +83,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, *volumes[i].VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) + volumeLabel = "" } volumeNames = append(volumeNames, volumeLabel) } @@ -104,7 +105,7 @@ func configureFlags(cmd *cobra.Command) { func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 768643d36..3e2e4ae6b 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -65,8 +65,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId - } else if volumeLabel == "" { - volumeLabel = model.VolumeId } serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) @@ -111,7 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu volumeId := inputArgs[0] globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index 910e849b4..117c17032 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -6,7 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -57,12 +57,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel := model.VolumeId - volumeName, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) - } else if volumeName != "" { - volumeLabel = volumeName + volumeLabel = model.VolumeId } if !model.AssumeYes { @@ -107,7 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } model := inputModel{ diff --git a/internal/pkg/services/iaas/utils/utils.go b/internal/pkg/services/iaas/utils/utils.go index b3456d254..f2616a01a 100644 --- a/internal/pkg/services/iaas/utils/utils.go +++ b/internal/pkg/services/iaas/utils/utils.go @@ -2,11 +2,18 @@ package utils import ( "context" + "errors" "fmt" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +var ( + ErrResponseNil = errors.New("response is nil") + ErrNameNil = errors.New("name is nil") + ErrItemsNil = errors.New("items is nil") +) + type IaaSClient interface { GetSecurityGroupRuleExecute(ctx context.Context, projectId, securityGroupRuleId, securityGroupId string) (*iaas.SecurityGroupRule, error) GetSecurityGroupExecute(ctx context.Context, projectId, securityGroupId string) (*iaas.SecurityGroup, error) @@ -34,6 +41,10 @@ func GetSecurityGroupName(ctx context.Context, apiClient IaaSClient, projectId, resp, err := apiClient.GetSecurityGroupExecute(ctx, projectId, securityGroupId) if err != nil { return "", fmt.Errorf("get security group: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } @@ -62,6 +73,10 @@ func GetVolumeName(ctx context.Context, apiClient IaaSClient, projectId, volumeI resp, err := apiClient.GetVolumeExecute(ctx, projectId, volumeId) if err != nil { return "", fmt.Errorf("get volume: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } @@ -70,6 +85,10 @@ func GetNetworkName(ctx context.Context, apiClient IaaSClient, projectId, networ resp, err := apiClient.GetNetworkExecute(ctx, projectId, networkId) if err != nil { return "", fmt.Errorf("get network: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } @@ -78,6 +97,10 @@ func GetNetworkAreaName(ctx context.Context, apiClient IaaSClient, organizationI resp, err := apiClient.GetNetworkAreaExecute(ctx, organizationId, areaId) if err != nil { return "", fmt.Errorf("get network area: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } @@ -86,6 +109,10 @@ func ListAttachedProjects(ctx context.Context, apiClient IaaSClient, organizatio resp, err := apiClient.ListNetworkAreaProjectsExecute(ctx, organizationId, areaId) if err != nil { return nil, fmt.Errorf("list network area attached projects: %w", err) + } else if resp == nil { + return nil, ErrResponseNil + } else if resp.Items == nil { + return nil, ErrItemsNil } return *resp.Items, nil } @@ -124,9 +151,10 @@ func GetImageName(ctx context.Context, apiClient IaaSClient, projectId, imageId resp, err := apiClient.GetImageExecute(ctx, projectId, imageId) if err != nil { return "", fmt.Errorf("get image: %w", err) - } - if resp.Name == nil { - return "", nil + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } @@ -135,9 +163,10 @@ func GetAffinityGroupName(ctx context.Context, apiClient IaaSClient, projectId, resp, err := apiClient.GetAffinityGroupExecute(ctx, projectId, affinityGroupId) if err != nil { return "", fmt.Errorf("get affinity group: %w", err) - } - if resp.Name == nil { - return "", nil + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } diff --git a/internal/pkg/services/iaas/utils/utils_test.go b/internal/pkg/services/iaas/utils/utils_test.go index d62dac35c..f4375251d 100644 --- a/internal/pkg/services/iaas/utils/utils_test.go +++ b/internal/pkg/services/iaas/utils/utils_test.go @@ -186,6 +186,26 @@ func TestGetSecurityGroupName(t *testing.T) { }, wantErr: true, }, + { + name: "response is nil", + args: args{ + getInstanceResp: nil, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, + { + name: "name in response is nil", + args: args{ + getInstanceResp: &iaas.SecurityGroup{ + Name: nil, + }, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -330,6 +350,26 @@ func TestGetVolumeName(t *testing.T) { }, wantErr: true, }, + { + name: "response is nil", + args: args{ + getInstanceResp: nil, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, + { + name: "name in response is nil", + args: args{ + getInstanceResp: &iaas.Volume{ + Name: nil, + }, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -376,6 +416,26 @@ func TestGetNetworkName(t *testing.T) { }, wantErr: true, }, + { + name: "response is nil", + args: args{ + getInstanceResp: nil, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, + { + name: "name in response is nil", + args: args{ + getInstanceResp: &iaas.Network{ + Name: nil, + }, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -421,6 +481,27 @@ func TestGetNetworkAreaName(t *testing.T) { getInstanceFails: true, }, wantErr: true, + want: "", + }, + { + name: "response is nil", + args: args{ + getInstanceResp: nil, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, + { + name: "name in response is nil", + args: args{ + getInstanceResp: &iaas.NetworkArea{ + Name: nil, + }, + getInstanceFails: false, + }, + wantErr: true, + want: "", }, } for _, tt := range tests { @@ -701,10 +782,18 @@ func TestGetImageName(t *testing.T) { wantErr: true, }, { - name: "nil name", + name: "response is nil", + imageErr: false, + imageResp: nil, + want: "", + wantErr: true, + }, + { + name: "name in response is nil", imageErr: false, - imageResp: &iaas.Image{}, + imageResp: &iaas.Image{Name: nil}, want: "", + wantErr: true, }, } for _, tt := range tests { @@ -745,10 +834,22 @@ func TestGetAffinityGroupName(t *testing.T) { wantErr: true, }, { - name: "nil affinity group name", - affinityErr: false, - affinityResp: &iaas.AffinityGroup{}, - want: "", + name: "response is nil", + affinityErr: false, + affinityResp: &iaas.AffinityGroup{ + Name: nil, + }, + want: "", + wantErr: true, + }, + { + name: "affinity group name in response is nil", + affinityErr: false, + affinityResp: &iaas.AffinityGroup{ + Name: nil, + }, + want: "", + wantErr: true, }, } for _, tt := range tests { From ee4633e72c8f9260b85716f055ea78944d348099 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:22:26 +0200 Subject: [PATCH 042/422] chore(deps): bump renovatebot/github-action from 42.0.5 to 42.0.6 (#800) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 42.0.5 to 42.0.6. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v42.0.5...v42.0.6) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 42.0.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index a51dda518..27f85d5ee 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v42.0.5 + uses: renovatebot/github-action@v42.0.6 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From cf9ff846e38068c8be8abec7bc69fd8f9f42dcef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 17 Jun 2025 13:00:44 +0200 Subject: [PATCH 043/422] fix(ci): split goreleaser post hook into multiple steps (#803) --- .goreleaser.yaml | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 01e963403..99b8757e1 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -32,17 +32,22 @@ builds: - amd64 hooks: post: - - | - sh -c ' - codesign -s "{{.Env.APPLE_APPLICATION_IDENTITY}}" -f -v --options=runtime "dist/macos-builds_{{.Target}}/{{.Name}}" - codesign -vvv --deep --strict "dist/macos-builds_{{.Target}}/{{.Name}}" - ls -l "dist/macos_{{.Target}}" - hdiutil create -volname "STACKIT-CLI" -srcfolder "dist/macos-builds_{{.Target}}/{{.Name}}" -ov -format UDZO "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" - codesign -s "{{.Env.APPLE_APPLICATION_IDENTITY}}" -f -v --options=runtime "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" - xcrun notarytool submit --keychain-profile "stackit-cli" --wait --progress dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg - xcrun stapler staple "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" - spctl -a -t open --context context:primary-signature -v dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg - ' + - cmd: codesign -s "{{.Env.APPLE_APPLICATION_IDENTITY}}" -f -v --options=runtime "dist/macos-builds_{{.Target}}/{{.Name}}" + output: true + - cmd: codesign -vvv --deep --strict "dist/macos-builds_{{.Target}}/{{.Name}}" + output: true + - cmd: ls -l "dist/macos_{{.Target}}" + output: true + - cmd: hdiutil create -volname "STACKIT-CLI" -srcfolder "dist/macos-builds_{{.Target}}/{{.Name}}" -ov -format UDZO "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" + output: true + - cmd: codesign -s "{{.Env.APPLE_APPLICATION_IDENTITY}}" -f -v --options=runtime "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" + output: true + - cmd: xcrun notarytool submit --keychain-profile "stackit-cli" --wait --progress dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg + output: true + - cmd: xcrun stapler staple "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" + output: true + - cmd: spctl -a -t open --context context:primary-signature -v dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg + output: true archives: - formats: [ 'tar.gz' ] @@ -151,4 +156,4 @@ winget: base: owner: microsoft name: winget-pkgs - branch: master \ No newline at end of file + branch: master From 793ae0f6408910b522d0a7613f712c609d1c2221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:11:09 +0200 Subject: [PATCH 044/422] feat(cli): onboard iaas volume backup api (#773) relates to STACKITCLI-192 --- docs/stackit_volume.md | 1 + docs/stackit_volume_backup.md | 39 +++ docs/stackit_volume_backup_create.md | 50 +++ docs/stackit_volume_backup_delete.md | 40 +++ docs/stackit_volume_backup_describe.md | 43 +++ docs/stackit_volume_backup_list.md | 51 +++ docs/stackit_volume_backup_restore.md | 40 +++ docs/stackit_volume_backup_update.md | 45 +++ go.mod | 8 +- go.sum | 16 +- internal/cmd/volume/backup/backup.go | 36 ++ internal/cmd/volume/backup/create/create.go | 226 +++++++++++++ .../cmd/volume/backup/create/create_test.go | 309 ++++++++++++++++++ internal/cmd/volume/backup/delete/delete.go | 125 +++++++ .../cmd/volume/backup/delete/delete_test.go | 183 +++++++++++ .../cmd/volume/backup/describe/describe.go | 162 +++++++++ .../volume/backup/describe/describe_test.go | 217 ++++++++++++ internal/cmd/volume/backup/list/list.go | 202 ++++++++++++ internal/cmd/volume/backup/list/list_test.go | 233 +++++++++++++ internal/cmd/volume/backup/restore/restore.go | 138 ++++++++ .../cmd/volume/backup/restore/restore_test.go | 183 +++++++++++ internal/cmd/volume/backup/update/update.go | 168 ++++++++++ .../cmd/volume/backup/update/update_test.go | 192 +++++++++++ internal/cmd/volume/create/create.go | 11 +- internal/cmd/volume/update/update.go | 11 +- internal/cmd/volume/volume.go | 2 + internal/pkg/services/iaas/utils/utils.go | 21 ++ .../pkg/services/iaas/utils/utils_test.go | 17 + 28 files changed, 2737 insertions(+), 32 deletions(-) create mode 100644 docs/stackit_volume_backup.md create mode 100644 docs/stackit_volume_backup_create.md create mode 100644 docs/stackit_volume_backup_delete.md create mode 100644 docs/stackit_volume_backup_describe.md create mode 100644 docs/stackit_volume_backup_list.md create mode 100644 docs/stackit_volume_backup_restore.md create mode 100644 docs/stackit_volume_backup_update.md create mode 100644 internal/cmd/volume/backup/backup.go create mode 100644 internal/cmd/volume/backup/create/create.go create mode 100644 internal/cmd/volume/backup/create/create_test.go create mode 100644 internal/cmd/volume/backup/delete/delete.go create mode 100644 internal/cmd/volume/backup/delete/delete_test.go create mode 100644 internal/cmd/volume/backup/describe/describe.go create mode 100644 internal/cmd/volume/backup/describe/describe_test.go create mode 100644 internal/cmd/volume/backup/list/list.go create mode 100644 internal/cmd/volume/backup/list/list_test.go create mode 100644 internal/cmd/volume/backup/restore/restore.go create mode 100644 internal/cmd/volume/backup/restore/restore_test.go create mode 100644 internal/cmd/volume/backup/update/update.go create mode 100644 internal/cmd/volume/backup/update/update_test.go diff --git a/docs/stackit_volume.md b/docs/stackit_volume.md index c83878554..4955b6299 100644 --- a/docs/stackit_volume.md +++ b/docs/stackit_volume.md @@ -30,6 +30,7 @@ stackit volume [flags] ### SEE ALSO * [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups * [stackit volume create](./stackit_volume_create.md) - Creates a volume * [stackit volume delete](./stackit_volume_delete.md) - Deletes a volume * [stackit volume describe](./stackit_volume_describe.md) - Shows details of a volume diff --git a/docs/stackit_volume_backup.md b/docs/stackit_volume_backup.md new file mode 100644 index 000000000..f6390f385 --- /dev/null +++ b/docs/stackit_volume_backup.md @@ -0,0 +1,39 @@ +## stackit volume backup + +Provides functionality for volume backups + +### Synopsis + +Provides functionality for volume backups. + +``` +stackit volume backup [flags] +``` + +### Options + +``` + -h, --help Help for "stackit volume backup" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume](./stackit_volume.md) - Provides functionality for volumes +* [stackit volume backup create](./stackit_volume_backup_create.md) - Creates a backup from a specific source +* [stackit volume backup delete](./stackit_volume_backup_delete.md) - Deletes a backup +* [stackit volume backup describe](./stackit_volume_backup_describe.md) - Describes a backup +* [stackit volume backup list](./stackit_volume_backup_list.md) - Lists all backups +* [stackit volume backup restore](./stackit_volume_backup_restore.md) - Restores a backup +* [stackit volume backup update](./stackit_volume_backup_update.md) - Updates a backup + diff --git a/docs/stackit_volume_backup_create.md b/docs/stackit_volume_backup_create.md new file mode 100644 index 000000000..5a322f34a --- /dev/null +++ b/docs/stackit_volume_backup_create.md @@ -0,0 +1,50 @@ +## stackit volume backup create + +Creates a backup from a specific source + +### Synopsis + +Creates a backup from a specific source (volume or snapshot). + +``` +stackit volume backup create [flags] +``` + +### Examples + +``` + Create a backup from a volume + $ stackit volume backup create --source-id xxx --source-type volume + + Create a backup from a snapshot with a name + $ stackit volume backup create --source-id xxx --source-type snapshot --name my-backup + + Create a backup with labels + $ stackit volume backup create --source-id xxx --source-type volume --labels key1=value1,key2=value2 +``` + +### Options + +``` + -h, --help Help for "stackit volume backup create" + --labels stringToString Key-value string pairs as labels (default []) + --name string Name of the backup + --source-id string ID of the source from which a backup should be created + --source-type string Source type of the backup, one of ["volume" "snapshot"] +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups + diff --git a/docs/stackit_volume_backup_delete.md b/docs/stackit_volume_backup_delete.md new file mode 100644 index 000000000..5300f7854 --- /dev/null +++ b/docs/stackit_volume_backup_delete.md @@ -0,0 +1,40 @@ +## stackit volume backup delete + +Deletes a backup + +### Synopsis + +Deletes a backup by its ID. + +``` +stackit volume backup delete BACKUP_ID [flags] +``` + +### Examples + +``` + Delete a backup with ID "xxx" + $ stackit volume backup delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit volume backup delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups + diff --git a/docs/stackit_volume_backup_describe.md b/docs/stackit_volume_backup_describe.md new file mode 100644 index 000000000..dbff5e4dc --- /dev/null +++ b/docs/stackit_volume_backup_describe.md @@ -0,0 +1,43 @@ +## stackit volume backup describe + +Describes a backup + +### Synopsis + +Describes a backup by its ID. + +``` +stackit volume backup describe BACKUP_ID [flags] +``` + +### Examples + +``` + Get details of a backup with ID "xxx" + $ stackit volume backup describe xxx + + Get details of a backup with ID "xxx" in JSON format + $ stackit volume backup describe xxx --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit volume backup describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups + diff --git a/docs/stackit_volume_backup_list.md b/docs/stackit_volume_backup_list.md new file mode 100644 index 000000000..91f3ca99a --- /dev/null +++ b/docs/stackit_volume_backup_list.md @@ -0,0 +1,51 @@ +## stackit volume backup list + +Lists all backups + +### Synopsis + +Lists all backups in a project. + +``` +stackit volume backup list [flags] +``` + +### Examples + +``` + List all backups + $ stackit volume backup list + + List all backups in JSON format + $ stackit volume backup list --output-format json + + List up to 10 backups + $ stackit volume backup list --limit 10 + + List backups with specific labels + $ stackit volume backup list --label-selector key1=value1,key2=value2 +``` + +### Options + +``` + -h, --help Help for "stackit volume backup list" + --label-selector string Filter backups by labels + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups + diff --git a/docs/stackit_volume_backup_restore.md b/docs/stackit_volume_backup_restore.md new file mode 100644 index 000000000..80dc563db --- /dev/null +++ b/docs/stackit_volume_backup_restore.md @@ -0,0 +1,40 @@ +## stackit volume backup restore + +Restores a backup + +### Synopsis + +Restores a backup by its ID. + +``` +stackit volume backup restore BACKUP_ID [flags] +``` + +### Examples + +``` + Restore a backup with ID "xxx" + $ stackit volume backup restore xxx +``` + +### Options + +``` + -h, --help Help for "stackit volume backup restore" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups + diff --git a/docs/stackit_volume_backup_update.md b/docs/stackit_volume_backup_update.md new file mode 100644 index 000000000..02f86f4e8 --- /dev/null +++ b/docs/stackit_volume_backup_update.md @@ -0,0 +1,45 @@ +## stackit volume backup update + +Updates a backup + +### Synopsis + +Updates a backup by its ID. + +``` +stackit volume backup update BACKUP_ID [flags] +``` + +### Examples + +``` + Update the name of a backup with ID "xxx" + $ stackit volume backup update xxx --name new-name + + Update the labels of a backup with ID "xxx" + $ stackit volume backup update xxx --labels key1=value1,key2=value2 +``` + +### Options + +``` + -h, --help Help for "stackit volume backup update" + --labels stringToString Key-value string pairs as labels (default []) + --name string Name of the backup +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume backup](./stackit_volume_backup.md) - Provides functionality for volume backups + diff --git a/go.mod b/go.mod index 29ef475e5..c3bb00c1f 100644 --- a/go.mod +++ b/go.mod @@ -18,11 +18,11 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 - github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1 diff --git a/go.sum b/go.sum index 3560b9d7b..6bd663516 100644 --- a/go.sum +++ b/go.sum @@ -568,10 +568,10 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 h1:7UKUi7Od7KpuVjV4I/ github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1 h1:+7iIR5r2epGNkAcuERX4kEg1H8hz2yR9+/zLYqZR7Xk= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.1/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+XZRs8yWw8YMVw+HfjcuMhieR4= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 h1:GQAA9gqhKN0ZRc1vRYURHeVjSghh+iF+5DK0HdeuakI= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 h1:s0A2EPBrnBxfKStKA/B1izbyYHw/0m2RdqN3Inkv9hI= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0/go.mod h1:TaMx7kukGpRm0BkNCmS7u2x12q1pgfbD55DAnLIjOIQ= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= @@ -580,14 +580,14 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 h1:7nN7ZCuWSbJMy5KqoOqSbp5JKIOvyuDqVRtxVvT1iyE= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 h1:TWz7qJ4Mg5pquDXODSZ1dzhS95ZYn3w1aKjuRU2VqCg= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 h1:+dKIPVz9ydKbX3x6+1NvYk++OA378w74p+N6SjDmzBQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 h1:6OObzh2zk7wg75zYstcj0kjOjaxWc4joqA6qdeo8DP4= github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 h1:E6vCqPn1NiPHnbnvqLNQNz6a/cmeyRb5iA9cDUPtP58= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 h1:/OaZCyrD8LFa4W6a2Vu2QSVMJwLLBr8ZdBKzX00MV1Q= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 h1:r29a9GoBLVw2VZSzdPftlIsE5t7shdxobwoT6NVUIjU= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 h1:2rDFwJtZOFYFUiJqJ9uIwM+mu+BbtuVaUHARRJtrZPU= diff --git a/internal/cmd/volume/backup/backup.go b/internal/cmd/volume/backup/backup.go new file mode 100644 index 000000000..b7cf8b37b --- /dev/null +++ b/internal/cmd/volume/backup/backup.go @@ -0,0 +1,36 @@ +package backup + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/restore" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "backup", + Short: "Provides functionality for volume backups", + Long: "Provides functionality for volume backups.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(restore.NewCmd(params)) +} diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go new file mode 100644 index 000000000..447a3ea16 --- /dev/null +++ b/internal/cmd/volume/backup/create/create.go @@ -0,0 +1,226 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + sourceIdFlag = "source-id" + sourceTypeFlag = "source-type" + nameFlag = "name" + labelsFlag = "labels" +) + +var sourceTypeFlagOptions = []string{"volume", "snapshot"} + +type inputModel struct { + *globalflags.GlobalFlagModel + SourceID string + SourceType string + Name *string + Labels map[string]string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a backup from a specific source", + Long: "Creates a backup from a specific source (volume or snapshot).", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a backup from a volume`, + "$ stackit volume backup create --source-id xxx --source-type volume"), + examples.NewExample( + `Create a backup from a snapshot with a name`, + "$ stackit volume backup create --source-id xxx --source-type snapshot --name my-backup"), + examples.NewExample( + `Create a backup with labels`, + "$ stackit volume backup create --source-id xxx --source-type volume --labels key1=value1,key2=value2"), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + // Get source name for label (use ID if name not available) + sourceLabel := model.SourceID + if model.SourceType == "volume" { + name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, model.SourceID) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) + } else if name != "" { + sourceLabel = name + } + } else if model.SourceType == "snapshot" { + name, err := iaasutils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.SourceID) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) + } else if name != "" { + sourceLabel = name + } + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create backup from %s? (This cannot be undone)", sourceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create volume backup: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating backup") + resp, err = wait.CreateBackupWaitHandler(ctx, apiClient, model.ProjectId, *resp.Id).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for backup creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, model.Async, sourceLabel, projectLabel, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(sourceIdFlag, "", "ID of the source from which a backup should be created") + cmd.Flags().Var(flags.EnumFlag(false, "", sourceTypeFlagOptions...), sourceTypeFlag, fmt.Sprintf("Source type of the backup, one of %q", sourceTypeFlagOptions)) + cmd.Flags().String(nameFlag, "", "Name of the backup") + cmd.Flags().StringToString(labelsFlag, nil, "Key-value string pairs as labels") + + err := flags.MarkFlagsRequired(cmd, sourceIdFlag, sourceTypeFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + sourceID := flags.FlagToStringValue(p, cmd, sourceIdFlag) + if sourceID == "" { + return nil, fmt.Errorf("source-id is required") + } + + sourceType := flags.FlagToStringValue(p, cmd, sourceTypeFlag) + + name := flags.FlagToStringPointer(p, cmd, nameFlag) + labels := flags.FlagToStringToStringPointer(p, cmd, labelsFlag) + if labels == nil { + labels = &map[string]string{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SourceID: sourceID, + SourceType: sourceType, + Name: name, + Labels: *labels, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateBackupRequest { + req := apiClient.CreateBackup(ctx, model.ProjectId) + + payload := iaas.CreateBackupPayload{ + Name: model.Name, + Labels: utils.ConvertStringMapToInterfaceMap(utils.Ptr(model.Labels)), + Source: &iaas.BackupSource{ + Id: &model.SourceID, + Type: &model.SourceType, + }, + } + + return req.CreateBackupPayload(payload) +} + +func outputResult(p *print.Printer, outputFormat string, async bool, sourceLabel, projectLabel string, resp *iaas.Backup) error { + if resp == nil { + return fmt.Errorf("create backup response is empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal backup: %w", err) + } + p.Outputln(string(details)) + return nil + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal backup: %w", err) + } + p.Outputln(string(details)) + return nil + + default: + if async { + p.Outputf("Triggered backup of %s in %s. Backup ID: %s\n", sourceLabel, projectLabel, utils.PtrString(resp.Id)) + } else { + p.Outputf("Created backup of %s in %s. Backup ID: %s\n", sourceLabel, projectLabel, utils.PtrString(resp.Id)) + } + return nil + } +} diff --git a/internal/cmd/volume/backup/create/create_test.go b/internal/cmd/volume/backup/create/create_test.go new file mode 100644 index 000000000..3c4980cc6 --- /dev/null +++ b/internal/cmd/volume/backup/create/create_test.go @@ -0,0 +1,309 @@ +package create + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +const ( + testName = "my-backup" + testSourceType = "volume" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testSourceId = uuid.NewString() + testLabels = map[string]string{"key1": "value1"} +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + sourceIdFlag: testSourceId, + sourceTypeFlag: testSourceType, + nameFlag: testName, + labelsFlag: "key1=value1", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + SourceID: testSourceId, + SourceType: testSourceType, + Name: utils.Ptr(testName), + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiCreateBackupRequest)) iaas.ApiCreateBackupRequest { + request := testClient.CreateBackup(testCtx, testProjectId) + + createPayload := iaas.NewCreateBackupPayloadWithDefaults() + createPayload.Name = utils.Ptr(testName) + createPayload.Labels = &map[string]interface{}{ + "key1": "value1", + } + createPayload.Source = &iaas.BackupSource{ + Id: &testSourceId, + Type: utils.Ptr(testSourceType), + } + + request = request.CreateBackupPayload(*createPayload) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no source id", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, sourceIdFlag) + }), + isValid: false, + }, + { + description: "no source type", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, sourceTypeFlag) + }), + isValid: false, + }, + { + description: "invalid source type", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sourceTypeFlag] = "invalid" + }), + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "only required flags", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + delete(flagValues, labelsFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Name = nil + model.Labels = make(map[string]string) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiCreateBackupRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + backupId := "test-backup-id" + + type args struct { + outputFormat string + async bool + sourceLabel string + projectLabel string + backup *iaas.Backup + } + + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty backup", + args: args{}, + wantErr: true, + }, + { + name: "backup is nil", + args: args{ + backup: nil, + }, + wantErr: true, + }, + { + name: "minimal backup", + args: args{ + backup: &iaas.Backup{ + Id: &backupId, + }, + sourceLabel: "test-source", + projectLabel: "test-project", + }, + wantErr: false, + }, + { + name: "async mode", + args: args{ + backup: &iaas.Backup{ + Id: &backupId, + }, + sourceLabel: "test-source", + projectLabel: "test-project", + async: true, + }, + wantErr: false, + }, + { + name: "json output", + args: args{ + backup: &iaas.Backup{ + Id: &backupId, + }, + outputFormat: print.JSONOutputFormat, + }, + wantErr: false, + }, + { + name: "yaml output", + args: args{ + backup: &iaas.Backup{ + Id: &backupId, + }, + outputFormat: print.YAMLOutputFormat, + }, + wantErr: false, + }, + } + + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = cmd + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.sourceLabel, tt.args.projectLabel, tt.args.backup); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go new file mode 100644 index 000000000..b40d93ea7 --- /dev/null +++ b/internal/cmd/volume/backup/delete/delete.go @@ -0,0 +1,125 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + backupIdArg = "BACKUP_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + BackupId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", backupIdArg), + Short: "Deletes a backup", + Long: "Deletes a backup by its ID.", + Args: args.SingleArg(backupIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a backup with ID "xxx"`, "$ stackit volume backup delete xxx"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.BackupId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get backup name: %v", err) + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete backup %q? (This cannot be undone)", backupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete backup: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Deleting backup") + _, err = wait.DeleteBackupWaitHandler(ctx, apiClient, model.ProjectId, model.BackupId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for backup deletion: %w", err) + } + s.Stop() + } + + if model.Async { + params.Printer.Outputf("Triggered deletion of backup %q\n", backupLabel) + } else { + params.Printer.Outputf("Deleted backup %q\n", backupLabel) + } + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + backupId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + BackupId: backupId, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteBackupRequest { + req := apiClient.DeleteBackup(ctx, model.ProjectId, model.BackupId) + return req +} diff --git a/internal/cmd/volume/backup/delete/delete_test.go b/internal/cmd/volume/backup/delete/delete_test.go new file mode 100644 index 000000000..8425e9c98 --- /dev/null +++ b/internal/cmd/volume/backup/delete/delete_test.go @@ -0,0 +1,183 @@ +package delete + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testBackupId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testBackupId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + BackupId: testBackupId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiDeleteBackupRequest)) iaas.ApiDeleteBackupRequest { + request := testClient.DeleteBackup(testCtx, testProjectId, testBackupId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiDeleteBackupRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go new file mode 100644 index 000000000..f181195d9 --- /dev/null +++ b/internal/cmd/volume/backup/describe/describe.go @@ -0,0 +1,162 @@ +package describe + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + backupIdArg = "BACKUP_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + BackupId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", backupIdArg), + Short: "Describes a backup", + Long: "Describes a backup by its ID.", + Args: args.SingleArg(backupIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of a backup with ID "xxx"`, + "$ stackit volume backup describe xxx"), + examples.NewExample( + `Get details of a backup with ID "xxx" in JSON format`, + "$ stackit volume backup describe xxx --output-format json"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + backup, err := req.Execute() + if err != nil { + return fmt.Errorf("get backup details: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, backup) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + backupId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + BackupId: backupId, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetBackupRequest { + req := apiClient.GetBackup(ctx, model.ProjectId, model.BackupId) + return req +} + +func outputResult(p *print.Printer, outputFormat string, backup *iaas.Backup) error { + if backup == nil { + return fmt.Errorf("backup response is empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(backup, "", " ") + if err != nil { + return fmt.Errorf("marshal backup: %w", err) + } + p.Outputln(string(details)) + return nil + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal backup: %w", err) + } + p.Outputln(string(details)) + return nil + + default: + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(backup.Id)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(backup.Name)) + table.AddSeparator() + table.AddRow("SIZE", utils.PtrByteSizeDefault(backup.Size, "")) + table.AddSeparator() + table.AddRow("STATUS", utils.PtrString(backup.Status)) + table.AddSeparator() + table.AddRow("SNAPSHOT ID", utils.PtrString(backup.SnapshotId)) + table.AddSeparator() + table.AddRow("VOLUME ID", utils.PtrString(backup.VolumeId)) + table.AddSeparator() + table.AddRow("AVAILABILITY ZONE", utils.PtrString(backup.AvailabilityZone)) + table.AddSeparator() + + if backup.Labels != nil && len(*backup.Labels) > 0 { + var labels []string + for key, value := range *backup.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + table.AddRow("LABELS", strings.Join(labels, "\n")) + table.AddSeparator() + } + + table.AddRow("CREATED AT", utils.ConvertTimePToDateTimeString(backup.CreatedAt)) + table.AddSeparator() + table.AddRow("UPDATED AT", utils.ConvertTimePToDateTimeString(backup.UpdatedAt)) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + } +} diff --git a/internal/cmd/volume/backup/describe/describe_test.go b/internal/cmd/volume/backup/describe/describe_test.go new file mode 100644 index 000000000..3dcac1e56 --- /dev/null +++ b/internal/cmd/volume/backup/describe/describe_test.go @@ -0,0 +1,217 @@ +package describe + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testBackupId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testBackupId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + BackupId: testBackupId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiGetBackupRequest)) iaas.ApiGetBackupRequest { + request := testClient.GetBackup(testCtx, testProjectId, testBackupId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiGetBackupRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + backup *iaas.Backup + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "backup as argument", + args: args{ + backup: &iaas.Backup{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.backup); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go new file mode 100644 index 000000000..540c00480 --- /dev/null +++ b/internal/cmd/volume/backup/list/list.go @@ -0,0 +1,202 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + limitFlag = "limit" + labelSelectorFlag = "label-selector" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 + LabelSelector *string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all backups", + Long: "Lists all backups in a project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all backups`, + "$ stackit volume backup list"), + examples.NewExample( + `List all backups in JSON format`, + "$ stackit volume backup list --output-format json"), + examples.NewExample( + `List up to 10 backups`, + "$ stackit volume backup list --limit 10"), + examples.NewExample( + `List backups with specific labels`, + "$ stackit volume backup list --label-selector key1=value1,key2=value2"), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get backups: %w", err) + } + if resp.Items == nil || len(*resp.Items) == 0 { + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + params.Printer.Info("No backups found for project %s\n", projectLabel) + return nil + } + backups := *resp.Items + + // Truncate output + if model.Limit != nil && len(backups) > int(*model.Limit) { + backups = backups[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, backups) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + cmd.Flags().String(labelSelectorFlag, "", "Filter backups by labels") +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + labelSelector := flags.FlagToStringPointer(p, cmd, labelSelectorFlag) + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + LabelSelector: labelSelector, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListBackupsRequest { + req := apiClient.ListBackups(ctx, model.ProjectId) + + if model.LabelSelector != nil { + req = req.LabelSelector(*model.LabelSelector) + } + + return req +} + +func outputResult(p *print.Printer, outputFormat string, backups []iaas.Backup) error { + if backups == nil { + return fmt.Errorf("backups is empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(backups, "", " ") + if err != nil { + return fmt.Errorf("marshal backup list: %w", err) + } + p.Outputln(string(details)) + return nil + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(backups, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal backup list: %w", err) + } + p.Outputln(string(details)) + return nil + + default: + table := tables.NewTable() + table.SetHeader("ID", "NAME", "SIZE", "STATUS", "SNAPSHOT ID", "VOLUME ID", "AVAILABILITY ZONE", "LABELS", "CREATED AT", "UPDATED AT") + + for _, backup := range backups { + var labelsString string + if backup.Labels != nil { + var labels []string + for key, value := range *backup.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + labelsString = strings.Join(labels, ", ") + } + + table.AddRow( + utils.PtrString(backup.Id), + utils.PtrString(backup.Name), + utils.PtrByteSizeDefault(backup.Size, ""), + utils.PtrString(backup.Status), + utils.PtrString(backup.SnapshotId), + utils.PtrString(backup.VolumeId), + utils.PtrString(backup.AvailabilityZone), + labelsString, + utils.ConvertTimePToDateTimeString(backup.CreatedAt), + utils.ConvertTimePToDateTimeString(backup.UpdatedAt), + ) + table.AddSeparator() + } + + p.Outputln(table.Render()) + return nil + } +} diff --git a/internal/cmd/volume/backup/list/list_test.go b/internal/cmd/volume/backup/list/list_test.go new file mode 100644 index 000000000..7a24783c2 --- /dev/null +++ b/internal/cmd/volume/backup/list/list_test.go @@ -0,0 +1,233 @@ +package list + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", + labelSelectorFlag: "key1=value1", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + Limit: utils.Ptr(int64(10)), + LabelSelector: utils.Ptr("key1=value1"), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiListBackupsRequest)) iaas.ApiListBackupsRequest { + request := testClient.ListBackups(testCtx, testProjectId) + request = request.LabelSelector("key1=value1") + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "limit invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "limit invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiListBackupsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + backups []iaas.Backup + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty backup in slice", + args: args{ + backups: []iaas.Backup{{}}, + }, + wantErr: false, + }, + { + name: "empty slice", + args: args{ + backups: []iaas.Backup{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.backups); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go new file mode 100644 index 000000000..3249f0560 --- /dev/null +++ b/internal/cmd/volume/backup/restore/restore.go @@ -0,0 +1,138 @@ +package restore + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + backupIdArg = "BACKUP_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + BackupId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("restore %s", backupIdArg), + Short: "Restores a backup", + Long: "Restores a backup by its ID.", + Args: args.SingleArg(backupIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Restore a backup with ID "xxx"`, "$ stackit volume backup restore xxx"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.BackupId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get backup details: %v", err) + } + + // Get source details for labels + var sourceLabel string + backup, err := apiClient.GetBackup(ctx, model.ProjectId, model.BackupId).Execute() + if err == nil && backup != nil && backup.VolumeId != nil { + sourceLabel = *backup.VolumeId + name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, *backup.VolumeId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get volume details: %v", err) + } else if name != "" { + sourceLabel = name + } + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to restore %q with backup %q? (This cannot be undone)", sourceLabel, backupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("restore backup: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Restoring backup") + _, err = wait.RestoreBackupWaitHandler(ctx, apiClient, model.ProjectId, model.BackupId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for backup restore: %w", err) + } + s.Stop() + } + + if model.Async { + params.Printer.Outputf("Triggered restore of %q with %q in %q\n", sourceLabel, backupLabel, model.ProjectId) + } else { + params.Printer.Outputf("Restored %q with %q in %q\n", sourceLabel, backupLabel, model.ProjectId) + } + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + backupId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + BackupId: backupId, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRestoreBackupRequest { + req := apiClient.RestoreBackup(ctx, model.ProjectId, model.BackupId) + return req +} diff --git a/internal/cmd/volume/backup/restore/restore_test.go b/internal/cmd/volume/backup/restore/restore_test.go new file mode 100644 index 000000000..217300720 --- /dev/null +++ b/internal/cmd/volume/backup/restore/restore_test.go @@ -0,0 +1,183 @@ +package restore + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testBackupId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testBackupId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + BackupId: testBackupId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiRestoreBackupRequest)) iaas.ApiRestoreBackupRequest { + request := testClient.RestoreBackup(testCtx, testProjectId, testBackupId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiRestoreBackupRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go new file mode 100644 index 000000000..f23bb5108 --- /dev/null +++ b/internal/cmd/volume/backup/update/update.go @@ -0,0 +1,168 @@ +package update + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + backupIdArg = "BACKUP_ID" + nameFlag = "name" + labelsFlag = "labels" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + BackupId string + Name *string + Labels map[string]string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", backupIdArg), + Short: "Updates a backup", + Long: "Updates a backup by its ID.", + Args: args.SingleArg(backupIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update the name of a backup with ID "xxx"`, + "$ stackit volume backup update xxx --name new-name"), + examples.NewExample( + `Update the labels of a backup with ID "xxx"`, + "$ stackit volume backup update xxx --labels key1=value1,key2=value2"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.BackupId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get backup name: %v", err) + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update backup %q? (This cannot be undone)", model.BackupId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update backup: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, backupLabel, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(nameFlag, "", "Name of the backup") + cmd.Flags().StringToString(labelsFlag, nil, "Key-value string pairs as labels") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + backupId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + name := flags.FlagToStringPointer(p, cmd, nameFlag) + labels := flags.FlagToStringToStringPointer(p, cmd, labelsFlag) + if labels == nil { + labels = &map[string]string{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + BackupId: backupId, + Name: name, + Labels: *labels, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateBackupRequest { + req := apiClient.UpdateBackup(ctx, model.ProjectId, model.BackupId) + + payload := iaas.UpdateBackupPayload{ + Name: model.Name, + Labels: utils.ConvertStringMapToInterfaceMap(utils.Ptr(model.Labels)), + } + + req = req.UpdateBackupPayload(payload) + return req +} + +func outputResult(p *print.Printer, outputFormat, backupLabel string, backup *iaas.Backup) error { + if backup == nil { + return fmt.Errorf("backup response is empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(backup, "", " ") + if err != nil { + return fmt.Errorf("marshal backup: %w", err) + } + p.Outputln(string(details)) + return nil + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal backup: %w", err) + } + p.Outputln(string(details)) + return nil + + default: + p.Outputf("Updated backup %q\n", backupLabel) + return nil + } +} diff --git a/internal/cmd/volume/backup/update/update_test.go b/internal/cmd/volume/backup/update/update_test.go new file mode 100644 index 000000000..b0826ae65 --- /dev/null +++ b/internal/cmd/volume/backup/update/update_test.go @@ -0,0 +1,192 @@ +package update + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testBackupId = uuid.NewString() + testName = "test-backup" + testLabels = map[string]string{"key1": "value1"} +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testBackupId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + nameFlag: testName, + labelsFlag: "key1=value1", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + BackupId: testBackupId, + Name: &testName, + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiUpdateBackupRequest)) iaas.ApiUpdateBackupRequest { + request := testClient.UpdateBackup(testCtx, testProjectId, testBackupId) + payload := iaas.NewUpdateBackupPayloadWithDefaults() + payload.Name = &testName + + // Convert test labels to map[string]interface{} + labelsMap := map[string]interface{}{} + for k, v := range testLabels { + labelsMap[k] = v + } + payload.Labels = &labelsMap + + request = request.UpdateBackupPayload(*payload) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiUpdateBackupRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 258e0752a..5519bd5d8 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -174,20 +174,11 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli Type: model.SourceType, } - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.CreateVolumePayload{ AvailabilityZone: model.AvailabilityZone, Name: model.Name, Description: model.Description, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), PerformanceClass: model.PerformanceClass, Size: model.Size, } diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 80e137987..263f333af 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -135,19 +135,10 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateVolumeRequest { req := apiClient.UpdateVolume(ctx, model.ProjectId, model.VolumeId) - var labelsMap *map[string]interface{} - if model.Labels != nil && len(*model.Labels) > 0 { - // convert map[string]string to map[string]interface{} - labelsMap = utils.Ptr(map[string]interface{}{}) - for k, v := range *model.Labels { - (*labelsMap)[k] = v - } - } - payload := iaas.UpdateVolumePayload{ Name: model.Name, Description: model.Description, - Labels: labelsMap, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } return req.UpdateVolumePayload(payload) diff --git a/internal/cmd/volume/volume.go b/internal/cmd/volume/volume.go index 1e876e85b..d5cad1614 100644 --- a/internal/cmd/volume/volume.go +++ b/internal/cmd/volume/volume.go @@ -2,6 +2,7 @@ package volume import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/create" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/describe" @@ -35,4 +36,5 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(update.NewCmd(params)) cmd.AddCommand(resize.NewCmd(params)) cmd.AddCommand(performanceclass.NewCmd(params)) + cmd.AddCommand(backup.NewCmd(params)) } diff --git a/internal/pkg/services/iaas/utils/utils.go b/internal/pkg/services/iaas/utils/utils.go index f2616a01a..f3d3571d7 100644 --- a/internal/pkg/services/iaas/utils/utils.go +++ b/internal/pkg/services/iaas/utils/utils.go @@ -26,6 +26,8 @@ type IaaSClient interface { GetNetworkAreaRangeExecute(ctx context.Context, organizationId, areaId, networkRangeId string) (*iaas.NetworkRange, error) GetImageExecute(ctx context.Context, projectId string, imageId string) (*iaas.Image, error) GetAffinityGroupExecute(ctx context.Context, projectId string, affinityGroupId string) (*iaas.AffinityGroup, error) + GetSnapshotExecute(ctx context.Context, projectId, snapshotId string) (*iaas.Snapshot, error) + GetBackupExecute(ctx context.Context, projectId, backupId string) (*iaas.Backup, error) } func GetSecurityGroupRuleName(ctx context.Context, apiClient IaaSClient, projectId, securityGroupRuleId, securityGroupId string) (string, error) { @@ -170,3 +172,22 @@ func GetAffinityGroupName(ctx context.Context, apiClient IaaSClient, projectId, } return *resp.Name, nil } + +func GetSnapshotName(ctx context.Context, apiClient IaaSClient, projectId, snapshotId string) (string, error) { + resp, err := apiClient.GetSnapshotExecute(ctx, projectId, snapshotId) + if err != nil { + return "", fmt.Errorf("get snapshot: %w", err) + } + return *resp.Name, nil +} + +func GetBackupName(ctx context.Context, apiClient IaaSClient, projectId, backupId string) (string, error) { + resp, err := apiClient.GetBackupExecute(ctx, projectId, backupId) + if err != nil { + return backupId, fmt.Errorf("get backup: %w", err) + } + if resp != nil && resp.Name != nil { + return *resp.Name, nil + } + return backupId, nil +} diff --git a/internal/pkg/services/iaas/utils/utils_test.go b/internal/pkg/services/iaas/utils/utils_test.go index f4375251d..e2ccdc469 100644 --- a/internal/pkg/services/iaas/utils/utils_test.go +++ b/internal/pkg/services/iaas/utils/utils_test.go @@ -33,6 +33,10 @@ type IaaSClientMocked struct { GetImageResp *iaas.Image GetAffinityGroupsFails bool GetAffinityGroupResp *iaas.AffinityGroup + GetBackupFails bool + GetBackupResp *iaas.Backup + GetSnapshotFails bool + GetSnapshotResp *iaas.Snapshot } func (m *IaaSClientMocked) GetAffinityGroupExecute(_ context.Context, _, _ string) (*iaas.AffinityGroup, error) { @@ -112,6 +116,19 @@ func (m *IaaSClientMocked) GetImageExecute(_ context.Context, _, _ string) (*iaa return m.GetImageResp, nil } +func (m *IaaSClientMocked) GetBackupExecute(_ context.Context, _, _ string) (*iaas.Backup, error) { + if m.GetBackupFails { + return nil, fmt.Errorf("could not get backup") + } + return m.GetBackupResp, nil +} + +func (m *IaaSClientMocked) GetSnapshotExecute(_ context.Context, _, _ string) (*iaas.Snapshot, error) { + if m.GetSnapshotFails { + return nil, fmt.Errorf("could not get snapshot") + } + return m.GetSnapshotResp, nil +} func TestGetSecurityGroupRuleName(t *testing.T) { type args struct { getInstanceFails bool From 7a990bfd278dbf887f5c482237b4732d16ec946e Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:34:09 +0200 Subject: [PATCH 045/422] feat: add test coverage comment (#802) * generate test coverage in CI * add test coverage as comment in PR --- .github/workflows/ci.yaml | 35 +++++++++++++++++++++++++++++++++-- Makefile | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 239a463dc..3f41f7681 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,6 +1,15 @@ name: CI -on: [pull_request, workflow_dispatch] +on: + pull_request: + workflow_dispatch: + push: + branches: + - main + +env: + CODE_COVERAGE_FILE_NAME: "coverage.out" # must be the same as in Makefile + CODE_COVERAGE_ARTIFACT_NAME: "code-coverage" jobs: main: @@ -26,8 +35,15 @@ jobs: - name: Test run: make test + - name: Archive code coverage results + uses: actions/upload-artifact@v4 + with: + name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} + path: ${{ env.CODE_COVERAGE_FILE_NAME }} + config: name: Check GoReleaser config + if: github.event_name == 'pull_request' runs-on: ubuntu-latest steps: - name: Checkout @@ -36,4 +52,19 @@ jobs: - name: Check GoReleaser uses: goreleaser/goreleaser-action@v6 with: - args: check \ No newline at end of file + args: check + + code_coverage: + name: "Code coverage report" + if: github.event_name == 'pull_request' # Do not run when workflow is triggered by push to main branch + runs-on: ubuntu-latest + needs: main + permissions: + contents: read + actions: read # to download code coverage results from "main" job + pull-requests: write # write permission needed to comment on PR + steps: + - uses: fgrosse/go-coverage-report@v1.1.1 + with: + coverage-artifact-name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} + coverage-file-name: ${{ env.CODE_COVERAGE_FILE_NAME }} \ No newline at end of file diff --git a/Makefile b/Makefile index 171d9864d..a3b64bb3d 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,7 @@ lint: lint-golangci-lint lint-yamllint # Test test: @echo ">> Running tests for the CLI application" - @go test ./... -count=1 + @go test ./... -count=1 -coverprofile=coverage.out # Test coverage coverage: From bd9167ed62515b4ec6e4ec6f0521c10fa9f6a23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 17 Jun 2025 15:31:08 +0200 Subject: [PATCH 046/422] fix(ci): increase keychain timeout for release workflow (#804) --- .github/workflows/release.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0bddeed42..09d8ce121 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -48,6 +48,8 @@ jobs: security create-keychain -p "${{ secrets.TEMP_KEYCHAIN }}" $KEYCHAIN_PATH security default-keychain -s $KEYCHAIN_PATH security unlock-keychain -p "${{ secrets.TEMP_KEYCHAIN }}" $KEYCHAIN_PATH + # the keychain gets locked automatically after 300s, so we have to extend this interval to e.g. 900 seconds + security set-keychain-settings -lut 900 security import ./ApplicationID.p12 -P "${{ secrets.APPLICATION_ID }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH security list-keychain -d user -s $KEYCHAIN_PATH echo -n $AUTHKEY_BASE64 | base64 -d -o ./AuthKey.p8 From 8fdadf8259420219c1c1c0c51349c6fdddf0791f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 17 Jun 2025 16:07:07 +0200 Subject: [PATCH 047/422] fix(ci): fix goreleaser post-hooks (#808) --- .goreleaser.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 99b8757e1..b0195645c 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -36,8 +36,6 @@ builds: output: true - cmd: codesign -vvv --deep --strict "dist/macos-builds_{{.Target}}/{{.Name}}" output: true - - cmd: ls -l "dist/macos_{{.Target}}" - output: true - cmd: hdiutil create -volname "STACKIT-CLI" -srcfolder "dist/macos-builds_{{.Target}}/{{.Name}}" -ov -format UDZO "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" output: true - cmd: codesign -s "{{.Env.APPLE_APPLICATION_IDENTITY}}" -f -v --options=runtime "dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg" From 179ce5fb07e4e92d530bea674f9530ab52c53d19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:12:51 +0000 Subject: [PATCH 048/422] chore(deps): bump fgrosse/go-coverage-report from 1.1.1 to 1.2.0 (#809) Bumps [fgrosse/go-coverage-report](https://github.com/fgrosse/go-coverage-report) from 1.1.1 to 1.2.0. - [Release notes](https://github.com/fgrosse/go-coverage-report/releases) - [Changelog](https://github.com/fgrosse/go-coverage-report/blob/main/CHANGELOG.md) - [Commits](https://github.com/fgrosse/go-coverage-report/compare/v1.1.1...v1.2.0) --- updated-dependencies: - dependency-name: fgrosse/go-coverage-report dependency-version: 1.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3f41f7681..18a3a9e6f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -64,7 +64,7 @@ jobs: actions: read # to download code coverage results from "main" job pull-requests: write # write permission needed to comment on PR steps: - - uses: fgrosse/go-coverage-report@v1.1.1 + - uses: fgrosse/go-coverage-report@v1.2.0 with: coverage-artifact-name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} coverage-file-name: ${{ env.CODE_COVERAGE_FILE_NAME }} \ No newline at end of file From add42ab27b2687e5e9744556322a713bd149c421 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 15:12:15 +0000 Subject: [PATCH 049/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/git (#807) Bumps [github.com/stackitcloud/stackit-sdk-go/services/git](https://github.com/stackitcloud/stackit-sdk-go) from 0.5.0 to 0.5.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.5.0...services/git/v0.5.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/git dependency-version: 0.5.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c3bb00c1f..f2e22bd07 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 diff --git a/go.sum b/go.sum index 6bd663516..e8e97bea4 100644 --- a/go.sum +++ b/go.sum @@ -570,8 +570,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkd github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 h1:GQAA9gqhKN0ZRc1vRYURHeVjSghh+iF+5DK0HdeuakI= github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0 h1:s0A2EPBrnBxfKStKA/B1izbyYHw/0m2RdqN3Inkv9hI= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.0/go.mod h1:XhXHJpOVC9Rpwyf1G+EpMbprBafH9aZb8vWBdR+z0WM= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+XZRs8yWw8YMVw+HfjcuMhieR4= +github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0/go.mod h1:TaMx7kukGpRm0BkNCmS7u2x12q1pgfbD55DAnLIjOIQ= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= From a8c66c10966209d8e286b2e58878e80459638e30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:28:13 +0200 Subject: [PATCH 050/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/opensearch (#806) Bumps [github.com/stackitcloud/stackit-sdk-go/services/opensearch](https://github.com/stackitcloud/stackit-sdk-go) from 0.23.0 to 0.23.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.23.0...services/opensearch/v0.23.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/opensearch dependency-version: 0.23.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f2e22bd07..09f8d7f57 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1 diff --git a/go.sum b/go.sum index e8e97bea4..694741eef 100644 --- a/go.sum +++ b/go.sum @@ -586,8 +586,8 @@ github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 h1:+dKIPVz9 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 h1:6OObzh2zk7wg75zYstcj0kjOjaxWc4joqA6qdeo8DP4= github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0 h1:/OaZCyrD8LFa4W6a2Vu2QSVMJwLLBr8ZdBKzX00MV1Q= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.0/go.mod h1:c30J6f/fXtbzcHkH3ZcabZUek3wfy5CRnEkcW5e5yXg= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 h1:E6vCqPn1NiPHnbnvqLNQNz6a/cmeyRb5iA9cDUPtP58= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 h1:r29a9GoBLVw2VZSzdPftlIsE5t7shdxobwoT6NVUIjU= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 h1:2rDFwJtZOFYFUiJqJ9uIwM+mu+BbtuVaUHARRJtrZPU= From f2b13ce1886d6d4c5c6602146d6f61a7097a1dc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:38:04 +0200 Subject: [PATCH 051/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#805) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mongodbflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.0 to 1.2.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.2.0...services/cdn/v1.2.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mongodbflex dependency-version: 1.2.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 09f8d7f57..bfcfe57cf 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 diff --git a/go.sum b/go.sum index 694741eef..faea33252 100644 --- a/go.sum +++ b/go.sum @@ -580,8 +580,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 h1:7nN7ZCuWSbJMy5KqoOqSbp5JKIOvyuDqVRtxVvT1iyE= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0 h1:U/IhjLOz0vG6zuxTqGhBd8f609s6JB+X9PaL6x/VM58= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.0/go.mod h1:+JSnz5/AvGN5ek/iH008frRc/NgjSr1EVOTIbyLwAuQ= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 h1:TWz7qJ4Mg5pquDXODSZ1dzhS95ZYn3w1aKjuRU2VqCg= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 h1:+dKIPVz9ydKbX3x6+1NvYk++OA378w74p+N6SjDmzBQ= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 h1:6OObzh2zk7wg75zYstcj0kjOjaxWc4joqA6qdeo8DP4= From b33804093334362ab4a7bb836d441e140f3c8998 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 23 Jun 2025 10:01:27 +0200 Subject: [PATCH 052/422] chore(deps): update renovatebot/github-action action to v43 (#819) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 27f85d5ee..90be71550 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v42.0.6 + uses: renovatebot/github-action@v43.0.0 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From efc9ef6e14c6372394efc3cfcf253bb02bab0ae7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 08:17:53 +0000 Subject: [PATCH 053/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/dns (#815) Bumps [github.com/stackitcloud/stackit-sdk-go/services/dns](https://github.com/stackitcloud/stackit-sdk-go) from 0.15.0 to 0.16.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.15.0...core/v0.16.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/dns dependency-version: 0.16.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bfcfe57cf..a36133890 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 diff --git a/go.sum b/go.sum index faea33252..179a09c5a 100644 --- a/go.sum +++ b/go.sum @@ -568,8 +568,8 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 h1:7UKUi7Od7KpuVjV4I/ github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0 h1:GQAA9gqhKN0ZRc1vRYURHeVjSghh+iF+5DK0HdeuakI= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.15.0/go.mod h1:PMHoavoIaRZpkI9BA0nsnRjGoHASVSBon45XB3QyhMA= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0 h1:86F0qHx2YOzxoGkcFX1tT20+Yz1mwaPPS2aFODxuMpY= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+XZRs8yWw8YMVw+HfjcuMhieR4= github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= From 4025abe26e9be56e42b0a37a4be7dc3937e7d3b8 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 25 Jun 2025 09:47:02 +0200 Subject: [PATCH 054/422] fix(deps): update stackit sdk modules (#810) Co-authored-by: Renovate Bot --- go.mod | 28 ++++++++++++++-------------- go.sum | 56 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index a36133890..505be5323 100644 --- a/go.mod +++ b/go.mod @@ -17,21 +17,21 @@ require ( github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.25.0 @@ -237,10 +237,10 @@ require ( github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 179a09c5a..5c6291045 100644 --- a/go.sum +++ b/go.sum @@ -566,26 +566,26 @@ github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EV github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 h1:7UKUi7Od7KpuVjV4I/jUAV5NEatUomwWFd/IRODbioY= github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0 h1:VpONplkdlEh7Pf22+cNnnHH4bx+S9QI+z55XYRE74JY= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.7.0/go.mod h1:dJ19ZwFjp2bfC5ZobXV3vUdSpE3quUw3GuoFSKLpHIo= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 h1:KXMiTBV4KcOEQRFddtOUFspL+KRvjDQNDIs73bdiey0= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0/go.mod h1:+2mx2MclJFMQ4Y6b20jspYAnIeFJP3/yvO6Gfvcvf6Q= github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0 h1:86F0qHx2YOzxoGkcFX1tT20+Yz1mwaPPS2aFODxuMpY= github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1 h1:xs8CMY7t8nULQvZr5+XZRs8yWw8YMVw+HfjcuMhieR4= -github.com/stackitcloud/stackit-sdk-go/services/git v0.5.1/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0 h1:aLlZmcsDHqqc7KPsevvs+W6EPZFT51u/dx5TcVQsE6g= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.24.0/go.mod h1:TaMx7kukGpRm0BkNCmS7u2x12q1pgfbD55DAnLIjOIQ= +github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 h1:C+8z3MdvnTngcH9L72VHLXRKNWHHYp+7FO/F6imKmB4= +github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.25.0 h1:K9RjMPlEK1XQegZBMIrI/KHAorzRdOt5YpftsT7pMEk= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.25.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1 h1:hfnILDJGBwwqUIs4xt/7Jj4LBe+JsSdHy+Md2ynUg4Y= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.24.1/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1 h1:7nN7ZCuWSbJMy5KqoOqSbp5JKIOvyuDqVRtxVvT1iyE= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.24.1/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCxpFXN2K7g2ih0gQM6cyZ1VhTmtQfI= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 h1:TWz7qJ4Mg5pquDXODSZ1dzhS95ZYn3w1aKjuRU2VqCg= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0 h1:+dKIPVz9ydKbX3x6+1NvYk++OA378w74p+N6SjDmzBQ= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.2.0/go.mod h1:iCOYS9yICXQPyMAIdUGMqJDLY8HXKiVAdiMzO/mPvtA= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1 h1:6OObzh2zk7wg75zYstcj0kjOjaxWc4joqA6qdeo8DP4= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.7.1/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 h1:8v9Iupkc3meXcVPMpteXDz07YzY2M5jud50vEtAvbs8= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 h1:E6vCqPn1NiPHnbnvqLNQNz6a/cmeyRb5iA9cDUPtP58= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 h1:r29a9GoBLVw2VZSzdPftlIsE5t7shdxobwoT6NVUIjU= @@ -594,22 +594,22 @@ github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 h1:2rDFwJtZOFYF github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1/go.mod h1:YL0l9l9xzJy2BmV+U9XkcXlQaHbE2KyA37GpGvBXIJ4= github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1 h1:4H+GL4eLEO116Vlh0pe+udGGYnMohA8YhLW9KYGdEOc= github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1/go.mod h1:PAQH8+1DDGc6uibvC3nDtfRLu8uxutIr25mPJvrCOy8= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0 h1:y8QUHaEdprQJ3VJgOpTVT1nOyTByKsw6k6ccQBoe1wo= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.16.0/go.mod h1:TBvZpbCju0Zmq8GoS4CEtUg2MqtdqWrGeEAOXwkJNQo= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1 h1:CjlTuoLg1qlAQt+/5a2ElnyEx/Zf1j7j61OJykKfdIM= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.2.1/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0 h1:oGR3wRC0xfX2Itpwbh/SrT/k2fnmMSzvy2U9U2lDQPs= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.12.0/go.mod h1:iD7R3CNdLUDUyKP+lATsQy+V4QGMMOb15zPnNq4wnbs= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.1 h1:0Kro/2d0GnqhOFTYq/4r9HwjZB/aT2erC1nyNmI0lnk= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.2.1/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0 h1:WJA2v8XCISdrcbnJXstsjVE+QAFVsDpfJHNp0ORe1Bc= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.1.0/go.mod h1:5F7/2BiKhrbvHD56mj5xR9qf8P0V2yMgeitmdIpQv4s= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1 h1:01AIQQtHdJ96La6BPVTRp6SLiGe5LXF+JmDKXbt4ZX0= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.8.1/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 h1:lxI0LnHcTpnF8g0tHTCQ1UIVLlNHk1W1WAclp3Ut0fw= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0/go.mod h1:TBvZpbCju0Zmq8GoS4CEtUg2MqtdqWrGeEAOXwkJNQo= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 h1:ewFXnESJWsUen0T9sSt0lwL28fhqCVB1HSLdY0szrdA= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 h1:CtCaG8nycfviq/QgNM7OoBWs/Ap9IQvOmvI0tZhYdPI= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0/go.mod h1:/MiR18oug1V0sxPT4KO6a+LhgPARNBGvgVx3qv3zJ0A= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.0 h1:LGiq+2o2D3snaL1vqBQkvPTAEVPT2PKPrJzQL07hZgY= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.0/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 h1:poL/Hz3a6OHZ/eKtwMGm5nLqC3fEJjzPQlN/7/+mk8Y= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0/go.mod h1:ssbyAHtxyuBvheMEItydM78/JxjDl3naUtllrC7ghDs= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 h1:2d28WFQB9QB3af4uoPFglQDhH1LepEe6F2YoFCBecVI= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1TsWatlsexLeKdkb3L8chcxaXJOy/cLXctsRxhb4xg= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.25.0 h1:9ufUW3J/d29TizLd32Kt4b+4RUN1FRod9Q3X1HbTg58= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.25.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0 h1:bwLmLXvtCl1XkPRP+YrXwfz+lBMaGWH/crlNbYtxeqE= +github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 h1:WvPLO1c7oT/MWmCRTt7jRyxus2g3DIluIW5iAsUpSFM= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From b27b82c8867014f1c624869996e25a5e5d0e2245 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 25 Jun 2025 09:58:00 +0200 Subject: [PATCH 055/422] chore(deps): update renovatebot/github-action action to v43.0.1 (#822) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 90be71550..ffb733574 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.0 + uses: renovatebot/github-action@v43.0.1 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 8a59085cff725ffd99c98d0ade6981463b9ff6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:42:09 +0200 Subject: [PATCH 056/422] feat(cli): onboard iaas snapshot api (#774) --- docs/stackit_volume.md | 1 + docs/stackit_volume_snapshot.md | 38 +++ docs/stackit_volume_snapshot_create.md | 49 ++++ docs/stackit_volume_snapshot_delete.md | 40 +++ docs/stackit_volume_snapshot_describe.md | 43 +++ docs/stackit_volume_snapshot_list.md | 48 ++++ docs/stackit_volume_snapshot_update.md | 45 ++++ .../cmd/volume/backup/describe/describe.go | 2 +- internal/cmd/volume/backup/list/list.go | 2 +- .../cmd/volume/backup/update/update_test.go | 8 +- internal/cmd/volume/snapshot/create/create.go | 171 ++++++++++++ .../cmd/volume/snapshot/create/create_test.go | 207 +++++++++++++++ internal/cmd/volume/snapshot/delete/delete.go | 127 +++++++++ .../cmd/volume/snapshot/delete/delete_test.go | 197 ++++++++++++++ .../cmd/volume/snapshot/describe/describe.go | 157 +++++++++++ .../volume/snapshot/describe/describe_test.go | 242 +++++++++++++++++ internal/cmd/volume/snapshot/list/list.go | 198 ++++++++++++++ .../cmd/volume/snapshot/list/list_test.go | 250 ++++++++++++++++++ internal/cmd/volume/snapshot/snapshot.go | 33 +++ internal/cmd/volume/snapshot/update/update.go | 143 ++++++++++ .../cmd/volume/snapshot/update/update_test.go | 240 +++++++++++++++++ internal/cmd/volume/volume.go | 2 + internal/pkg/services/iaas/utils/utils.go | 4 + internal/pkg/utils/utils.go | 9 + 24 files changed, 2248 insertions(+), 8 deletions(-) create mode 100644 docs/stackit_volume_snapshot.md create mode 100644 docs/stackit_volume_snapshot_create.md create mode 100644 docs/stackit_volume_snapshot_delete.md create mode 100644 docs/stackit_volume_snapshot_describe.md create mode 100644 docs/stackit_volume_snapshot_list.md create mode 100644 docs/stackit_volume_snapshot_update.md create mode 100644 internal/cmd/volume/snapshot/create/create.go create mode 100644 internal/cmd/volume/snapshot/create/create_test.go create mode 100644 internal/cmd/volume/snapshot/delete/delete.go create mode 100644 internal/cmd/volume/snapshot/delete/delete_test.go create mode 100644 internal/cmd/volume/snapshot/describe/describe.go create mode 100644 internal/cmd/volume/snapshot/describe/describe_test.go create mode 100644 internal/cmd/volume/snapshot/list/list.go create mode 100644 internal/cmd/volume/snapshot/list/list_test.go create mode 100644 internal/cmd/volume/snapshot/snapshot.go create mode 100644 internal/cmd/volume/snapshot/update/update.go create mode 100644 internal/cmd/volume/snapshot/update/update_test.go diff --git a/docs/stackit_volume.md b/docs/stackit_volume.md index 4955b6299..3412504c2 100644 --- a/docs/stackit_volume.md +++ b/docs/stackit_volume.md @@ -37,5 +37,6 @@ stackit volume [flags] * [stackit volume list](./stackit_volume_list.md) - Lists all volumes of a project * [stackit volume performance-class](./stackit_volume_performance-class.md) - Provides functionality for volume performance classes available inside a project * [stackit volume resize](./stackit_volume_resize.md) - Resizes a volume +* [stackit volume snapshot](./stackit_volume_snapshot.md) - Provides functionality for snapshots * [stackit volume update](./stackit_volume_update.md) - Updates a volume diff --git a/docs/stackit_volume_snapshot.md b/docs/stackit_volume_snapshot.md new file mode 100644 index 000000000..61f6f428e --- /dev/null +++ b/docs/stackit_volume_snapshot.md @@ -0,0 +1,38 @@ +## stackit volume snapshot + +Provides functionality for snapshots + +### Synopsis + +Provides functionality for snapshots. + +``` +stackit volume snapshot [flags] +``` + +### Options + +``` + -h, --help Help for "stackit volume snapshot" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume](./stackit_volume.md) - Provides functionality for volumes +* [stackit volume snapshot create](./stackit_volume_snapshot_create.md) - Creates a snapshot from a volume +* [stackit volume snapshot delete](./stackit_volume_snapshot_delete.md) - Deletes a snapshot +* [stackit volume snapshot describe](./stackit_volume_snapshot_describe.md) - Describes a snapshot +* [stackit volume snapshot list](./stackit_volume_snapshot_list.md) - Lists all snapshots +* [stackit volume snapshot update](./stackit_volume_snapshot_update.md) - Updates a snapshot + diff --git a/docs/stackit_volume_snapshot_create.md b/docs/stackit_volume_snapshot_create.md new file mode 100644 index 000000000..4ed86ad39 --- /dev/null +++ b/docs/stackit_volume_snapshot_create.md @@ -0,0 +1,49 @@ +## stackit volume snapshot create + +Creates a snapshot from a volume + +### Synopsis + +Creates a snapshot from a volume. + +``` +stackit volume snapshot create [flags] +``` + +### Examples + +``` + Create a snapshot from a volume with ID "xxx" + $ stackit volume snapshot create --volume-id xxx + + Create a snapshot from a volume with ID "xxx" and name "my-snapshot" + $ stackit volume snapshot create --volume-id xxx --name my-snapshot + + Create a snapshot from a volume with ID "xxx" and labels + $ stackit volume snapshot create --volume-id xxx --labels key1=value1,key2=value2 +``` + +### Options + +``` + -h, --help Help for "stackit volume snapshot create" + --labels stringToString Key-value string pairs as labels (default []) + --name string Name of the snapshot + --volume-id string ID of the volume from which a snapshot should be created +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume snapshot](./stackit_volume_snapshot.md) - Provides functionality for snapshots + diff --git a/docs/stackit_volume_snapshot_delete.md b/docs/stackit_volume_snapshot_delete.md new file mode 100644 index 000000000..df9a37828 --- /dev/null +++ b/docs/stackit_volume_snapshot_delete.md @@ -0,0 +1,40 @@ +## stackit volume snapshot delete + +Deletes a snapshot + +### Synopsis + +Deletes a snapshot by its ID. + +``` +stackit volume snapshot delete SNAPSHOT_ID [flags] +``` + +### Examples + +``` + Delete a snapshot with ID "xxx" + $ stackit volume snapshot delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit volume snapshot delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume snapshot](./stackit_volume_snapshot.md) - Provides functionality for snapshots + diff --git a/docs/stackit_volume_snapshot_describe.md b/docs/stackit_volume_snapshot_describe.md new file mode 100644 index 000000000..5f7f256b7 --- /dev/null +++ b/docs/stackit_volume_snapshot_describe.md @@ -0,0 +1,43 @@ +## stackit volume snapshot describe + +Describes a snapshot + +### Synopsis + +Describes a snapshot by its ID. + +``` +stackit volume snapshot describe SNAPSHOT_ID [flags] +``` + +### Examples + +``` + Get details of a snapshot with ID "xxx" + $ stackit volume snapshot describe xxx + + Get details of a snapshot with ID "xxx" in JSON format + $ stackit volume snapshot describe xxx --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit volume snapshot describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume snapshot](./stackit_volume_snapshot.md) - Provides functionality for snapshots + diff --git a/docs/stackit_volume_snapshot_list.md b/docs/stackit_volume_snapshot_list.md new file mode 100644 index 000000000..f4fe9dd3a --- /dev/null +++ b/docs/stackit_volume_snapshot_list.md @@ -0,0 +1,48 @@ +## stackit volume snapshot list + +Lists all snapshots + +### Synopsis + +Lists all snapshots in a project. + +``` +stackit volume snapshot list [flags] +``` + +### Examples + +``` + List all snapshots + $ stackit volume snapshot list + + List snapshots with a limit of 10 + $ stackit volume snapshot list --limit 10 + + List snapshots filtered by label + $ stackit volume snapshot list --label-selector key1=value1 +``` + +### Options + +``` + -h, --help Help for "stackit volume snapshot list" + --label-selector string Filter snapshots by labels + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume snapshot](./stackit_volume_snapshot.md) - Provides functionality for snapshots + diff --git a/docs/stackit_volume_snapshot_update.md b/docs/stackit_volume_snapshot_update.md new file mode 100644 index 000000000..2b74b5ae8 --- /dev/null +++ b/docs/stackit_volume_snapshot_update.md @@ -0,0 +1,45 @@ +## stackit volume snapshot update + +Updates a snapshot + +### Synopsis + +Updates a snapshot by its ID. + +``` +stackit volume snapshot update SNAPSHOT_ID [flags] +``` + +### Examples + +``` + Update a snapshot name with ID "xxx" + $ stackit volume snapshot update xxx --name my-new-name + + Update a snapshot labels with ID "xxx" + $ stackit volume snapshot update xxx --labels key1=value1,key2=value2 +``` + +### Options + +``` + -h, --help Help for "stackit volume snapshot update" + --labels stringToString Key-value string pairs as labels (default []) + --name string Name of the snapshot +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit volume snapshot](./stackit_volume_snapshot.md) - Provides functionality for snapshots + diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go index f181195d9..d3322f6d0 100644 --- a/internal/cmd/volume/backup/describe/describe.go +++ b/internal/cmd/volume/backup/describe/describe.go @@ -128,7 +128,7 @@ func outputResult(p *print.Printer, outputFormat string, backup *iaas.Backup) er table.AddSeparator() table.AddRow("NAME", utils.PtrString(backup.Name)) table.AddSeparator() - table.AddRow("SIZE", utils.PtrByteSizeDefault(backup.Size, "")) + table.AddRow("SIZE", utils.PtrGigaByteSizeDefault(backup.Size, "n/a")) table.AddSeparator() table.AddRow("STATUS", utils.PtrString(backup.Status)) table.AddSeparator() diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index 540c00480..f3d7062c7 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -184,7 +184,7 @@ func outputResult(p *print.Printer, outputFormat string, backups []iaas.Backup) table.AddRow( utils.PtrString(backup.Id), utils.PtrString(backup.Name), - utils.PtrByteSizeDefault(backup.Size, ""), + utils.PtrGigaByteSizeDefault(backup.Size, "n/a"), utils.PtrString(backup.Status), utils.PtrString(backup.SnapshotId), utils.PtrString(backup.VolumeId), diff --git a/internal/cmd/volume/backup/update/update_test.go b/internal/cmd/volume/backup/update/update_test.go index b0826ae65..21aa21c1e 100644 --- a/internal/cmd/volume/backup/update/update_test.go +++ b/internal/cmd/volume/backup/update/update_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -68,12 +69,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiUpdateBackupRequest)) iaas.Api payload := iaas.NewUpdateBackupPayloadWithDefaults() payload.Name = &testName - // Convert test labels to map[string]interface{} - labelsMap := map[string]interface{}{} - for k, v := range testLabels { - labelsMap[k] = v - } - payload.Labels = &labelsMap + payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(testLabels)) request = request.UpdateBackupPayload(*payload) for _, mod := range mods { diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go new file mode 100644 index 000000000..856b0a929 --- /dev/null +++ b/internal/cmd/volume/snapshot/create/create.go @@ -0,0 +1,171 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + volumeIdFlag = "volume-id" + nameFlag = "name" + labelsFlag = "labels" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + VolumeID string + Name *string + Labels map[string]string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a snapshot from a volume", + Long: "Creates a snapshot from a volume.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a snapshot from a volume with ID "xxx"`, + "$ stackit volume snapshot create --volume-id xxx"), + examples.NewExample( + `Create a snapshot from a volume with ID "xxx" and name "my-snapshot"`, + "$ stackit volume snapshot create --volume-id xxx --name my-snapshot"), + examples.NewExample( + `Create a snapshot from a volume with ID "xxx" and labels`, + "$ stackit volume snapshot create --volume-id xxx --labels key1=value1,key2=value2"), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + // Get volume name for label + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeID) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) + volumeLabel = model.VolumeID + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create snapshot from volume %q? (This cannot be undone)", volumeLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create snapshot: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating snapshot") + resp, err = wait.CreateSnapshotWaitHandler(ctx, apiClient, model.ProjectId, *resp.Id).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for snapshot creation: %w", err) + } + s.Stop() + } + + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + params.Printer.Outputf("%s snapshot of %q in %q. Snapshot ID: %s\n", operationState, volumeLabel, projectLabel, utils.PtrString(resp.Id)) + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), volumeIdFlag, "ID of the volume from which a snapshot should be created") + cmd.Flags().String(nameFlag, "", "Name of the snapshot") + cmd.Flags().StringToString(labelsFlag, nil, "Key-value string pairs as labels") + + err := flags.MarkFlagsRequired(cmd, volumeIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + volumeID := flags.FlagToStringValue(p, cmd, volumeIdFlag) + + name := flags.FlagToStringPointer(p, cmd, nameFlag) + labels := flags.FlagToStringToStringPointer(p, cmd, labelsFlag) + if labels == nil { + labels = &map[string]string{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + VolumeID: volumeID, + Name: name, + Labels: *labels, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateSnapshotRequest { + req := apiClient.CreateSnapshot(ctx, model.ProjectId) + payload := iaas.NewCreateSnapshotPayloadWithDefaults() + payload.VolumeId = &model.VolumeID + payload.Name = model.Name + payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(model.Labels)) + + req = req.CreateSnapshotPayload(*payload) + return req +} diff --git a/internal/cmd/volume/snapshot/create/create_test.go b/internal/cmd/volume/snapshot/create/create_test.go new file mode 100644 index 000000000..08c5c0baa --- /dev/null +++ b/internal/cmd/volume/snapshot/create/create_test.go @@ -0,0 +1,207 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +const ( + testName = "test-snapshot" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testVolumeId = uuid.NewString() + testLabels = map[string]string{"key1": "value1"} +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + volumeIdFlag: testVolumeId, + nameFlag: testName, + labelsFlag: "key1=value1", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + VolumeID: testVolumeId, + Name: utils.Ptr(testName), + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiCreateSnapshotRequest)) iaas.ApiCreateSnapshotRequest { + request := testClient.CreateSnapshot(testCtx, testProjectId) + payload := iaas.NewCreateSnapshotPayloadWithDefaults() + payload.VolumeId = &testVolumeId + payload.Name = utils.Ptr(testName) + + payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(testLabels)) + + request = request.CreateSnapshotPayload(*payload) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no volume id", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, volumeIdFlag) + }), + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "volume id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[volumeIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "only required flags", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + delete(flagValues, labelsFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Name = nil + model.Labels = make(map[string]string) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiCreateSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go new file mode 100644 index 000000000..0a4c17faa --- /dev/null +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -0,0 +1,127 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + snapshotIdArg = "SNAPSHOT_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + SnapshotId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", snapshotIdArg), + Short: "Deletes a snapshot", + Long: "Deletes a snapshot by its ID.", + Args: args.SingleArg(snapshotIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a snapshot with ID "xxx"`, + "$ stackit volume snapshot delete xxx"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get snapshot name for label + snapshotLabel, err := iaasUtils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.SnapshotId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) + snapshotLabel = model.SnapshotId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete snapshot %q? (This cannot be undone)", snapshotLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete snapshot: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Deleting snapshot") + _, err = wait.DeleteSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.SnapshotId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for snapshot deletion: %w", err) + } + s.Stop() + } + + operationState := "Deleted" + if model.Async { + operationState = "Triggered deletion of" + } + params.Printer.Outputf("%s snapshot %q\n", operationState, snapshotLabel) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + snapshotId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SnapshotId: snapshotId, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteSnapshotRequest { + return apiClient.DeleteSnapshot(ctx, model.ProjectId, model.SnapshotId) +} diff --git a/internal/cmd/volume/snapshot/delete/delete_test.go b/internal/cmd/volume/snapshot/delete/delete_test.go new file mode 100644 index 000000000..bf1f87d15 --- /dev/null +++ b/internal/cmd/volume/snapshot/delete/delete_test.go @@ -0,0 +1,197 @@ +package delete + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testSnapshotId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testSnapshotId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + SnapshotId: testSnapshotId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiDeleteSnapshotRequest)) iaas.ApiDeleteSnapshotRequest { + request := testClient.DeleteSnapshot(testCtx, testProjectId, testSnapshotId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "snapshot id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiDeleteSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/volume/snapshot/describe/describe.go b/internal/cmd/volume/snapshot/describe/describe.go new file mode 100644 index 000000000..7ae36212e --- /dev/null +++ b/internal/cmd/volume/snapshot/describe/describe.go @@ -0,0 +1,157 @@ +package describe + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + snapshotIdArg = "SNAPSHOT_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + SnapshotId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", snapshotIdArg), + Short: "Describes a snapshot", + Long: "Describes a snapshot by its ID.", + Args: args.SingleArg(snapshotIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of a snapshot with ID "xxx"`, + "$ stackit volume snapshot describe xxx"), + examples.NewExample( + `Get details of a snapshot with ID "xxx" in JSON format`, + "$ stackit volume snapshot describe xxx --output-format json"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get snapshot details: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + snapshotId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SnapshotId: snapshotId, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetSnapshotRequest { + return apiClient.GetSnapshot(ctx, model.ProjectId, model.SnapshotId) +} + +func outputResult(p *print.Printer, outputFormat string, snapshot *iaas.Snapshot) error { + if snapshot == nil { + return fmt.Errorf("get snapshot response is empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(snapshot, "", " ") + if err != nil { + return fmt.Errorf("marshal snapshot: %w", err) + } + p.Outputln(string(details)) + return nil + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(snapshot, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal snapshot: %w", err) + } + p.Outputln(string(details)) + return nil + + default: + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(snapshot.Id)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(snapshot.Name)) + table.AddSeparator() + table.AddRow("SIZE", utils.PtrGigaByteSizeDefault(snapshot.Size, "n/a")) + table.AddSeparator() + table.AddRow("STATUS", utils.PtrString(snapshot.Status)) + table.AddSeparator() + table.AddRow("VOLUME ID", utils.PtrString(snapshot.VolumeId)) + table.AddSeparator() + + if snapshot.Labels != nil && len(*snapshot.Labels) > 0 { + labels := []string{} + for key, value := range *snapshot.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + table.AddRow("LABELS", strings.Join(labels, "\n")) + table.AddSeparator() + } + + table.AddRow("CREATED AT", utils.ConvertTimePToDateTimeString(snapshot.CreatedAt)) + table.AddSeparator() + table.AddRow("UPDATED AT", utils.ConvertTimePToDateTimeString(snapshot.UpdatedAt)) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + } +} diff --git a/internal/cmd/volume/snapshot/describe/describe_test.go b/internal/cmd/volume/snapshot/describe/describe_test.go new file mode 100644 index 000000000..5d501758f --- /dev/null +++ b/internal/cmd/volume/snapshot/describe/describe_test.go @@ -0,0 +1,242 @@ +package describe + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testSnapshotId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testSnapshotId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + SnapshotId: testSnapshotId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiGetSnapshotRequest)) iaas.ApiGetSnapshotRequest { + request := testClient.GetSnapshot(testCtx, testProjectId, testSnapshotId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "snapshot id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiGetSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + snapshot *iaas.Snapshot + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty snapshot", + args: args{ + snapshot: &iaas.Snapshot{}, + }, + wantErr: false, + }, + { + name: "snapshot with values", + args: args{ + snapshot: &iaas.Snapshot{ + Id: utils.Ptr("snapshot-1"), + Name: utils.Ptr("test-snapshot"), + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.snapshot); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go new file mode 100644 index 000000000..83b59987c --- /dev/null +++ b/internal/cmd/volume/snapshot/list/list.go @@ -0,0 +1,198 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + limitFlag = "limit" + labelSelectorFlag = "label-selector" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 + LabelSelector *string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all snapshots", + Long: "Lists all snapshots in a project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all snapshots`, + "$ stackit volume snapshot list"), + examples.NewExample( + `List snapshots with a limit of 10`, + "$ stackit volume snapshot list --limit 10"), + examples.NewExample( + `List snapshots filtered by label`, + "$ stackit volume snapshot list --label-selector key1=value1"), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list snapshots: %w", err) + } + + // Check if response is empty + if resp.Items == nil || len(*resp.Items) == 0 { + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + params.Printer.Info("No snapshots found for project %q\n", projectLabel) + return nil + } + + snapshots := *resp.Items + + // Apply limit if specified + if model.Limit != nil && int(*model.Limit) < len(snapshots) { + snapshots = snapshots[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, snapshots) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + cmd.Flags().String(labelSelectorFlag, "", "Filter snapshots by labels") +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + labelSelector := flags.FlagToStringPointer(p, cmd, labelSelectorFlag) + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + LabelSelector: labelSelector, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListSnapshotsRequest { + req := apiClient.ListSnapshots(ctx, model.ProjectId) + if model.LabelSelector != nil { + req = req.LabelSelector(*model.LabelSelector) + } + return req +} + +func outputResult(p *print.Printer, outputFormat string, snapshots []iaas.Snapshot) error { + if snapshots == nil { + return fmt.Errorf("list snapshots response is empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(snapshots, "", " ") + if err != nil { + return fmt.Errorf("marshal snapshots: %w", err) + } + p.Outputln(string(details)) + return nil + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(snapshots, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal snapshots: %w", err) + } + p.Outputln(string(details)) + return nil + + default: + table := tables.NewTable() + table.SetHeader("ID", "NAME", "SIZE", "STATUS", "VOLUME ID", "LABELS", "CREATED AT", "UPDATED AT") + + for _, snapshot := range snapshots { + var labelsString string + if snapshot.Labels != nil { + var labels []string + for key, value := range *snapshot.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + labelsString = strings.Join(labels, "\n") + } + table.AddRow( + utils.PtrString(snapshot.Id), + utils.PtrString(snapshot.Name), + utils.PtrGigaByteSizeDefault(snapshot.Size, "n/a"), + utils.PtrString(snapshot.Status), + utils.PtrString(snapshot.VolumeId), + labelsString, + utils.ConvertTimePToDateTimeString(snapshot.CreatedAt), + utils.ConvertTimePToDateTimeString(snapshot.UpdatedAt), + ) + table.AddSeparator() + } + + p.Outputln(table.Render()) + return nil + } +} diff --git a/internal/cmd/volume/snapshot/list/list_test.go b/internal/cmd/volume/snapshot/list/list_test.go new file mode 100644 index 000000000..e1f68f1b1 --- /dev/null +++ b/internal/cmd/volume/snapshot/list/list_test.go @@ -0,0 +1,250 @@ +package list + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", + labelSelectorFlag: "key1=value1", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + Limit: utils.Ptr(int64(10)), + LabelSelector: utils.Ptr("key1=value1"), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiListSnapshotsRequest)) iaas.ApiListSnapshotsRequest { + request := testClient.ListSnapshots(testCtx, testProjectId) + request = request.LabelSelector("key1=value1") + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "limit invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "limit invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + { + description: "only required flags", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, limitFlag) + delete(flagValues, labelSelectorFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = nil + model.LabelSelector = nil + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiListSnapshotsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "without label selector", + model: fixtureInputModel(func(model *inputModel) { + model.LabelSelector = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiListSnapshotsRequest) { + *request = testClient.ListSnapshots(testCtx, testProjectId) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + snapshots []iaas.Snapshot + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "empty snapshot in slice", + args: args{ + snapshots: []iaas.Snapshot{{}}, + }, + wantErr: false, + }, + { + name: "snapshots as argument", + args: args{ + snapshots: []iaas.Snapshot{ + { + Id: utils.Ptr("snapshot-1"), + }, + { + Id: utils.Ptr("snapshot-2"), + }, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.snapshots); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/volume/snapshot/snapshot.go b/internal/cmd/volume/snapshot/snapshot.go new file mode 100644 index 000000000..9656b1465 --- /dev/null +++ b/internal/cmd/volume/snapshot/snapshot.go @@ -0,0 +1,33 @@ +package snapshot + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "snapshot", + Short: "Provides functionality for snapshots", + Long: "Provides functionality for snapshots.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) +} diff --git a/internal/cmd/volume/snapshot/update/update.go b/internal/cmd/volume/snapshot/update/update.go new file mode 100644 index 000000000..543c484d1 --- /dev/null +++ b/internal/cmd/volume/snapshot/update/update.go @@ -0,0 +1,143 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + snapshotIdArg = "SNAPSHOT_ID" + nameFlag = "name" + labelsFlag = "labels" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + SnapshotId string + Name *string + Labels map[string]string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", snapshotIdArg), + Short: "Updates a snapshot", + Long: "Updates a snapshot by its ID.", + Args: args.SingleArg(snapshotIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update a snapshot name with ID "xxx"`, + "$ stackit volume snapshot update xxx --name my-new-name"), + examples.NewExample( + `Update a snapshot labels with ID "xxx"`, + "$ stackit volume snapshot update xxx --labels key1=value1,key2=value2"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get snapshot name for label + snapshotLabel, err := iaasUtils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.SnapshotId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) + snapshotLabel = model.SnapshotId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update snapshot %q?", snapshotLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("update snapshot: %w", err) + } + + params.Printer.Outputf("Updated snapshot %q\n", snapshotLabel) + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(nameFlag, "", "Name of the snapshot") + cmd.Flags().StringToString(labelsFlag, nil, "Key-value string pairs as labels") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + snapshotId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + name := flags.FlagToStringPointer(p, cmd, nameFlag) + labels := flags.FlagToStringToStringPointer(p, cmd, labelsFlag) + if labels == nil { + labels = &map[string]string{} + } + + if name == nil && len(*labels) == 0 { + return nil, fmt.Errorf("either name or labels must be provided") + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SnapshotId: snapshotId, + Name: name, + Labels: *labels, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateSnapshotRequest { + req := apiClient.UpdateSnapshot(ctx, model.ProjectId, model.SnapshotId) + payload := iaas.NewUpdateSnapshotPayloadWithDefaults() + payload.Name = model.Name + payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(model.Labels)) + + req = req.UpdateSnapshotPayload(*payload) + return req +} diff --git a/internal/cmd/volume/snapshot/update/update_test.go b/internal/cmd/volume/snapshot/update/update_test.go new file mode 100644 index 000000000..cb4af61fc --- /dev/null +++ b/internal/cmd/volume/snapshot/update/update_test.go @@ -0,0 +1,240 @@ +package update + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testSnapshotId = uuid.NewString() + testName = "test-snapshot" + testLabels = map[string]string{"key1": "value1"} +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testSnapshotId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + nameFlag: testName, + labelsFlag: "key1=value1", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + SnapshotId: testSnapshotId, + Name: &testName, + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiUpdateSnapshotRequest)) iaas.ApiUpdateSnapshotRequest { + request := testClient.UpdateSnapshot(testCtx, testProjectId, testSnapshotId) + payload := iaas.NewUpdateSnapshotPayloadWithDefaults() + payload.Name = &testName + payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(testLabels)) + + request = request.UpdateSnapshotPayload(*payload) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "snapshot id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no update flags", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + delete(flagValues, labelsFlag) + }), + isValid: false, + }, + { + description: "only name flag", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, labelsFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Labels = make(map[string]string) + }), + }, + { + description: "only labels flag", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Name = nil + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiUpdateSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/volume/volume.go b/internal/cmd/volume/volume.go index d5cad1614..8da9cbd13 100644 --- a/internal/cmd/volume/volume.go +++ b/internal/cmd/volume/volume.go @@ -9,6 +9,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/volume/list" performanceclass "github.com/stackitcloud/stackit-cli/internal/cmd/volume/performance-class" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/resize" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -36,5 +37,6 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(update.NewCmd(params)) cmd.AddCommand(resize.NewCmd(params)) cmd.AddCommand(performanceclass.NewCmd(params)) + cmd.AddCommand(snapshot.NewCmd(params)) cmd.AddCommand(backup.NewCmd(params)) } diff --git a/internal/pkg/services/iaas/utils/utils.go b/internal/pkg/services/iaas/utils/utils.go index f3d3571d7..2cf460334 100644 --- a/internal/pkg/services/iaas/utils/utils.go +++ b/internal/pkg/services/iaas/utils/utils.go @@ -177,6 +177,10 @@ func GetSnapshotName(ctx context.Context, apiClient IaaSClient, projectId, snaps resp, err := apiClient.GetSnapshotExecute(ctx, projectId, snapshotId) if err != nil { return "", fmt.Errorf("get snapshot: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil } return *resp.Name, nil } diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index a26d7b4b2..2db0936b8 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -119,6 +119,15 @@ func PtrByteSizeDefault(size *int64, defaultValue string) string { return bytesize.New(float64(*size)).String() } +// PtrGigaByteSizeDefault return the value of an int64 pointer to a string representation of gigabytes. If the pointer is nil, +// it returns the [defaultValue]. +func PtrGigaByteSizeDefault(size *int64, defaultValue string) string { + if size == nil { + return defaultValue + } + return (bytesize.New(float64(*size)) * bytesize.GB).String() +} + // Base64Encode encodes a []byte to a base64 representation as string func Base64Encode(message []byte) string { b := make([]byte, base64.StdEncoding.EncodedLen(len(message))) From eb4cd720f7159ab158b62f3bbe6c02bbde04ec79 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Mon, 30 Jun 2025 11:07:41 +0200 Subject: [PATCH 057/422] fix: replaced deprecated brews config in goreleaser (#811) Co-authored-by: Alexander Dahmen --- .goreleaser.yaml | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index b0195645c..f8c772377 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -32,6 +32,7 @@ builds: - amd64 hooks: post: + # Signing - cmd: codesign -s "{{.Env.APPLE_APPLICATION_IDENTITY}}" -f -v --options=runtime "dist/macos-builds_{{.Target}}/{{.Name}}" output: true - cmd: codesign -vvv --deep --strict "dist/macos-builds_{{.Target}}/{{.Name}}" @@ -46,12 +47,29 @@ builds: output: true - cmd: spctl -a -t open --context context:primary-signature -v dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg output: true + # Completion files + - cmd: mkdir -p dist/macos-builds_{{.Target}}/completions + - cmd: sh -c './dist/macos-builds_{{.Target}}/{{.Name}} completion zsh > ./dist/macos-builds_{{.Target}}/completions/stackit.zsh' + - cmd: sh -c './dist/macos-builds_{{.Target}}/{{.Name}} completion bash > ./dist/macos-builds_{{.Target}}/completions/stackit.bash' + - cmd: sh -c './dist/macos-builds_{{.Target}}/{{.Name}} completion fish > ./dist/macos-builds_{{.Target}}/completions/stackit.fish' archives: - - formats: [ 'tar.gz' ] + - ids: + - linux-builds + - windows-builds + formats: [ 'tar.gz' ] format_overrides: - goos: windows formats: [ 'zip' ] + - id: macos-archives + ids: + - macos-builds + formats: [ 'tar.gz' ] + files: + - src: ./dist/macos-builds_{{.Target}}/completions/* + dst: completions + - LICENSE.md + - README.md release: # If set to auto, the GitHub release will be marked as "Pre-release" @@ -96,8 +114,11 @@ signs: "${artifact}", ] -brews: +homebrew_casks: - name: stackit + directory: Casks + conflicts: + - formula: stackit repository: owner: stackitcloud name: homebrew-tap @@ -106,14 +127,14 @@ brews: email: noreply@stackit.de homepage: "https://github.com/stackitcloud/stackit-cli" description: "A command-line interface to manage STACKIT resources.\nThis CLI is in a beta state. More services and functionality will be supported soon." - directory: Formula license: "Apache-2.0" # If set to auto, the release will not be uploaded to the homebrew tap repo # if the tag has a prerelease indicator (e.g. v0.0.1-alpha1) skip_upload: auto - install: | - bin.install "stackit" - generate_completions_from_executable(bin/"stackit", "completion") + completions: + zsh: ./completions/stackit.zsh + bash: ./completions/stackit.bash + fish: ./completions/stackit.fish snapcrafts: # IDs of the builds for which to create packages for From b6ed745e5a1eb20b981bf51df3b35ce376f54fb0 Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Mon, 30 Jun 2025 11:43:39 +0200 Subject: [PATCH 058/422] Add installation instructions for rpm packages (#827) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add installation instructions for rpm packages Signed-off-by: Alexander Dahmen * Update INSTALLATION.md Co-authored-by: Ruben Hönle --------- Signed-off-by: Alexander Dahmen Co-authored-by: Ruben Hönle --- INSTALLATION.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/INSTALLATION.md b/INSTALLATION.md index 72d06b8ec..35bdd5149 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -90,6 +90,18 @@ asset_filters=["stackit-cli_", "_linux_amd64.tar.gz"] eget stackitcloud/stackit-cli ``` +#### RPM package via dnf, yum and zypper + +The STACKIT CLI is available as [RPM Package](https://github.com/stackitcloud/stackit-cli/releases) and can be installed via dnf, yum and zypper package manager. + +Just download the rpm package from the [release page](https://github.com/stackitcloud/stackit-cli/releases) and run the install command like the following: + +```shell +dnf install stackitcli.rpm +yum install stackitcli.rpm +zypper install stackitcli.rpm +``` + #### Any distribution Alternatively, you can install via [Homebrew](https://brew.sh/) or refer to one of the installation methods below. From ae7bb742190c65d2e062cf2fc5aa779bb19839bf Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 30 Jun 2025 13:18:00 +0200 Subject: [PATCH 059/422] fix(deps): update stackit sdk modules (#826) * fix(deps): update stackit sdk modules * Update docs Signed-off-by: Alexander Dahmen --------- Signed-off-by: Alexander Dahmen Co-authored-by: Renovate Bot Co-authored-by: Alexander Dahmen --- docs/stackit_dns_record-set_create.md | 2 +- go.mod | 14 +++++++------- go.sum | 28 +++++++++++++-------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/docs/stackit_dns_record-set_create.md b/docs/stackit_dns_record-set_create.md index dfb740ad9..4f51534ad 100644 --- a/docs/stackit_dns_record-set_create.md +++ b/docs/stackit_dns_record-set_create.md @@ -25,7 +25,7 @@ stackit dns record-set create [flags] --name string Name of the record, should be compliant with RFC1035, Section 2.3.4 --record strings Records belonging to the record set --ttl int Time to live, if not provided defaults to the zone's default TTL - --type string Record type, one of ["A" "AAAA" "SOA" "CNAME" "NS" "MX" "TXT" "SRV" "PTR" "ALIAS" "DNAME" "CAA" "DNSKEY" "DS" "LOC" "NAPTR" "SSHFP" "TLSA" "URI" "CERT" "SVCB"] (default "A") + --type string Record type, one of ["A" "AAAA" "SOA" "CNAME" "NS" "MX" "TXT" "SRV" "PTR" "ALIAS" "DNAME" "CAA" "DNSKEY" "DS" "LOC" "NAPTR" "SSHFP" "TLSA" "URI" "CERT" "SVCB" "TYPE" "CSYNC" "HINFO" "HTTPS"] (default "A") --zone-id string Zone ID ``` diff --git a/go.mod b/go.mod index 505be5323..df13fa311 100644 --- a/go.mod +++ b/go.mod @@ -18,12 +18,12 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 @@ -32,7 +32,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.25.0 golang.org/x/oauth2 v0.30.0 @@ -241,8 +241,8 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.33.0 // indirect diff --git a/go.sum b/go.sum index 5c6291045..d44916ac4 100644 --- a/go.sum +++ b/go.sum @@ -568,12 +568,12 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 h1:7UKUi7Od7KpuVjV4I/ github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 h1:KXMiTBV4KcOEQRFddtOUFspL+KRvjDQNDIs73bdiey0= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0/go.mod h1:+2mx2MclJFMQ4Y6b20jspYAnIeFJP3/yvO6Gfvcvf6Q= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0 h1:86F0qHx2YOzxoGkcFX1tT20+Yz1mwaPPS2aFODxuMpY= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.16.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 h1:x5mx/C2bdtpOH974RofXD0Y8YOyJtYXwIyaCyWOXMwU= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 h1:C+8z3MdvnTngcH9L72VHLXRKNWHHYp+7FO/F6imKmB4= github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.25.0 h1:K9RjMPlEK1XQegZBMIrI/KHAorzRdOt5YpftsT7pMEk= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.25.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 h1:7qm/Tft79wFlHomPdgjUJ9uJU8kEk+k9ficMGRoHtf0= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCxpFXN2K7g2ih0gQM6cyZ1VhTmtQfI= @@ -586,14 +586,14 @@ github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSG github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 h1:8v9Iupkc3meXcVPMpteXDz07YzY2M5jud50vEtAvbs8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1 h1:E6vCqPn1NiPHnbnvqLNQNz6a/cmeyRb5iA9cDUPtP58= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.23.1/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0 h1:r29a9GoBLVw2VZSzdPftlIsE5t7shdxobwoT6NVUIjU= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.1.0/go.mod h1:4g/L5PHfz1xk3udEhvPy2nXiH4UgRO5Cj6iwUa7k5VQ= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1 h1:2rDFwJtZOFYFUiJqJ9uIwM+mu+BbtuVaUHARRJtrZPU= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.24.1/go.mod h1:YL0l9l9xzJy2BmV+U9XkcXlQaHbE2KyA37GpGvBXIJ4= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1 h1:4H+GL4eLEO116Vlh0pe+udGGYnMohA8YhLW9KYGdEOc= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.24.1/go.mod h1:PAQH8+1DDGc6uibvC3nDtfRLu8uxutIr25mPJvrCOy8= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 h1:+qFjzDDv/0ZHGdVuW2HzAphRBmlc1+abw7k1RaAqmQo= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 h1:DGgKKCh3AmUBqDG0DrsWVcclxSaG82TVEf18A29w+J0= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0/go.mod h1:I67K+QjPAIMrW/r/0GOdX2WSmA8J72LNzpe8rElfxFI= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0 h1:Xhgo0Di6NDjkg0Bf3f6LHlQ09u0Dj/3WdDb0xd47vEU= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0/go.mod h1:YL0l9l9xzJy2BmV+U9XkcXlQaHbE2KyA37GpGvBXIJ4= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 h1:wdQoQ9RUkpX80twtG9xUghW9Xn1ka9zOjIxJDLbtwSo= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0/go.mod h1:PAQH8+1DDGc6uibvC3nDtfRLu8uxutIr25mPJvrCOy8= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 h1:lxI0LnHcTpnF8g0tHTCQ1UIVLlNHk1W1WAclp3Ut0fw= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0/go.mod h1:TBvZpbCju0Zmq8GoS4CEtUg2MqtdqWrGeEAOXwkJNQo= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 h1:ewFXnESJWsUen0T9sSt0lwL28fhqCVB1HSLdY0szrdA= @@ -610,8 +610,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1Ts github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0 h1:bwLmLXvtCl1XkPRP+YrXwfz+lBMaGWH/crlNbYtxeqE= github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0 h1:WvPLO1c7oT/MWmCRTt7jRyxus2g3DIluIW5iAsUpSFM= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.2.0/go.mod h1:CyYJqR0tZWs2r5bGz69j4bmvhxdsd4QLCm1Uf+LouB0= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 h1:pUl/981oAXPnZd7++69NfEWv6JwW9UpxER16XxQUdOk= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0/go.mod h1:S04/QsQrB2EgYGjl62BO+9QUswrlRBoBosigrhdmccM= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From b16d44833828f12a74cec6f5bb18e262a7176daa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:51:56 +0200 Subject: [PATCH 060/422] chore(deps): bump renovatebot/github-action from 43.0.1 to 43.0.2 (#828) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.1 to 43.0.2. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.1...v43.0.2) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index ffb733574..2e1f2a8e3 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.1 + uses: renovatebot/github-action@v43.0.2 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From e40da0d8d52a033b4d6932fc9da8770b43663dca Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 1 Jul 2025 10:52:05 +0200 Subject: [PATCH 061/422] chore(deps): update renovatebot/github-action action to v43.0.2 (#829) Co-authored-by: Renovate Bot From 4586494efc29e3e9f4da3d8e1327a75b780222c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jul 2025 16:18:43 +0200 Subject: [PATCH 062/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#832) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mongodbflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.1 to 1.3.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.2.1...services/cdn/v1.3.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mongodbflex dependency-version: 1.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index df13fa311..0e45e99f3 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 diff --git a/go.sum b/go.sum index d44916ac4..d8ebc3717 100644 --- a/go.sum +++ b/go.sum @@ -580,8 +580,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCx github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1 h1:TWz7qJ4Mg5pquDXODSZ1dzhS95ZYn3w1aKjuRU2VqCg= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.2.1/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0 h1:3R3S2R3m4Auh3cANM3t+AVDhWTKylXQHNBk42TKSbR4= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 h1:8v9Iupkc3meXcVPMpteXDz07YzY2M5jud50vEtAvbs8= From a57fd5803951ad746e9f37437ef4de957296afe5 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 7 Jul 2025 09:31:17 +0200 Subject: [PATCH 063/422] fix(deps): update stackit sdk modules (#838) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 0e45e99f3..ed253d620 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 @@ -27,7 +27,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 diff --git a/go.sum b/go.sum index d8ebc3717..fc887f795 100644 --- a/go.sum +++ b/go.sum @@ -570,8 +570,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 h1:KXMiTBV4 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0/go.mod h1:+2mx2MclJFMQ4Y6b20jspYAnIeFJP3/yvO6Gfvcvf6Q= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 h1:x5mx/C2bdtpOH974RofXD0Y8YOyJtYXwIyaCyWOXMwU= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= -github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0 h1:C+8z3MdvnTngcH9L72VHLXRKNWHHYp+7FO/F6imKmB4= -github.com/stackitcloud/stackit-sdk-go/services/git v0.6.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= +github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 h1:UJDtK96cjQqp5yWb8TxXLG42SOGcnBSgfYO7P3pk/j0= +github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 h1:7qm/Tft79wFlHomPdgjUJ9uJU8kEk+k9ficMGRoHtf0= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= @@ -600,8 +600,8 @@ github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 h1:ewFXnESJWsU github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 h1:CtCaG8nycfviq/QgNM7OoBWs/Ap9IQvOmvI0tZhYdPI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0/go.mod h1:/MiR18oug1V0sxPT4KO6a+LhgPARNBGvgVx3qv3zJ0A= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.0 h1:LGiq+2o2D3snaL1vqBQkvPTAEVPT2PKPrJzQL07hZgY= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.0/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1 h1:pvAYt53jUSUf1yHQJ+mcjQ+sgrpUBBqfw1EznGnP5A4= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 h1:poL/Hz3a6OHZ/eKtwMGm5nLqC3fEJjzPQlN/7/+mk8Y= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0/go.mod h1:ssbyAHtxyuBvheMEItydM78/JxjDl3naUtllrC7ghDs= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 h1:2d28WFQB9QB3af4uoPFglQDhH1LepEe6F2YoFCBecVI= From fcd206796252cf6e67b24fe41ffd462ec8d43b29 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:04:43 +0200 Subject: [PATCH 064/422] chore: update code owners (#840) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index eab47aae8..7ec96a1b5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @marceljk @bahkauv70 @Fyusel @rubenhoenle \ No newline at end of file +* @stackitcloud/developer-tools \ No newline at end of file From 3bf6282d3f2fe4afe0e5b0a94bdb474c38c02aca Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:57:38 +0200 Subject: [PATCH 065/422] fix(image): update overwrites nullable values (#834) * feat: add architecture flag #833 * fix: update overwrites nullable values #830 --- docs/stackit_image_create.md | 1 + docs/stackit_image_update.md | 1 + internal/cmd/image/create/create.go | 60 ++++++++++++++++------ internal/cmd/image/create/create_test.go | 4 ++ internal/cmd/image/describe/describe.go | 4 ++ internal/cmd/image/list/list.go | 13 +++-- internal/cmd/image/update/update.go | 65 ++++++++++++++++++------ internal/cmd/image/update/update_test.go | 25 +++++++++ 8 files changed, 138 insertions(+), 35 deletions(-) diff --git a/docs/stackit_image_create.md b/docs/stackit_image_create.md index 3c608126c..1dbfc5278 100644 --- a/docs/stackit_image_create.md +++ b/docs/stackit_image_create.md @@ -23,6 +23,7 @@ stackit image create [flags] ### Options ``` + --architecture string Sets the CPU architecture. By default x86 is used. --boot-menu Enables the BIOS bootmenu. --cdrom-bus string Sets CDROM bus controller type. --disk-bus string Sets Disk bus controller type. diff --git a/docs/stackit_image_update.md b/docs/stackit_image_update.md index 3c6acbe62..d088d9962 100644 --- a/docs/stackit_image_update.md +++ b/docs/stackit_image_update.md @@ -23,6 +23,7 @@ stackit image update IMAGE_ID [flags] ### Options ``` + --architecture string Sets the CPU architecture. --boot-menu Enables the BIOS bootmenu. --cdrom-bus string Sets CDROM bus controller type. --disk-bus string Sets Disk bus controller type. diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index d25c6adc4..0e0a84cbb 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -31,6 +31,7 @@ const ( localFilePathFlag = "local-file-path" noProgressIndicatorFlag = "no-progress" + architectureFlag = "architecture" bootMenuFlag = "boot-menu" cdromBusFlag = "cdrom-bus" diskBusFlag = "disk-bus" @@ -53,6 +54,7 @@ const ( ) type imageConfig struct { + Architecture *string BootMenu *bool CdromBus *string DiskBus *string @@ -261,6 +263,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(localFilePathFlag, "", "The path to the local disk image file.") cmd.Flags().Bool(noProgressIndicatorFlag, false, "Show no progress indicator for upload.") + cmd.Flags().String(architectureFlag, "", "Sets the CPU architecture. By default x86 is used.") cmd.Flags().Bool(bootMenuFlag, false, "Enables the BIOS bootmenu.") cmd.Flags().String(cdromBusFlag, "", "Sets CDROM bus controller type.") cmd.Flags().String(diskBusFlag, "", "Sets Disk bus controller type.") @@ -302,6 +305,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag), NoProgressIndicator: flags.FlagToBoolPointer(p, cmd, noProgressIndicatorFlag), Config: &imageConfig{ + Architecture: flags.FlagToStringPointer(p, cmd, architectureFlag), BootMenu: flags.FlagToBoolPointer(p, cmd, bootMenuFlag), CdromBus: flags.FlagToStringPointer(p, cmd, cdromBusFlag), DiskBus: flags.FlagToStringPointer(p, cmd, diskBusFlag), @@ -348,21 +352,47 @@ func createPayload(_ context.Context, model *inputModel) iaas.CreateImagePayload MinRam: model.MinRam, Protected: model.Protected, } - if model.Config != nil { - payload.Config = &iaas.ImageConfig{ - BootMenu: model.Config.BootMenu, - CdromBus: iaas.NewNullableString(model.Config.CdromBus), - DiskBus: iaas.NewNullableString(model.Config.DiskBus), - NicModel: iaas.NewNullableString(model.Config.NicModel), - OperatingSystem: model.Config.OperatingSystem, - OperatingSystemDistro: iaas.NewNullableString(model.Config.OperatingSystemDistro), - OperatingSystemVersion: iaas.NewNullableString(model.Config.OperatingSystemVersion), - RescueBus: iaas.NewNullableString(model.Config.RescueBus), - RescueDevice: iaas.NewNullableString(model.Config.RescueDevice), - SecureBoot: model.Config.SecureBoot, - Uefi: utils.Ptr(model.Config.Uefi), - VideoModel: iaas.NewNullableString(model.Config.VideoModel), - VirtioScsi: model.Config.VirtioScsi, + if config := model.Config; config != nil { + payload.Config = &iaas.ImageConfig{} + payload.Config.Uefi = utils.Ptr(config.Uefi) + if config.Architecture != nil { + payload.Config.Architecture = model.Config.Architecture + } + if config.BootMenu != nil { + payload.Config.BootMenu = model.Config.BootMenu + } + if config.CdromBus != nil { + payload.Config.CdromBus = iaas.NewNullableString(model.Config.CdromBus) + } + if config.DiskBus != nil { + payload.Config.DiskBus = iaas.NewNullableString(config.DiskBus) + } + if config.NicModel != nil { + payload.Config.NicModel = iaas.NewNullableString(config.NicModel) + } + if config.OperatingSystem != nil { + payload.Config.OperatingSystem = config.OperatingSystem + } + if config.OperatingSystemDistro != nil { + payload.Config.OperatingSystemDistro = iaas.NewNullableString(config.OperatingSystemDistro) + } + if config.OperatingSystemVersion != nil { + payload.Config.OperatingSystemVersion = iaas.NewNullableString(config.OperatingSystemVersion) + } + if config.RescueBus != nil { + payload.Config.RescueBus = iaas.NewNullableString(config.RescueBus) + } + if config.RescueDevice != nil { + payload.Config.RescueDevice = iaas.NewNullableString(config.RescueDevice) + } + if config.SecureBoot != nil { + payload.Config.SecureBoot = config.SecureBoot + } + if config.VideoModel != nil { + payload.Config.VideoModel = iaas.NewNullableString(config.VideoModel) + } + if config.VirtioScsi != nil { + payload.Config.VirtioScsi = config.VirtioScsi } } diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index e0ed042c9..45a926fbf 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -39,6 +39,7 @@ var ( testOperatingSystemVersion = "test-distro-version" testRescueBus = "test-rescue-bus" testRescueDevice = "test-rescue-device" + testArchitecture = "arm64" testBootmenu = true testSecureBoot = true testUefi = true @@ -54,6 +55,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st nameFlag: testName, diskFormatFlag: testDiskFormat, localFilePathFlag: testLocalImagePath, + architectureFlag: testArchitecture, bootMenuFlag: strconv.FormatBool(testBootmenu), cdromBusFlag: testCdRomBus, diskBusFlag: testDiskBus, @@ -96,6 +98,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { LocalFilePath: testLocalImagePath, Labels: utils.Ptr(parseLabels(testLabels)), Config: &imageConfig{ + Architecture: &testArchitecture, BootMenu: &testBootmenu, CdromBus: &testCdRomBus, DiskBus: &testDiskBus, @@ -123,6 +126,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureCreatePayload(mods ...func(payload *iaas.CreateImagePayload)) (payload iaas.CreateImagePayload) { payload = iaas.CreateImagePayload{ Config: &iaas.ImageConfig{ + Architecture: &testArchitecture, BootMenu: &testBootmenu, CdromBus: iaas.NewNullableString(&testCdRomBus), DiskBus: iaas.NewNullableString(&testDiskBus), diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index d1c945b81..9a5e5e918 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -141,6 +141,10 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.Image) error table.AddSeparator() } if config := resp.Config; config != nil { + if architecture := config.Architecture; architecture != nil { + table.AddRow("ARCHITECTURE", *architecture) + table.AddSeparator() + } if os := config.OperatingSystem; os != nil { table.AddRow("OPERATING SYSTEM", *os) table.AddSeparator() diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index 00f28b066..67e0c951c 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -165,14 +165,18 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err return nil default: table := tables.NewTable() - table.SetHeader("ID", "NAME", "OS", "DISTRIBUTION", "VERSION", "LABELS") + table.SetHeader("ID", "NAME", "OS", "ARCHITECTURE", "DISTRIBUTION", "VERSION", "LABELS") for _, item := range items { var ( - os string = "n/a" - distro string = "n/a" - version string = "n/a" + architecture string = "n/a" + os string = "n/a" + distro string = "n/a" + version string = "n/a" ) if cfg := item.Config; cfg != nil { + if v := cfg.Architecture; v != nil { + architecture = *v + } if v := cfg.OperatingSystem; v != nil { os = *v } @@ -186,6 +190,7 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err table.AddRow(utils.PtrString(item.Id), utils.PtrString(item.Name), os, + architecture, distro, version, utils.JoinStringKeysPtr(*item.Labels, ",")) diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index f461a388d..e434f1238 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -20,6 +20,7 @@ import ( ) type imageConfig struct { + Architecture *string BootMenu *bool CdromBus *string DiskBus *string @@ -80,6 +81,7 @@ const ( nameFlag = "name" diskFormatFlag = "disk-format" + architectureFlag = "architecture" bootMenuFlag = "boot-menu" cdromBusFlag = "cdrom-bus" diskBusFlag = "disk-bus" @@ -98,7 +100,6 @@ const ( minDiskSizeFlag = "min-disk-size" minRamFlag = "min-ram" - ownerFlag = "owner" protectedFlag = "protected" ) @@ -166,6 +167,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(nameFlag, "", "The name of the image.") cmd.Flags().String(diskFormatFlag, "", "The disk format of the image. ") + cmd.Flags().String(architectureFlag, "", "Sets the CPU architecture.") cmd.Flags().Bool(bootMenuFlag, false, "Enables the BIOS bootmenu.") cmd.Flags().String(cdromBusFlag, "", "Sets CDROM bus controller type.") cmd.Flags().String(diskBusFlag, "", "Sets Disk bus controller type.") @@ -203,6 +205,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM DiskFormat: flags.FlagToStringPointer(p, cmd, diskFormatFlag), Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag), Config: &imageConfig{ + Architecture: flags.FlagToStringPointer(p, cmd, architectureFlag), BootMenu: flags.FlagToBoolPointer(p, cmd, bootMenuFlag), CdromBus: flags.FlagToStringPointer(p, cmd, cdromBusFlag), DiskBus: flags.FlagToStringPointer(p, cmd, diskBusFlag), @@ -226,6 +229,10 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM return nil, fmt.Errorf("no flags have been passed") } + if model.Config.isEmpty() { + model.Config = nil + } + if p.IsVerbosityDebug() { modelStr, err := print.BuildDebugStrFromInputModel(model) if err != nil { @@ -249,22 +256,48 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli payload.MinRam = model.MinRam payload.Name = model.Name payload.Protected = model.Protected + payload.Config = nil - if model.Config != nil { - payload.Config = &iaas.ImageConfig{ - BootMenu: model.Config.BootMenu, - CdromBus: iaas.NewNullableString(model.Config.CdromBus), - DiskBus: iaas.NewNullableString(model.Config.DiskBus), - NicModel: iaas.NewNullableString(model.Config.NicModel), - OperatingSystem: model.Config.OperatingSystem, - OperatingSystemDistro: iaas.NewNullableString(model.Config.OperatingSystemDistro), - OperatingSystemVersion: iaas.NewNullableString(model.Config.OperatingSystemVersion), - RescueBus: iaas.NewNullableString(model.Config.RescueBus), - RescueDevice: iaas.NewNullableString(model.Config.RescueDevice), - SecureBoot: model.Config.SecureBoot, - Uefi: model.Config.Uefi, - VideoModel: iaas.NewNullableString(model.Config.VideoModel), - VirtioScsi: model.Config.VirtioScsi, + if config := model.Config; config != nil { + payload.Config = &iaas.ImageConfig{} + if model.Config.BootMenu != nil { + payload.Config.BootMenu = model.Config.BootMenu + } + if model.Config.CdromBus != nil { + payload.Config.CdromBus = iaas.NewNullableString(model.Config.CdromBus) + } + if model.Config.DiskBus != nil { + payload.Config.DiskBus = iaas.NewNullableString(model.Config.DiskBus) + } + if model.Config.NicModel != nil { + payload.Config.NicModel = iaas.NewNullableString(model.Config.NicModel) + } + if model.Config.OperatingSystem != nil { + payload.Config.OperatingSystem = model.Config.OperatingSystem + } + if model.Config.OperatingSystemDistro != nil { + payload.Config.OperatingSystemDistro = iaas.NewNullableString(model.Config.OperatingSystemDistro) + } + if model.Config.OperatingSystemVersion != nil { + payload.Config.OperatingSystemVersion = iaas.NewNullableString(model.Config.OperatingSystemVersion) + } + if model.Config.RescueBus != nil { + payload.Config.RescueBus = iaas.NewNullableString(model.Config.RescueBus) + } + if model.Config.RescueDevice != nil { + payload.Config.RescueDevice = iaas.NewNullableString(model.Config.RescueDevice) + } + if model.Config.SecureBoot != nil { + payload.Config.SecureBoot = model.Config.SecureBoot + } + if model.Config.Uefi != nil { + payload.Config.Uefi = model.Config.Uefi + } + if model.Config.VideoModel != nil { + payload.Config.VideoModel = iaas.NewNullableString(model.Config.VideoModel) + } + if model.Config.VirtioScsi != nil { + payload.Config.VirtioScsi = model.Config.VirtioScsi } } diff --git a/internal/cmd/image/update/update_test.go b/internal/cmd/image/update/update_test.go index 17216cbb9..5e4d620ca 100644 --- a/internal/cmd/image/update/update_test.go +++ b/internal/cmd/image/update/update_test.go @@ -298,6 +298,20 @@ func TestParseInput(t *testing.T) { model.Config.RescueDevice = nil }), }, + { + description: "update only name", + flagValues: map[string]string{ + projectIdFlag: testProjectId, + nameFlag: "foo", + }, + args: testImageId, + isValid: true, + expectedModel: &inputModel{ + Name: utils.Ptr("foo"), + GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + Id: testImageId[0], + }, + }, } for _, tt := range tests { @@ -400,6 +414,17 @@ func TestBuildRequest(t *testing.T) { })) }), }, + { + description: "no config set", + model: fixtureInputModel(func(model *inputModel) { + model.Config = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateImageRequest) { + *request = (*request).UpdateImagePayload(fixtureCreatePayload(func(payload *iaas.UpdateImagePayload) { + payload.Config = nil + })) + }), + }, } for _, tt := range tests { From 99638edf6a1e594f4411a63001a72ca0c704f27d Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Mon, 7 Jul 2025 18:01:40 +0200 Subject: [PATCH 066/422] feat(ske): Region adjustment (#842) Signed-off-by: Alexander Dahmen --- go.mod | 2 +- go.sum | 4 +-- internal/cmd/ske/cluster/create/create.go | 8 ++--- .../cmd/ske/cluster/create/create_test.go | 8 +++-- internal/cmd/ske/cluster/delete/delete.go | 4 +-- .../cmd/ske/cluster/delete/delete_test.go | 8 +++-- internal/cmd/ske/cluster/describe/describe.go | 2 +- .../cmd/ske/cluster/describe/describe_test.go | 8 +++-- .../generate-payload/generate_payload.go | 4 +-- .../generate-payload/generate_payload_test.go | 12 +++++--- internal/cmd/ske/cluster/list/list.go | 4 +-- internal/cmd/ske/cluster/list/list_test.go | 10 +++++-- internal/cmd/ske/cluster/update/update.go | 6 ++-- .../cmd/ske/cluster/update/update_test.go | 8 +++-- .../complete-rotation/complete_rotation.go | 4 +-- .../complete_rotation_test.go | 8 +++-- .../start-rotation/start_rotation.go | 4 +-- .../start-rotation/start_rotation_test.go | 8 +++-- internal/cmd/ske/kubeconfig/create/create.go | 4 +-- .../cmd/ske/kubeconfig/create/create_test.go | 8 +++-- internal/cmd/ske/kubeconfig/login/login.go | 13 ++++++--- .../cmd/ske/kubeconfig/login/login_test.go | 5 +++- internal/cmd/ske/options/options.go | 6 ++-- internal/cmd/ske/options/options_test.go | 29 ++++++++++++------- internal/pkg/services/ske/client/client.go | 3 +- internal/pkg/services/ske/utils/utils.go | 12 ++++---- internal/pkg/services/ske/utils/utils_test.go | 10 ++++--- 27 files changed, 128 insertions(+), 74 deletions(-) diff --git a/go.mod b/go.mod index ed253d620..5f9d4f9db 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.25.0 diff --git a/go.sum b/go.sum index fc887f795..888db04e5 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 h1:2d28WFQ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1TsWatlsexLeKdkb3L8chcxaXJOy/cLXctsRxhb4xg= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0 h1:bwLmLXvtCl1XkPRP+YrXwfz+lBMaGWH/crlNbYtxeqE= -github.com/stackitcloud/stackit-sdk-go/services/ske v0.27.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0 h1:PX8VTo2UhPd6BeEaCHFlpIkDbk9OFQEO6eJJ8JkxesA= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 h1:pUl/981oAXPnZd7++69NfEWv6JwW9UpxER16XxQUdOk= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0/go.mod h1:S04/QsQrB2EgYGjl62BO+9QUswrlRBoBosigrhdmccM= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 3f7f9a802..557fb9a3a 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -108,7 +108,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Check if cluster exists - exists, err := skeUtils.ClusterExists(ctx, apiClient, model.ProjectId, model.ClusterName) + exists, err := skeUtils.ClusterExists(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName) if err != nil { return err } @@ -118,7 +118,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // Fill in default payload, if needed if model.Payload == nil { - defaultPayload, err := skeUtils.GetDefaultPayload(ctx, apiClient) + defaultPayload, err := skeUtils.GetDefaultPayload(ctx, apiClient, model.Region) if err != nil { return fmt.Errorf("get default payload: %w", err) } @@ -137,7 +137,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating cluster") - _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, name).WaitWithContext(ctx) + _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, model.Region, name).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster creation: %w", err) } @@ -192,7 +192,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiCreateOrUpdateClusterRequest { - req := apiClient.CreateOrUpdateCluster(ctx, model.ProjectId, model.ClusterName) + req := apiClient.CreateOrUpdateCluster(ctx, model.ProjectId, model.Region, model.ClusterName) req = req.CreateOrUpdateClusterPayload(*model.Payload) return req diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index f64a03eb1..8fba70614 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -26,6 +26,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + var testPayload = &ske.CreateOrUpdateClusterPayload{ Kubernetes: &ske.Kubernetes{ Version: utils.Ptr("1.25.15"), @@ -81,7 +83,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, payloadFlag: fmt.Sprintf(`{ "name": "cli-jp", "kubernetes": { @@ -128,6 +131,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -140,7 +144,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCreateOrUpdateClusterRequest)) ske.ApiCreateOrUpdateClusterRequest { - request := testClient.CreateOrUpdateCluster(testCtx, testProjectId, fixtureInputModel().ClusterName) + request := testClient.CreateOrUpdateCluster(testCtx, testProjectId, testRegion, fixtureInputModel().ClusterName) request = request.CreateOrUpdateClusterPayload(*testPayload) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index 8a6e5c9cc..b10871bfe 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting cluster") - _, err = wait.DeleteClusterWaitHandler(ctx, apiClient, model.ProjectId, model.ClusterName).WaitWithContext(ctx) + _, err = wait.DeleteClusterWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster deletion: %w", err) } @@ -114,6 +114,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiDeleteClusterRequest { - req := apiClient.DeleteCluster(ctx, model.ProjectId, model.ClusterName) + req := apiClient.DeleteCluster(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/delete/delete_test.go b/internal/cmd/ske/cluster/delete/delete_test.go index b51e559ad..2835c477b 100644 --- a/internal/cmd/ske/cluster/delete/delete_test.go +++ b/internal/cmd/ske/cluster/delete/delete_test.go @@ -23,6 +23,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testClusterName, @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiDeleteClusterRequest)) ske.ApiDeleteClusterRequest { - request := testClient.DeleteCluster(testCtx, testProjectId, testClusterName) + request := testClient.DeleteCluster(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 703ce9b0f..40bf4897f 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -93,7 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiGetClusterRequest { - req := apiClient.GetCluster(ctx, model.ProjectId, model.ClusterName) + req := apiClient.GetCluster(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/describe/describe_test.go b/internal/cmd/ske/cluster/describe/describe_test.go index 13a1b9468..df33417ff 100644 --- a/internal/cmd/ske/cluster/describe/describe_test.go +++ b/internal/cmd/ske/cluster/describe/describe_test.go @@ -23,6 +23,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testClusterName, @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiGetClusterRequest)) ske.ApiGetClusterRequest { - request := testClient.GetCluster(testCtx, testProjectId, testClusterName) + request := testClient.GetCluster(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 14400f175..566e51f33 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { var payload *ske.CreateOrUpdateClusterPayload if model.ClusterName == nil { - payload, err = skeUtils.GetDefaultPayload(ctx, apiClient) + payload, err = skeUtils.GetDefaultPayload(ctx, apiClient, model.Region) if err != nil { return err } @@ -130,7 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiGetClusterRequest { - req := apiClient.GetCluster(ctx, model.ProjectId, *model.ClusterName) + req := apiClient.GetCluster(ctx, model.ProjectId, model.Region, *model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go index ac758cd1d..856db970d 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go @@ -28,11 +28,14 @@ const ( testFilePath = "example-file" ) +const testRegion = "eu01" + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - clusterNameFlag: testClusterName, - filePathFlag: testFilePath, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + clusterNameFlag: testClusterName, + filePathFlag: testFilePath, } for _, mod := range mods { mod(flagValues) @@ -44,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: utils.Ptr(testClusterName), @@ -56,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiGetClusterRequest)) ske.ApiGetClusterRequest { - request := testClient.GetCluster(testCtx, testProjectId, testClusterName) + request := testClient.GetCluster(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index 6674be931..31b8f2b7b 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -144,7 +144,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiListClustersRequest { - req := apiClient.ListClusters(ctx, model.ProjectId) + req := apiClient.ListClusters(ctx, model.ProjectId, model.Region) return req } @@ -172,7 +172,7 @@ func outputResult(p *print.Printer, outputFormat string, clusters []ske.Cluster) for i := range clusters { c := clusters[i] monitoring := "Disabled" - if c.Extensions != nil && c.Extensions.Argus != nil && *c.Extensions.Argus.Enabled { + if c.Extensions != nil && c.Extensions.Observability != nil && *c.Extensions.Observability.Enabled { monitoring = "Enabled" } statusAggregated, kubernetesVersion := "", "" diff --git a/internal/cmd/ske/cluster/list/list_test.go b/internal/cmd/ske/cluster/list/list_test.go index c7eb8a01a..e3c1a063c 100644 --- a/internal/cmd/ske/cluster/list/list_test.go +++ b/internal/cmd/ske/cluster/list/list_test.go @@ -24,10 +24,13 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() +const testRegion = "eu01" + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -39,6 +42,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -50,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiListClustersRequest)) ske.ApiListClustersRequest { - request := testClient.ListClusters(testCtx, testProjectId) + request := testClient.ListClusters(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 8ce6568e9..420c06349 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -79,7 +79,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Check if cluster exists - exists, err := skeUtils.ClusterExists(ctx, apiClient, model.ProjectId, model.ClusterName) + exists, err := skeUtils.ClusterExists(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName) if err != nil { return err } @@ -99,7 +99,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Updating cluster") - _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, name).WaitWithContext(ctx) + _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, model.Region, name).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster update: %w", err) } @@ -154,7 +154,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiCreateOrUpdateClusterRequest { - req := apiClient.CreateOrUpdateCluster(ctx, model.ProjectId, model.ClusterName) + req := apiClient.CreateOrUpdateCluster(ctx, model.ProjectId, model.Region, model.ClusterName) req = req.CreateOrUpdateClusterPayload(model.Payload) return req diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index 8eab71453..dcf82f207 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -26,6 +26,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + var testPayload = ske.CreateOrUpdateClusterPayload{ Kubernetes: &ske.Kubernetes{ Version: utils.Ptr("1.25.15"), @@ -81,7 +83,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, payloadFlag: fmt.Sprintf(`{ "name": "cli-jp", "kubernetes": { @@ -128,6 +131,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -140,7 +144,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCreateOrUpdateClusterRequest)) ske.ApiCreateOrUpdateClusterRequest { - request := testClient.CreateOrUpdateCluster(testCtx, testProjectId, fixtureInputModel().ClusterName) + request := testClient.CreateOrUpdateCluster(testCtx, testProjectId, testRegion, fixtureInputModel().ClusterName) request = request.CreateOrUpdateClusterPayload(testPayload) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index 4b9dfa1d6..982e9267d 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -87,7 +87,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Completing credentials rotation") - _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.ClusterName).WaitWithContext(ctx) + _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for completing SKE credentials rotation %w", err) } @@ -132,6 +132,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiCompleteCredentialsRotationRequest { - req := apiClient.CompleteCredentialsRotation(ctx, model.ProjectId, model.ClusterName) + req := apiClient.CompleteCredentialsRotation(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go index 35e773133..b8d40624c 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go @@ -23,6 +23,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testClusterName, @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCompleteCredentialsRotationRequest)) ske.ApiCompleteCredentialsRotationRequest { - request := testClient.CompleteCredentialsRotation(testCtx, testProjectId, testClusterName) + request := testClient.CompleteCredentialsRotation(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index 4e34c9ebe..a8314ad83 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -90,7 +90,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Starting credentials rotation") - _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.ClusterName).WaitWithContext(ctx) + _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for start SKE credentials rotation %w", err) } @@ -135,6 +135,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiStartCredentialsRotationRequest { - req := apiClient.StartCredentialsRotation(ctx, model.ProjectId, model.ClusterName) + req := apiClient.StartCredentialsRotation(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go index 29f2825ac..0e2f99fa3 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go @@ -23,6 +23,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testClusterName, @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiStartCredentialsRotationRequest)) ske.ApiStartCredentialsRotationRequest { - request := testClient.StartCredentialsRotation(testCtx, testProjectId, testClusterName) + request := testClient.StartCredentialsRotation(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index c4565223c..fe2907958 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -228,7 +228,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequestCreate(ctx context.Context, model *inputModel, apiClient *ske.APIClient) (ske.ApiCreateKubeconfigRequest, error) { - req := apiClient.CreateKubeconfig(ctx, model.ProjectId, model.ClusterName) + req := apiClient.CreateKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName) payload := ske.CreateKubeconfigPayload{} @@ -240,7 +240,7 @@ func buildRequestCreate(ctx context.Context, model *inputModel, apiClient *ske.A } func buildRequestLogin(ctx context.Context, model *inputModel, apiClient *ske.APIClient) (ske.ApiGetLoginKubeconfigRequest, error) { - return apiClient.GetLoginKubeconfig(ctx, model.ProjectId, model.ClusterName), nil + return apiClient.GetLoginKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName), nil } func outputResult(p *print.Printer, outputFormat, clusterName, kubeconfigPath string, respKubeconfig *ske.Kubeconfig, respLogin *ske.LoginKubeconfig) error { diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index 558d273e5..513fae126 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -23,6 +23,8 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testClusterName, @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ClusterName: testClusterName, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.ApiCreateKubeconfigRequest { - request := testClient.CreateKubeconfig(testCtx, testProjectId, testClusterName) + request := testClient.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) request = request.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{}) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index 058197418..3edc33b1f 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -14,6 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/cache" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "k8s.io/client-go/rest" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -55,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ kubectl cluster-info", "$ kubectl get pods"), ), - RunE: func(_ *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() if err := cache.Init(); err != nil { @@ -69,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "See `stackit ske kubeconfig login --help` for detailed usage instructions.") } - clusterConfig, err := parseClusterConfig() + clusterConfig, err := parseClusterConfig(params.Printer, cmd) if err != nil { return fmt.Errorf("parseClusterConfig: %w", err) } @@ -123,9 +124,10 @@ type clusterConfig struct { ClusterName string `json:"clusterName"` cacheKey string + Region string } -func parseClusterConfig() (*clusterConfig, error) { +func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, error) { obj, _, err := exec.LoadExecCredentialFromEnv() if err != nil { return nil, fmt.Errorf("LoadExecCredentialFromEnv: %w", err) @@ -155,6 +157,9 @@ func parseClusterConfig() (*clusterConfig, error) { config.cacheKey = fmt.Sprintf("ske-login-%x", sha256.Sum256([]byte(execCredential.Spec.Cluster.Server))) + globalFlags := globalflags.Parse(p, cmd) + config.Region = globalFlags.Region + return config, nil } @@ -200,7 +205,7 @@ func GetAndOutputKubeconfig(ctx context.Context, p *print.Printer, apiClient *sk } func buildRequest(ctx context.Context, apiClient *ske.APIClient, clusterConfig *clusterConfig) ske.ApiCreateKubeconfigRequest { - req := apiClient.CreateKubeconfig(ctx, clusterConfig.STACKITProjectID, clusterConfig.ClusterName) + req := apiClient.CreateKubeconfig(ctx, clusterConfig.STACKITProjectID, clusterConfig.Region, clusterConfig.ClusterName) expirationSeconds := strconv.Itoa(expirationSeconds) return req.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{ExpirationSeconds: &expirationSeconds}) diff --git a/internal/cmd/ske/kubeconfig/login/login_test.go b/internal/cmd/ske/kubeconfig/login/login_test.go index c6b94c9a9..ce22fbc1f 100644 --- a/internal/cmd/ske/kubeconfig/login/login_test.go +++ b/internal/cmd/ske/kubeconfig/login/login_test.go @@ -22,11 +22,14 @@ var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +const testRegion = "eu01" + func fixtureClusterConfig(mods ...func(clusterConfig *clusterConfig)) *clusterConfig { clusterConfig := &clusterConfig{ STACKITProjectID: testProjectId, ClusterName: testClusterName, cacheKey: "", + Region: testRegion, } for _, mod := range mods { mod(clusterConfig) @@ -35,7 +38,7 @@ func fixtureClusterConfig(mods ...func(clusterConfig *clusterConfig)) *clusterCo } func fixtureRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.ApiCreateKubeconfigRequest { - request := testClient.CreateKubeconfig(testCtx, testProjectId, testClusterName) + request := testClient.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) request = request.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{}) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index dbcfa7613..91564ceea 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Call API - req := buildRequest(ctx, apiClient) + req := buildRequest(ctx, apiClient, model) resp, err := req.Execute() if err != nil { return fmt.Errorf("get SKE provider options: %w", err) @@ -131,8 +131,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { return &model, nil } -func buildRequest(ctx context.Context, apiClient *ske.APIClient) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx) +func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { + req := apiClient.ListProviderOptions(ctx, model.Region) return req } diff --git a/internal/cmd/ske/options/options_test.go b/internal/cmd/ske/options/options_test.go index b2181ef5b..d2317d1e5 100644 --- a/internal/cmd/ske/options/options_test.go +++ b/internal/cmd/ske/options/options_test.go @@ -18,6 +18,8 @@ type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &ske.APIClient{} +const testRegion = "eu01" + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ availabilityZonesFlag: "false", @@ -25,6 +27,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st machineImagesFlag: "false", machineTypesFlag: "false", volumeTypesFlag: "false", + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -34,7 +37,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModelAllFalse(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: &globalflags.GlobalFlagModel{Region: testRegion, Verbosity: globalflags.VerbosityDefault}, AvailabilityZones: false, KubernetesVersions: false, MachineImages: false, @@ -49,7 +52,7 @@ func fixtureInputModelAllFalse(mods ...func(model *inputModel)) *inputModel { func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: &globalflags.GlobalFlagModel{Region: testRegion, Verbosity: globalflags.VerbosityDefault}, AvailabilityZones: true, KubernetesVersions: true, MachineImages: true, @@ -76,10 +79,12 @@ func TestParseInput(t *testing.T) { expectedModel: fixtureInputModelAllTrue(), }, { - description: "no values", - flagValues: map[string]string{}, - isValid: true, - expectedModel: fixtureInputModelAllTrue(), + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: fixtureInputModelAllTrue(func(model *inputModel) { + model.Region = "" + }), }, { description: "some values 1", @@ -90,6 +95,7 @@ func TestParseInput(t *testing.T) { isValid: true, expectedModel: fixtureInputModelAllFalse(func(model *inputModel) { model.AvailabilityZones = true + model.Region = "" }), }, { @@ -103,6 +109,7 @@ func TestParseInput(t *testing.T) { expectedModel: fixtureInputModelAllFalse(func(model *inputModel) { model.KubernetesVersions = true model.MachineTypes = true + model.Region = "" }), }, { @@ -111,8 +118,10 @@ func TestParseInput(t *testing.T) { kubernetesVersionsFlag: "false", machineTypesFlag: "false", }, - isValid: true, - expectedModel: fixtureInputModelAllTrue(), + isValid: true, + expectedModel: fixtureInputModelAllTrue(func(model *inputModel) { + model.Region = "" + }), }, } @@ -169,13 +178,13 @@ func TestBuildRequest(t *testing.T) { }{ { description: "base", - expectedRequest: testClient.ListProviderOptions(testCtx), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, testClient) + request := buildRequest(testCtx, testClient, fixtureInputModelAllTrue()) diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), diff --git a/internal/pkg/services/ske/client/client.go b/internal/pkg/services/ske/client/client.go index a361f73d2..1495ba7bf 100644 --- a/internal/pkg/services/ske/client/client.go +++ b/internal/pkg/services/ske/client/client.go @@ -27,8 +27,7 @@ func ConfigureClient(p *print.Printer, cliVersion string) (*ske.APIClient, error if customEndpoint != "" { cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) } else { - region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) + cfgOptions = append(cfgOptions, authCfgOption) } if p.IsVerbosityDebug() { diff --git a/internal/pkg/services/ske/utils/utils.go b/internal/pkg/services/ske/utils/utils.go index 283760f63..4c5604fc4 100644 --- a/internal/pkg/services/ske/utils/utils.go +++ b/internal/pkg/services/ske/utils/utils.go @@ -32,12 +32,12 @@ const ( ) type SKEClient interface { - ListClustersExecute(ctx context.Context, projectId string) (*ske.ListClustersResponse, error) - ListProviderOptionsExecute(ctx context.Context) (*ske.ProviderOptions, error) + ListClustersExecute(ctx context.Context, projectId, region string) (*ske.ListClustersResponse, error) + ListProviderOptionsExecute(ctx context.Context, region string) (*ske.ProviderOptions, error) } -func ClusterExists(ctx context.Context, apiClient SKEClient, projectId, clusterName string) (bool, error) { - clusters, err := apiClient.ListClustersExecute(ctx, projectId) +func ClusterExists(ctx context.Context, apiClient SKEClient, projectId, region, clusterName string) (bool, error) { + clusters, err := apiClient.ListClustersExecute(ctx, projectId, region) if err != nil { return false, fmt.Errorf("list SKE clusters: %w", err) } @@ -49,8 +49,8 @@ func ClusterExists(ctx context.Context, apiClient SKEClient, projectId, clusterN return false, nil } -func GetDefaultPayload(ctx context.Context, apiClient SKEClient) (*ske.CreateOrUpdateClusterPayload, error) { - resp, err := apiClient.ListProviderOptionsExecute(ctx) +func GetDefaultPayload(ctx context.Context, apiClient SKEClient, region string) (*ske.CreateOrUpdateClusterPayload, error) { + resp, err := apiClient.ListProviderOptionsExecute(ctx, region) if err != nil { return nil, fmt.Errorf("get SKE provider options: %w", err) } diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index 9c6c37ace..27b9b8d6a 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -70,14 +70,16 @@ type skeClientMocked struct { listProviderOptionsResp *ske.ProviderOptions } -func (m *skeClientMocked) ListClustersExecute(_ context.Context, _ string) (*ske.ListClustersResponse, error) { +const testRegion = "eu01" + +func (m *skeClientMocked) ListClustersExecute(_ context.Context, _, _ string) (*ske.ListClustersResponse, error) { if m.listClustersFails { return nil, fmt.Errorf("could not list clusters") } return m.listClustersResp, nil } -func (m *skeClientMocked) ListProviderOptionsExecute(_ context.Context) (*ske.ProviderOptions, error) { +func (m *skeClientMocked) ListProviderOptionsExecute(_ context.Context, _ string) (*ske.ProviderOptions, error) { if m.listProviderOptionsFails { return nil, fmt.Errorf("could not list provider options") } @@ -124,7 +126,7 @@ func TestClusterExists(t *testing.T) { listClustersResp: tt.getClustersResp, } - exists, err := ClusterExists(context.Background(), client, testProjectId, testClusterName) + exists, err := ClusterExists(context.Background(), client, testProjectId, testRegion, testClusterName) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -400,7 +402,7 @@ func TestGetDefaultPayload(t *testing.T) { listProviderOptionsResp: tt.listProviderOptionsResp, } - output, err := GetDefaultPayload(context.Background(), client) + output, err := GetDefaultPayload(context.Background(), client, testRegion) if tt.isValid && err != nil { t.Errorf("failed on valid input") From 380330dc2ec1d9ff8a3b3d1709841b3d9bc7367e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 8 Jul 2025 10:36:30 +0200 Subject: [PATCH 067/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/iaas to v0.27.0 (#844) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5f9d4f9db..604ff8faa 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 diff --git a/go.sum b/go.sum index 888db04e5..8b31d4ecc 100644 --- a/go.sum +++ b/go.sum @@ -572,8 +572,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 h1:x5mx/C2bdtpOH974R github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 h1:UJDtK96cjQqp5yWb8TxXLG42SOGcnBSgfYO7P3pk/j0= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0 h1:7qm/Tft79wFlHomPdgjUJ9uJU8kEk+k9ficMGRoHtf0= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.26.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 h1:5vxOzwQ+rNm0g9ZLQW/31dqdDqGfw/FQbrjxUUAHtiA= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCxpFXN2K7g2ih0gQM6cyZ1VhTmtQfI= From 64f3f143fe9ba7091c569631e4de9f107066bf66 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:53:59 +0200 Subject: [PATCH 068/422] fix: add missing security group ID output to `security-group create` command (#846) --- internal/cmd/security-group/create/create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 5bce0c52b..1e17b9002 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -156,7 +156,7 @@ func outputResult(p *print.Printer, outputFormat, name string, resp iaas.Securit return nil default: - p.Outputf("Created security group %q\n", name) + p.Outputf("Created security group %q.\nSecurity Group ID %s\n", name, utils.PtrString(resp.Id)) return nil } } From 3d6a354815eddba620a95265d9929a9a8429d3d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Wed, 9 Jul 2025 14:40:27 +0200 Subject: [PATCH 069/422] feat: add refreshing access token functionality to get-access-token command (#847) --- .../auth/get-access-token/get_access_token.go | 11 +-- internal/pkg/auth/auth.go | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 9 deletions(-) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 0b13fd2fa..25576427a 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -29,19 +29,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return &cliErr.SessionExpiredError{} } - accessToken, err := auth.GetAccessToken() + // Try to get a valid access token, refreshing if necessary + accessToken, err := auth.RefreshAccessToken(params.Printer) if err != nil { return err } - accessTokenExpired, err := auth.TokenExpired(accessToken) - if err != nil { - return err - } - if accessTokenExpired { - return &cliErr.AccessTokenExpiredError{} - } - params.Printer.Outputf("%s\n", accessToken) return nil }, diff --git a/internal/pkg/auth/auth.go b/internal/pkg/auth/auth.go index 89a39ac29..634813f24 100644 --- a/internal/pkg/auth/auth.go +++ b/internal/pkg/auth/auth.go @@ -2,6 +2,7 @@ package auth import ( "fmt" + "net/http" "os" "strconv" "time" @@ -132,3 +133,71 @@ func getEmailFromToken(token string) (string, error) { return claims.Email, nil } + +// RefreshAccessToken refreshes the access token if it's expired for the user token flow. +// It returns the new access token or an error if the refresh fails. +func RefreshAccessToken(p *print.Printer) (string, error) { + flow, err := GetAuthFlow() + if err != nil { + return "", fmt.Errorf("get authentication flow: %w", err) + } + if flow != AUTH_FLOW_USER_TOKEN { + return "", fmt.Errorf("token refresh is only supported for user token flow, current flow: %s", flow) + } + + // Load tokens from storage + authFields := map[authFieldKey]string{ + ACCESS_TOKEN: "", + REFRESH_TOKEN: "", + IDP_TOKEN_ENDPOINT: "", + } + err = GetAuthFieldMap(authFields) + if err != nil { + return "", fmt.Errorf("get tokens from auth storage: %w", err) + } + + accessToken := authFields[ACCESS_TOKEN] + refreshToken := authFields[REFRESH_TOKEN] + tokenEndpoint := authFields[IDP_TOKEN_ENDPOINT] + + if accessToken == "" { + return "", fmt.Errorf("access token not set") + } + if refreshToken == "" { + return "", fmt.Errorf("refresh token not set") + } + if tokenEndpoint == "" { + return "", fmt.Errorf("token endpoint not set") + } + + // Check if access token is expired + accessTokenExpired, err := TokenExpired(accessToken) + if err != nil { + return "", fmt.Errorf("check if access token has expired: %w", err) + } + if !accessTokenExpired { + // Token is still valid, return it + return accessToken, nil + } + + p.Debug(print.DebugLevel, "access token expired, refreshing...") + + // Create a temporary userTokenFlow to reuse the refresh logic + utf := &userTokenFlow{ + printer: p, + client: &http.Client{}, + authFlow: flow, + accessToken: accessToken, + refreshToken: refreshToken, + tokenEndpoint: tokenEndpoint, + } + + // Refresh the tokens + err = refreshTokens(utf) + if err != nil { + return "", fmt.Errorf("refresh access token: %w", err) + } + + // Return the new access token + return utf.accessToken, nil +} From d03b5d41c2488aab4b58ce50687122c72ea392c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:34:45 +0200 Subject: [PATCH 070/422] feat: add continue-on-error attribute to pipeline (#848) --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 18a3a9e6f..14432ab71 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -58,6 +58,7 @@ jobs: name: "Code coverage report" if: github.event_name == 'pull_request' # Do not run when workflow is triggered by push to main branch runs-on: ubuntu-latest + continue-on-error: true # Add this line to prevent pipeline failures in forks needs: main permissions: contents: read From c60995e3ce30a6972ac1e1a41b24372e52c04e2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:30:56 +0200 Subject: [PATCH 071/422] chore(deps): bump golang.org/x/text from 0.26.0 to 0.27.0 (#855) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.26.0 to 0.27.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.26.0...v0.27.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.27.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 604ff8faa..55b7b2acb 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( golang.org/x/mod v0.25.0 golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.32.0 - golang.org/x/text v0.26.0 + golang.org/x/text v0.27.0 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 ) @@ -206,7 +206,7 @@ require ( go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/sync v0.15.0 // indirect + golang.org/x/sync v0.16.0 // indirect golang.org/x/tools v0.34.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 8b31d4ecc..de3f72547 100644 --- a/go.sum +++ b/go.sum @@ -819,8 +819,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +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-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -896,8 +896,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From cb39a1f864f882320244c641a324a00548c4426b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 15:42:03 +0200 Subject: [PATCH 072/422] chore(deps): bump golang.org/x/mod from 0.25.0 to 0.26.0 (#854) Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.25.0 to 0.26.0. - [Commits](https://github.com/golang/mod/compare/v0.25.0...v0.26.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.26.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 55b7b2acb..c608a296c 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.25.0 + golang.org/x/mod v0.26.0 golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.32.0 golang.org/x/text v0.27.0 diff --git a/go.sum b/go.sum index de3f72547..69d5a8dc9 100644 --- a/go.sum +++ b/go.sum @@ -752,8 +752,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 7f974e1eff412db10c8489d9e0d7c9344a6fd50b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 14 Jul 2025 09:54:54 +0200 Subject: [PATCH 073/422] feat(mongodbflex): region adjustment (#857) relates to STACKITCLI-215 --- go.mod | 2 +- go.sum | 4 +- .../mongodbflex/backup/describe/describe.go | 6 +- .../backup/describe/describe_test.go | 20 ++++--- internal/cmd/mongodbflex/backup/list/list.go | 6 +- .../cmd/mongodbflex/backup/list/list_test.go | 20 ++++--- .../backup/restore-jobs/restore_jobs.go | 4 +- .../backup/restore-jobs/restore_jobs_test.go | 20 ++++--- .../cmd/mongodbflex/backup/restore/restore.go | 10 ++-- .../backup/restore/restore_test.go | 23 +++---- .../mongodbflex/backup/schedule/schedule.go | 2 +- .../backup/schedule/schedule_test.go | 18 +++--- .../backup/update-schedule/update_schedule.go | 6 +- .../update-schedule/update_schedule_test.go | 31 ++++++---- .../cmd/mongodbflex/instance/create/create.go | 18 +++--- .../instance/create/create_test.go | 56 +++++++++-------- .../cmd/mongodbflex/instance/delete/delete.go | 6 +- .../instance/delete/delete_test.go | 16 +++-- .../mongodbflex/instance/describe/describe.go | 2 +- .../instance/describe/describe_test.go | 16 +++-- .../cmd/mongodbflex/instance/list/list.go | 2 +- .../mongodbflex/instance/list/list_test.go | 18 +++--- .../cmd/mongodbflex/instance/update/update.go | 22 +++---- .../instance/update/update_test.go | 60 ++++++++++--------- internal/cmd/mongodbflex/options/options.go | 20 +++---- .../cmd/mongodbflex/options/options_test.go | 8 +-- .../cmd/mongodbflex/user/create/create.go | 4 +- .../mongodbflex/user/create/create_test.go | 24 ++++---- .../cmd/mongodbflex/user/delete/delete.go | 6 +- .../mongodbflex/user/delete/delete_test.go | 18 +++--- .../cmd/mongodbflex/user/describe/describe.go | 2 +- .../user/describe/describe_test.go | 18 +++--- internal/cmd/mongodbflex/user/list/list.go | 4 +- .../cmd/mongodbflex/user/list/list_test.go | 20 ++++--- .../user/reset-password/reset_password.go | 6 +- .../reset-password/reset_password_test.go | 18 +++--- .../cmd/mongodbflex/user/update/update.go | 6 +- .../mongodbflex/user/update/update_test.go | 20 ++++--- .../pkg/services/mongodbflex/client/client.go | 3 - .../pkg/services/mongodbflex/utils/utils.go | 24 ++++---- .../services/mongodbflex/utils/utils_test.go | 37 ++++++------ 41 files changed, 347 insertions(+), 279 deletions(-) diff --git a/go.mod b/go.mod index c608a296c..97a3bf5ee 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 diff --git a/go.sum b/go.sum index 69d5a8dc9..f89590d9d 100644 --- a/go.sum +++ b/go.sum @@ -580,8 +580,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCx github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0 h1:3R3S2R3m4Auh3cANM3t+AVDhWTKylXQHNBk42TKSbR4= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.3.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0 h1:il4vBOejtX0//CWuY6CDpFfPpDIvin5V9QIaKvyXV/M= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 h1:8v9Iupkc3meXcVPMpteXDz07YzY2M5jud50vEtAvbs8= diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index f565aebd4..a1ca3aeaf 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongoUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongoUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -75,7 +75,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("describe backup for MongoDB Flex instance: %w", err) } - restoreJobs, err := apiClient.ListRestoreJobs(ctx, model.ProjectId, model.InstanceId).Execute() + restoreJobs, err := apiClient.ListRestoreJobs(ctx, model.ProjectId, model.InstanceId, model.Region).Execute() if err != nil { return fmt.Errorf("get restore jobs for MongoDB Flex instance %q: %w", instanceLabel, err) } @@ -122,7 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiGetBackupRequest { - req := apiClient.GetBackup(ctx, model.ProjectId, model.InstanceId, model.BackupId) + req := apiClient.GetBackup(ctx, model.ProjectId, model.InstanceId, model.BackupId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/backup/describe/describe_test.go b/internal/cmd/mongodbflex/backup/describe/describe_test.go index 914f27259..f69454e9b 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe_test.go +++ b/internal/cmd/mongodbflex/backup/describe/describe_test.go @@ -14,7 +14,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testBackupId = "backupID" +) type testCtxKey struct{} @@ -22,7 +25,6 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &mongodbflex.APIClient{} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testBackupId = "backupID" func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -36,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -50,6 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, InstanceId: testInstanceId, BackupId: testBackupId, @@ -61,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiGetBackupRequest)) mongodbflex.ApiGetBackupRequest { - request := testClient.GetBackup(testCtx, testProjectId, testInstanceId, testBackupId) + request := testClient.GetBackup(testCtx, testProjectId, testInstanceId, testBackupId, testRegion) for _, mod := range mods { mod(&request) } @@ -105,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index f2e40bd83..64187cf64 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId @@ -82,7 +82,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } backups := *resp.Items - restoreJobs, err := apiClient.ListRestoreJobs(ctx, model.ProjectId, *model.InstanceId).Execute() + restoreJobs, err := apiClient.ListRestoreJobs(ctx, model.ProjectId, *model.InstanceId, model.Region).Execute() if err != nil { return fmt.Errorf("get restore jobs for MongoDB Flex instance %q: %w", instanceLabel, err) } @@ -141,7 +141,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiListBackupsRequest { - req := apiClient.ListBackups(ctx, model.ProjectId, *model.InstanceId) + req := apiClient.ListBackups(ctx, model.ProjectId, *model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/backup/list/list_test.go b/internal/cmd/mongodbflex/backup/list/list_test.go index 3328c6030..8b6ce7a25 100644 --- a/internal/cmd/mongodbflex/backup/list/list_test.go +++ b/internal/cmd/mongodbflex/backup/list/list_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -26,9 +28,10 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -41,6 +44,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, InstanceId: utils.Ptr(testInstanceId), Limit: utils.Ptr(int64(10)), @@ -52,7 +56,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiListBackupsRequest)) mongodbflex.ApiListBackupsRequest { - request := testClient.ListBackups(testCtx, testProjectId, testInstanceId) + request := testClient.ListBackups(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -80,21 +84,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 81c5853c8..7f529891e 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -63,7 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId @@ -135,7 +135,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiListRestoreJobsRequest { - req := apiClient.ListRestoreJobs(ctx, model.ProjectId, *model.InstanceId) + req := apiClient.ListRestoreJobs(ctx, model.ProjectId, *model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go index 61f911ea7..fd00003a4 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -26,9 +28,10 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -40,6 +43,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: utils.Ptr(testInstanceId), @@ -52,7 +56,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiListRestoreJobsRequest)) mongodbflex.ApiListRestoreJobsRequest { - request := testClient.ListRestoreJobs(testCtx, testProjectId, testInstanceId) + request := testClient.ListRestoreJobs(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -80,21 +84,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index ed86d7c61..5c64f6aef 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.ProjectId @@ -102,7 +102,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Restoring instance") - _, err = wait.RestoreInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.BackupId).WaitWithContext(ctx) + _, err = wait.RestoreInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.BackupId, model.Region).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance restoration: %w", err) } @@ -123,7 +123,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Cloning instance") - _, err = wait.CloneInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + _, err = wait.CloneInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance cloning: %w", err) } @@ -184,7 +184,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRestoreRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiRestoreInstanceRequest { - req := apiClient.RestoreInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.RestoreInstance(ctx, model.ProjectId, model.InstanceId, model.Region) req = req.RestoreInstancePayload(mongodbflex.RestoreInstancePayload{ BackupId: &model.BackupId, InstanceId: &model.BackupInstanceId, @@ -193,7 +193,7 @@ func buildRestoreRequest(ctx context.Context, model *inputModel, apiClient *mong } func buildCloneRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiCloneInstanceRequest { - req := apiClient.CloneInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.CloneInstance(ctx, model.ProjectId, model.InstanceId, model.Region) req = req.CloneInstancePayload(mongodbflex.CloneInstancePayload{ Timestamp: &model.Timestamp, InstanceId: &model.BackupInstanceId, diff --git a/internal/cmd/mongodbflex/backup/restore/restore_test.go b/internal/cmd/mongodbflex/backup/restore/restore_test.go index bffa02934..27b1d3181 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore_test.go +++ b/internal/cmd/mongodbflex/backup/restore/restore_test.go @@ -15,11 +15,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} const ( + testRegion = "eu02" testBackupId = "backupID" testTimestamp = "2021-01-01T00:00:00Z" ) @@ -33,10 +32,11 @@ var testBackupInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - backupIdFlag: testBackupId, - backupInstanceIdFlag: testBackupInstanceId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + backupIdFlag: testBackupId, + backupInstanceIdFlag: testBackupInstanceId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -48,6 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -61,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRestoreRequest(mods ...func(request mongodbflex.ApiRestoreInstanceRequest)) mongodbflex.ApiRestoreInstanceRequest { - request := testClient.RestoreInstance(testCtx, testProjectId, testInstanceId) + request := testClient.RestoreInstance(testCtx, testProjectId, testInstanceId, testRegion) request = request.RestoreInstancePayload(mongodbflex.RestoreInstancePayload{ BackupId: utils.Ptr(testBackupId), InstanceId: utils.Ptr(testBackupInstanceId), @@ -73,7 +74,7 @@ func fixtureRestoreRequest(mods ...func(request mongodbflex.ApiRestoreInstanceRe } func fixtureCloneRequest(mods ...func(request mongodbflex.ApiCloneInstanceRequest)) mongodbflex.ApiCloneInstanceRequest { - request := testClient.CloneInstance(testCtx, testProjectId, testInstanceId) + request := testClient.CloneInstance(testCtx, testProjectId, testInstanceId, testRegion) request = request.CloneInstancePayload(mongodbflex.CloneInstancePayload{ Timestamp: utils.Ptr(testTimestamp), InstanceId: utils.Ptr(testBackupInstanceId), @@ -106,21 +107,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 16cd47d24..9117e83d9 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -100,7 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiGetInstanceRequest { - req := apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go index 705bd7432..1f67e3e64 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -26,8 +28,9 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -39,6 +42,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -50,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiGetInstanceRequest)) mongodbflex.ApiGetInstanceRequest { - request := testClient.GetInstance(testCtx, testProjectId, testInstanceId) + request := testClient.GetInstance(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -78,21 +82,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index e93f557ea..af23cdef6 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -81,7 +81,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongoDBflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) + instanceLabel, err := mongoDBflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId @@ -159,7 +159,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildUpdateBackupScheduleRequest(ctx context.Context, model *inputModel, instance *mongodbflex.Instance, apiClient *mongodbflex.APIClient) mongodbflex.ApiUpdateBackupScheduleRequest { - req := apiClient.UpdateBackupSchedule(ctx, model.ProjectId, *model.InstanceId) + req := apiClient.UpdateBackupSchedule(ctx, model.ProjectId, *model.InstanceId, model.Region) payload := getUpdateBackupSchedulePayload(instance) @@ -229,6 +229,6 @@ func getUpdateBackupSchedulePayload(instance *mongodbflex.Instance) mongodbflex. } func buildGetInstanceRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiGetInstanceRequest { - req := apiClient.GetInstance(ctx, model.ProjectId, *model.InstanceId) + req := apiClient.GetInstance(ctx, model.ProjectId, *model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go index 1f6cc5aa0..77b6c5c2c 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go @@ -13,7 +13,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" + testSchedule = "0 0/6 * * *" +) type testCtxKey struct{} @@ -21,13 +24,13 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &mongodbflex.APIClient{} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testSchedule = "0 0/6 * * *" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - scheduleFlag: testSchedule, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + scheduleFlag: testSchedule, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -39,10 +42,11 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: utils.Ptr(testInstanceId), - BackupSchedule: &testSchedule, + BackupSchedule: utils.Ptr(testSchedule), } for _, mod := range mods { mod(model) @@ -66,7 +70,7 @@ func fixturePayload(mods ...func(payload *mongodbflex.UpdateBackupSchedulePayloa } func fixtureUpdateBackupScheduleRequest(mods ...func(request *mongodbflex.ApiUpdateBackupScheduleRequest)) mongodbflex.ApiUpdateBackupScheduleRequest { - request := testClient.UpdateBackupSchedule(testCtx, testProjectId, testInstanceId) + request := testClient.UpdateBackupSchedule(testCtx, testProjectId, testInstanceId, testRegion) request = request.UpdateBackupSchedulePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -75,7 +79,7 @@ func fixtureUpdateBackupScheduleRequest(mods ...func(request *mongodbflex.ApiUpd } func fixtureGetInstanceRequest(mods ...func(request *mongodbflex.ApiGetInstanceRequest)) mongodbflex.ApiGetInstanceRequest { - request := testClient.GetInstance(testCtx, testProjectId, testInstanceId) + request := testClient.GetInstance(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -84,7 +88,7 @@ func fixtureGetInstanceRequest(mods ...func(request *mongodbflex.ApiGetInstanceR func fixtureInstance(mods ...func(instance *mongodbflex.Instance)) *mongodbflex.Instance { instance := mongodbflex.Instance{ - BackupSchedule: &testSchedule, + BackupSchedule: utils.Ptr(testSchedule), Options: &map[string]string{ "dailySnapshotRetentionDays": "0", "weeklySnapshotRetentionWeeks": "3", @@ -121,21 +125,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -260,6 +264,7 @@ func TestBuildUpdateBackupScheduleRequest(t *testing.T) { model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, }, InstanceId: utils.Ptr(testInstanceId), DailySnaphotRetentionDays: utils.Ptr(int64(2)), @@ -276,6 +281,7 @@ func TestBuildUpdateBackupScheduleRequest(t *testing.T) { model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, }, InstanceId: utils.Ptr(testInstanceId), BackupSchedule: utils.Ptr("0 0/6 5 2 1"), @@ -300,6 +306,7 @@ func TestBuildUpdateBackupScheduleRequest(t *testing.T) { model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, }, InstanceId: utils.Ptr(testInstanceId), }, diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 05df2b9e5..28a65e394 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -104,7 +104,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // Fill in version, if needed if model.Version == nil { - version, err := mongodbflexUtils.GetLatestMongoDBVersion(ctx, apiClient, model.ProjectId) + version, err := mongodbflexUtils.GetLatestMongoDBVersion(ctx, apiClient, model.ProjectId, model.Region) if err != nil { return fmt.Errorf("get latest MongoDB version: %w", err) } @@ -126,7 +126,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance creation: %w", err) } @@ -208,18 +208,18 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } type MongoDBFlexClient interface { - CreateInstance(ctx context.Context, projectId string) mongodbflex.ApiCreateInstanceRequest - ListFlavorsExecute(ctx context.Context, projectId string) (*mongodbflex.ListFlavorsResponse, error) - ListStoragesExecute(ctx context.Context, projectId, flavorId string) (*mongodbflex.ListStoragesResponse, error) + CreateInstance(ctx context.Context, projectId, region string) mongodbflex.ApiCreateInstanceRequest + ListFlavorsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListFlavorsResponse, error) + ListStoragesExecute(ctx context.Context, projectId, flavorId, region string) (*mongodbflex.ListStoragesResponse, error) } func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexClient) (mongodbflex.ApiCreateInstanceRequest, error) { - req := apiClient.CreateInstance(ctx, model.ProjectId) + req := apiClient.CreateInstance(ctx, model.ProjectId, model.Region) var flavorId *string var err error - flavors, err := apiClient.ListFlavorsExecute(ctx, model.ProjectId) + flavors, err := apiClient.ListFlavorsExecute(ctx, model.ProjectId, model.Region) if err != nil { return req, fmt.Errorf("get MongoDB Flex flavors: %w", err) } @@ -241,7 +241,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexC flavorId = model.FlavorId } - storages, err := apiClient.ListStoragesExecute(ctx, model.ProjectId, *flavorId) + storages, err := apiClient.ListStoragesExecute(ctx, model.ProjectId, *flavorId, model.Region) if err != nil { return req, fmt.Errorf("get MongoDB Flex storages: %w", err) } @@ -257,7 +257,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexC req = req.CreateInstancePayload(mongodbflex.CreateInstancePayload{ Name: model.InstanceName, - Acl: &mongodbflex.ACL{Items: model.ACL}, + Acl: &mongodbflex.CreateInstancePayloadAcl{Items: model.ACL}, BackupSchedule: model.BackupSchedule, FlavorId: flavorId, Replicas: &replicas, diff --git a/internal/cmd/mongodbflex/instance/create/create_test.go b/internal/cmd/mongodbflex/instance/create/create_test.go index 72ab744b7..8d2bd7aba 100644 --- a/internal/cmd/mongodbflex/instance/create/create_test.go +++ b/internal/cmd/mongodbflex/instance/create/create_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -30,18 +32,18 @@ type mongoDBFlexClientMocked struct { listStoragesResp *mongodbflex.ListStoragesResponse } -func (c *mongoDBFlexClientMocked) CreateInstance(ctx context.Context, projectId string) mongodbflex.ApiCreateInstanceRequest { - return testClient.CreateInstance(ctx, projectId) +func (c *mongoDBFlexClientMocked) CreateInstance(ctx context.Context, projectId, region string) mongodbflex.ApiCreateInstanceRequest { + return testClient.CreateInstance(ctx, projectId, region) } -func (c *mongoDBFlexClientMocked) ListStoragesExecute(_ context.Context, _, _ string) (*mongodbflex.ListStoragesResponse, error) { +func (c *mongoDBFlexClientMocked) ListStoragesExecute(_ context.Context, _, _, _ string) (*mongodbflex.ListStoragesResponse, error) { if c.listFlavorsFails { return nil, fmt.Errorf("list storages failed") } return c.listStoragesResp, nil } -func (c *mongoDBFlexClientMocked) ListFlavorsExecute(_ context.Context, _ string) (*mongodbflex.ListFlavorsResponse, error) { +func (c *mongoDBFlexClientMocked) ListFlavorsExecute(_ context.Context, _, _ string) (*mongodbflex.ListFlavorsResponse, error) { if c.listFlavorsFails { return nil, fmt.Errorf("list flavors failed") } @@ -53,15 +55,16 @@ var testFlavorId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceNameFlag: "example-name", - aclFlag: "0.0.0.0/0", - backupScheduleFlag: "0 0/6 * * *", - flavorIdFlag: testFlavorId, - storageClassFlag: "premium-perf4-mongodb", // Non-default - storageSizeFlag: "10", - versionFlag: "6.0", - typeFlag: "Replica", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceNameFlag: "example-name", + aclFlag: "0.0.0.0/0", + backupScheduleFlag: "0 0/6 * * *", + flavorIdFlag: testFlavorId, + storageClassFlag: "premium-perf4-mongodb", // Non-default + storageSizeFlag: "10", + versionFlag: "6.0", + typeFlag: "Replica", } for _, mod := range mods { mod(flagValues) @@ -73,6 +76,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceName: utils.Ptr("example-name"), @@ -91,7 +95,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiCreateInstanceRequest)) mongodbflex.ApiCreateInstanceRequest { - request := testClient.CreateInstance(testCtx, testProjectId) + request := testClient.CreateInstance(testCtx, testProjectId, testRegion) request = request.CreateInstancePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -102,7 +106,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiCreateInstanceRequest)) func fixturePayload(mods ...func(payload *mongodbflex.CreateInstancePayload)) mongodbflex.CreateInstancePayload { payload := mongodbflex.CreateInstancePayload{ Name: utils.Ptr("example-name"), - Acl: &mongodbflex.ACL{Items: utils.Ptr([]string{"0.0.0.0/0"})}, + Acl: &mongodbflex.CreateInstancePayloadAcl{Items: utils.Ptr([]string{"0.0.0.0/0"})}, BackupSchedule: utils.Ptr("0 0/6 * * *"), FlavorId: utils.Ptr(testFlavorId), Replicas: utils.Ptr(int64(3)), @@ -166,21 +170,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -321,7 +325,7 @@ func TestBuildRequest(t *testing.T) { isValid: true, expectedRequest: fixtureRequest(), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -349,7 +353,7 @@ func TestBuildRequest(t *testing.T) { isValid: true, expectedRequest: fixtureRequest(), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -379,7 +383,7 @@ func TestBuildRequest(t *testing.T) { payload.Replicas = utils.Ptr(int64(1)) })), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -404,7 +408,7 @@ func TestBuildRequest(t *testing.T) { payload.Replicas = utils.Ptr(int64(9)) })), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -442,7 +446,7 @@ func TestBuildRequest(t *testing.T) { }, ), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -477,7 +481,7 @@ func TestBuildRequest(t *testing.T) { }, ), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -502,7 +506,7 @@ func TestBuildRequest(t *testing.T) { }, ), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index 609307fbd..b63d61d63 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance deletion: %w", err) } @@ -122,6 +122,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiDeleteInstanceRequest { - req := apiClient.DeleteInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.DeleteInstance(ctx, model.ProjectId, model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/instance/delete/delete_test.go b/internal/cmd/mongodbflex/instance/delete/delete_test.go index 1c02e7f87..8add607ed 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete_test.go +++ b/internal/cmd/mongodbflex/instance/delete/delete_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiDeleteInstanceRequest)) mongodbflex.ApiDeleteInstanceRequest { - request := testClient.DeleteInstance(testCtx, testProjectId, testInstanceId) + request := testClient.DeleteInstance(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -102,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +122,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index 65765a540..0a5c11e54 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -96,7 +96,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiGetInstanceRequest { - req := apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.GetInstance(ctx, model.ProjectId, model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/instance/describe/describe_test.go b/internal/cmd/mongodbflex/instance/describe/describe_test.go index c933d86e4..aa0235465 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe_test.go +++ b/internal/cmd/mongodbflex/instance/describe/describe_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiGetInstanceRequest)) mongodbflex.ApiGetInstanceRequest { - request := testClient.GetInstance(testCtx, testProjectId, testInstanceId) + request := testClient.GetInstance(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -102,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +122,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index 633caee2c..fa30c47ca 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -127,7 +127,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiListInstancesRequest { - req := apiClient.ListInstances(ctx, model.ProjectId).Tag("") + req := apiClient.ListInstances(ctx, model.ProjectId, model.Region).Tag("") return req } diff --git a/internal/cmd/mongodbflex/instance/list/list_test.go b/internal/cmd/mongodbflex/instance/list/list_test.go index e8a95d34c..9c558f205 100644 --- a/internal/cmd/mongodbflex/instance/list/list_test.go +++ b/internal/cmd/mongodbflex/instance/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -26,8 +28,9 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -39,6 +42,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -50,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiListInstancesRequest)) mongodbflex.ApiListInstancesRequest { - request := testClient.ListInstances(testCtx, testProjectId).Tag("") + request := testClient.ListInstances(testCtx, testProjectId, testRegion).Tag("") for _, mod := range mods { mod(&request) } @@ -78,21 +82,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index b861cc423..92dafbb94 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -83,7 +83,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -112,7 +112,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance update: %w", err) } @@ -200,19 +200,19 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } type MongoDBFlexClient interface { - PartialUpdateInstance(ctx context.Context, projectId, instanceId string) mongodbflex.ApiPartialUpdateInstanceRequest - GetInstanceExecute(ctx context.Context, projectId, instanceId string) (*mongodbflex.GetInstanceResponse, error) - ListFlavorsExecute(ctx context.Context, projectId string) (*mongodbflex.ListFlavorsResponse, error) - ListStoragesExecute(ctx context.Context, projectId, flavorId string) (*mongodbflex.ListStoragesResponse, error) + PartialUpdateInstance(ctx context.Context, projectId, instanceId, region string) mongodbflex.ApiPartialUpdateInstanceRequest + GetInstanceExecute(ctx context.Context, projectId, instanceId, region string) (*mongodbflex.GetInstanceResponse, error) + ListFlavorsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListFlavorsResponse, error) + ListStoragesExecute(ctx context.Context, projectId, flavorId, region string) (*mongodbflex.ListStoragesResponse, error) } func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexClient) (mongodbflex.ApiPartialUpdateInstanceRequest, error) { - req := apiClient.PartialUpdateInstance(ctx, model.ProjectId, model.InstanceId) + req := apiClient.PartialUpdateInstance(ctx, model.ProjectId, model.InstanceId, model.Region) var flavorId *string var err error - flavors, err := apiClient.ListFlavorsExecute(ctx, model.ProjectId) + flavors, err := apiClient.ListFlavorsExecute(ctx, model.ProjectId, model.Region) if err != nil { return req, fmt.Errorf("get MongoDB Flex flavors: %w", err) } @@ -221,7 +221,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexC ram := model.RAM cpu := model.CPU if model.RAM == nil || model.CPU == nil { - currentInstance, err := apiClient.GetInstanceExecute(ctx, model.ProjectId, model.InstanceId) + currentInstance, err := apiClient.GetInstanceExecute(ctx, model.ProjectId, model.InstanceId, model.Region) if err != nil { return req, fmt.Errorf("get MongoDB Flex instance: %w", err) } @@ -252,13 +252,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient MongoDBFlexC if model.StorageClass != nil || model.StorageSize != nil { validationFlavorId := flavorId if validationFlavorId == nil { - currentInstance, err := apiClient.GetInstanceExecute(ctx, model.ProjectId, model.InstanceId) + currentInstance, err := apiClient.GetInstanceExecute(ctx, model.ProjectId, model.InstanceId, model.Region) if err != nil { return req, fmt.Errorf("get MongoDB Flex instance: %w", err) } validationFlavorId = currentInstance.Item.Flavor.Id } - storages, err = apiClient.ListStoragesExecute(ctx, model.ProjectId, *validationFlavorId) + storages, err = apiClient.ListStoragesExecute(ctx, model.ProjectId, *validationFlavorId, model.Region) if err != nil { return req, fmt.Errorf("get MongoDB Flex storages: %w", err) } diff --git a/internal/cmd/mongodbflex/instance/update/update_test.go b/internal/cmd/mongodbflex/instance/update/update_test.go index 0379f2c0f..1c0a92f2b 100644 --- a/internal/cmd/mongodbflex/instance/update/update_test.go +++ b/internal/cmd/mongodbflex/instance/update/update_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -32,25 +34,25 @@ type mongoDBFlexClientMocked struct { getInstanceResp *mongodbflex.GetInstanceResponse } -func (c *mongoDBFlexClientMocked) PartialUpdateInstance(ctx context.Context, projectId, instanceId string) mongodbflex.ApiPartialUpdateInstanceRequest { - return testClient.PartialUpdateInstance(ctx, projectId, instanceId) +func (c *mongoDBFlexClientMocked) PartialUpdateInstance(ctx context.Context, projectId, instanceId, region string) mongodbflex.ApiPartialUpdateInstanceRequest { + return testClient.PartialUpdateInstance(ctx, projectId, instanceId, region) } -func (c *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _ string) (*mongodbflex.GetInstanceResponse, error) { +func (c *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _, _ string) (*mongodbflex.GetInstanceResponse, error) { if c.getInstanceFails { return nil, fmt.Errorf("get instance failed") } return c.getInstanceResp, nil } -func (c *mongoDBFlexClientMocked) ListStoragesExecute(_ context.Context, _, _ string) (*mongodbflex.ListStoragesResponse, error) { +func (c *mongoDBFlexClientMocked) ListStoragesExecute(_ context.Context, _, _, _ string) (*mongodbflex.ListStoragesResponse, error) { if c.listFlavorsFails { return nil, fmt.Errorf("list storages failed") } return c.listStoragesResp, nil } -func (c *mongoDBFlexClientMocked) ListFlavorsExecute(_ context.Context, _ string) (*mongodbflex.ListFlavorsResponse, error) { +func (c *mongoDBFlexClientMocked) ListFlavorsExecute(_ context.Context, _, _ string) (*mongodbflex.ListFlavorsResponse, error) { if c.listFlavorsFails { return nil, fmt.Errorf("list flavors failed") } @@ -73,7 +75,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureRequiredFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -83,15 +86,16 @@ func fixtureRequiredFlagValues(mods ...func(flagValues map[string]string)) map[s func fixtureStandardFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - flavorIdFlag: testFlavorId, - instanceNameFlag: "example-name", - aclFlag: "0.0.0.0/0", - backupScheduleFlag: "0 0 * * *", - storageClassFlag: "class", - storageSizeFlag: "10", - versionFlag: "5.0", - typeFlag: "Single", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + flavorIdFlag: testFlavorId, + instanceNameFlag: "example-name", + aclFlag: "0.0.0.0/0", + backupScheduleFlag: "0 0 * * *", + storageClassFlag: "class", + storageSizeFlag: "10", + versionFlag: "5.0", + typeFlag: "Single", } for _, mod := range mods { mod(flagValues) @@ -103,6 +107,7 @@ func fixtureRequiredInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -117,6 +122,7 @@ func fixtureStandardInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -136,7 +142,7 @@ func fixtureStandardInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiPartialUpdateInstanceRequest)) mongodbflex.ApiPartialUpdateInstanceRequest { - request := testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId) + request := testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion) request = request.PartialUpdateInstancePayload(mongodbflex.PartialUpdateInstancePayload{}) for _, mod := range mods { mod(&request) @@ -204,7 +210,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureRequiredFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -212,7 +218,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureRequiredFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -220,7 +226,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureRequiredFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -368,7 +374,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -376,7 +382,7 @@ func TestBuildRequest(t *testing.T) { }, }, }, - expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId). + expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion). PartialUpdateInstancePayload(mongodbflex.PartialUpdateInstancePayload{ FlavorId: utils.Ptr(testFlavorId), }), @@ -389,7 +395,7 @@ func TestBuildRequest(t *testing.T) { }), isValid: true, listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), @@ -397,7 +403,7 @@ func TestBuildRequest(t *testing.T) { }, }, }, - expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId). + expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion). PartialUpdateInstancePayload(mongodbflex.PartialUpdateInstancePayload{ FlavorId: utils.Ptr(testFlavorId), }), @@ -422,7 +428,7 @@ func TestBuildRequest(t *testing.T) { Max: utils.Ptr(int64(100)), }, }, - expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId). + expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion). PartialUpdateInstancePayload(mongodbflex.PartialUpdateInstancePayload{ Storage: &mongodbflex.Storage{ Class: utils.Ptr("class"), @@ -450,7 +456,7 @@ func TestBuildRequest(t *testing.T) { Max: utils.Ptr(int64(100)), }, }, - expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId). + expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testInstanceId, testRegion). PartialUpdateInstancePayload(mongodbflex.PartialUpdateInstancePayload{ Storage: &mongodbflex.Storage{ Class: utils.Ptr("class"), @@ -478,7 +484,7 @@ func TestBuildRequest(t *testing.T) { }, ), listFlavorsResp: &mongodbflex.ListFlavorsResponse{ - Flavors: &[]mongodbflex.HandlersInfraFlavor{ + Flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr(testFlavorId), Cpu: utils.Ptr(int64(2)), diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 55ad63408..53499547e 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -37,9 +37,9 @@ type inputModel struct { } type options struct { - Flavors *[]mongodbflex.HandlersInfraFlavor `json:"flavors,omitempty"` - Versions *[]string `json:"versions,omitempty"` - Storages *flavorStorages `json:"flavorStorages,omitempty"` + Flavors *[]mongodbflex.InstanceFlavor `json:"flavors,omitempty"` + Versions *[]string `json:"versions,omitempty"` + Storages *flavorStorages `json:"flavorStorages,omitempty"` } type flavorStorages struct { @@ -138,9 +138,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } type mongoDBFlexOptionsClient interface { - ListFlavorsExecute(ctx context.Context, projectId string) (*mongodbflex.ListFlavorsResponse, error) - ListVersionsExecute(ctx context.Context, projectId string) (*mongodbflex.ListVersionsResponse, error) - ListStoragesExecute(ctx context.Context, projectId, flavorId string) (*mongodbflex.ListStoragesResponse, error) + ListFlavorsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListFlavorsResponse, error) + ListVersionsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListVersionsResponse, error) + ListStoragesExecute(ctx context.Context, projectId, flavorId, region string) (*mongodbflex.ListStoragesResponse, error) } func buildAndExecuteRequest(ctx context.Context, p *print.Printer, model *inputModel, apiClient mongoDBFlexOptionsClient) error { @@ -150,19 +150,19 @@ func buildAndExecuteRequest(ctx context.Context, p *print.Printer, model *inputM var err error if model.Flavors { - flavors, err = apiClient.ListFlavorsExecute(ctx, model.ProjectId) + flavors, err = apiClient.ListFlavorsExecute(ctx, model.ProjectId, model.Region) if err != nil { return fmt.Errorf("get MongoDB Flex flavors: %w", err) } } if model.Versions { - versions, err = apiClient.ListVersionsExecute(ctx, model.ProjectId) + versions, err = apiClient.ListVersionsExecute(ctx, model.ProjectId, model.Region) if err != nil { return fmt.Errorf("get MongoDB Flex versions: %w", err) } } if model.Storages { - storages, err = apiClient.ListStoragesExecute(ctx, model.ProjectId, *model.FlavorId) + storages, err = apiClient.ListStoragesExecute(ctx, model.ProjectId, *model.FlavorId, model.Region) if err != nil { return fmt.Errorf("get MongoDB Flex storages: %w", err) } @@ -237,7 +237,7 @@ func outputResultAsTable(p *print.Printer, model *inputModel, options *options) return nil } -func buildFlavorsTable(flavors []mongodbflex.HandlersInfraFlavor) tables.Table { +func buildFlavorsTable(flavors []mongodbflex.InstanceFlavor) tables.Table { table := tables.NewTable() table.SetTitle("Flavors") table.SetHeader("ID", "CPU", "MEMORY", "DESCRIPTION", "VALID INSTANCE TYPES") diff --git a/internal/cmd/mongodbflex/options/options_test.go b/internal/cmd/mongodbflex/options/options_test.go index dc1eb60c8..35ab363dc 100644 --- a/internal/cmd/mongodbflex/options/options_test.go +++ b/internal/cmd/mongodbflex/options/options_test.go @@ -28,17 +28,17 @@ type mongoDBFlexClientMocked struct { listStoragesCalled bool } -func (c *mongoDBFlexClientMocked) ListFlavorsExecute(_ context.Context, _ string) (*mongodbflex.ListFlavorsResponse, error) { +func (c *mongoDBFlexClientMocked) ListFlavorsExecute(_ context.Context, _, _ string) (*mongodbflex.ListFlavorsResponse, error) { c.listFlavorsCalled = true if c.listFlavorsFails { return nil, fmt.Errorf("list flavors failed") } return utils.Ptr(mongodbflex.ListFlavorsResponse{ - Flavors: utils.Ptr([]mongodbflex.HandlersInfraFlavor{}), + Flavors: utils.Ptr([]mongodbflex.InstanceFlavor{}), }), nil } -func (c *mongoDBFlexClientMocked) ListVersionsExecute(_ context.Context, _ string) (*mongodbflex.ListVersionsResponse, error) { +func (c *mongoDBFlexClientMocked) ListVersionsExecute(_ context.Context, _, _ string) (*mongodbflex.ListVersionsResponse, error) { c.listVersionsCalled = true if c.listVersionsFails { return nil, fmt.Errorf("list versions failed") @@ -48,7 +48,7 @@ func (c *mongoDBFlexClientMocked) ListVersionsExecute(_ context.Context, _ strin }), nil } -func (c *mongoDBFlexClientMocked) ListStoragesExecute(_ context.Context, _, _ string) (*mongodbflex.ListStoragesResponse, error) { +func (c *mongoDBFlexClientMocked) ListStoragesExecute(_ context.Context, _, _, _ string) (*mongodbflex.ListStoragesResponse, error) { c.listStoragesCalled = true if c.listStoragesFails { return nil, fmt.Errorf("list storages failed") diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index 095077242..924f91896 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId @@ -141,7 +141,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiCreateUserRequest { - req := apiClient.CreateUser(ctx, model.ProjectId, model.InstanceId) + req := apiClient.CreateUser(ctx, model.ProjectId, model.InstanceId, model.Region) req = req.CreateUserPayload(mongodbflex.CreateUserPayload{ Username: model.Username, Database: model.Database, diff --git a/internal/cmd/mongodbflex/user/create/create_test.go b/internal/cmd/mongodbflex/user/create/create_test.go index 75e02fef0..db666260b 100644 --- a/internal/cmd/mongodbflex/user/create/create_test.go +++ b/internal/cmd/mongodbflex/user/create/create_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -27,11 +29,12 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - usernameFlag: "johndoe", - databaseFlag: "default", - roleFlag: "read", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, + usernameFlag: "johndoe", + databaseFlag: "default", + roleFlag: "read", } for _, mod := range mods { mod(flagValues) @@ -43,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiCreateUserRequest)) mongodbflex.ApiCreateUserRequest { - request := testClient.CreateUser(testCtx, testProjectId, testInstanceId) + request := testClient.CreateUser(testCtx, testProjectId, testInstanceId, testRegion) request = request.CreateUserPayload(mongodbflex.CreateUserPayload{ Username: utils.Ptr("johndoe"), Database: utils.Ptr("default"), @@ -102,21 +106,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/user/delete/delete.go b/internal/cmd/mongodbflex/user/delete/delete.go index 1d0818522..05e72686b 100644 --- a/internal/cmd/mongodbflex/user/delete/delete.go +++ b/internal/cmd/mongodbflex/user/delete/delete.go @@ -59,13 +59,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) + userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId @@ -128,6 +128,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiDeleteUserRequest { - req := apiClient.DeleteUser(ctx, model.ProjectId, model.InstanceId, model.UserId) + req := apiClient.DeleteUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/user/delete/delete_test.go b/internal/cmd/mongodbflex/user/delete/delete_test.go index b373f7f56..1a20490f1 100644 --- a/internal/cmd/mongodbflex/user/delete/delete_test.go +++ b/internal/cmd/mongodbflex/user/delete/delete_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -36,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -49,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -61,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiDeleteUserRequest)) mongodbflex.ApiDeleteUserRequest { - request := testClient.DeleteUser(testCtx, testProjectId, testInstanceId, testUserId) + request := testClient.DeleteUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) for _, mod := range mods { mod(&request) } @@ -105,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/user/describe/describe.go b/internal/cmd/mongodbflex/user/describe/describe.go index 67eb3d84b..410896fc9 100644 --- a/internal/cmd/mongodbflex/user/describe/describe.go +++ b/internal/cmd/mongodbflex/user/describe/describe.go @@ -114,7 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiGetUserRequest { - req := apiClient.GetUser(ctx, model.ProjectId, model.InstanceId, model.UserId) + req := apiClient.GetUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/user/describe/describe_test.go b/internal/cmd/mongodbflex/user/describe/describe_test.go index c151b4da0..5315f8b8a 100644 --- a/internal/cmd/mongodbflex/user/describe/describe_test.go +++ b/internal/cmd/mongodbflex/user/describe/describe_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -36,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -49,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -61,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiGetUserRequest)) mongodbflex.ApiGetUserRequest { - request := testClient.GetUser(testCtx, testProjectId, testInstanceId, testUserId) + request := testClient.GetUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) for _, mod := range mods { mod(&request) } @@ -105,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index ffdb6f10a..d9e947e9c 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -71,7 +71,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get MongoDB Flex users: %w", err) } if resp.Items == nil || len(*resp.Items) == 0 { - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = *model.InstanceId @@ -135,7 +135,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiListUsersRequest { - req := apiClient.ListUsers(ctx, model.ProjectId, *model.InstanceId) + req := apiClient.ListUsers(ctx, model.ProjectId, *model.InstanceId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/user/list/list_test.go b/internal/cmd/mongodbflex/user/list/list_test.go index 18e9325f5..45d28d41d 100644 --- a/internal/cmd/mongodbflex/user/list/list_test.go +++ b/internal/cmd/mongodbflex/user/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -27,9 +29,10 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -41,6 +44,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: utils.Ptr(testInstanceId), @@ -53,7 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiListUsersRequest)) mongodbflex.ApiListUsersRequest { - request := testClient.ListUsers(testCtx, testProjectId, testInstanceId) + request := testClient.ListUsers(testCtx, testProjectId, testInstanceId, testRegion) for _, mod := range mods { mod(&request) } @@ -81,21 +85,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index 0144a20b5..c58dfd020 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -61,13 +61,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) + userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId @@ -130,7 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiResetUserRequest { - req := apiClient.ResetUser(ctx, model.ProjectId, model.InstanceId, model.UserId) + req := apiClient.ResetUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) return req } diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go index d86e57206..349baec27 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -36,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -49,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -61,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiResetUserRequest)) mongodbflex.ApiResetUserRequest { - request := testClient.ResetUser(testCtx, testProjectId, testInstanceId, testUserId) + request := testClient.ResetUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) for _, mod := range mods { mod(&request) } @@ -105,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index 8dded41b0..4742a8e82 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -60,13 +60,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) instanceLabel = model.InstanceId } - userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId) + userLabel, err := mongodbflexUtils.GetUserName(ctx, apiClient, model.ProjectId, model.InstanceId, model.UserId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get user name: %v", err) userLabel = model.UserId @@ -143,7 +143,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex.APIClient) mongodbflex.ApiPartialUpdateUserRequest { - req := apiClient.PartialUpdateUser(ctx, model.ProjectId, model.InstanceId, model.UserId) + req := apiClient.PartialUpdateUser(ctx, model.ProjectId, model.InstanceId, model.UserId, model.Region) req = req.PartialUpdateUserPayload(mongodbflex.PartialUpdateUserPayload{ Database: model.Database, Roles: model.Roles, diff --git a/internal/cmd/mongodbflex/user/update/update_test.go b/internal/cmd/mongodbflex/user/update/update_test.go index e4f74eb0f..3f12bda1a 100644 --- a/internal/cmd/mongodbflex/user/update/update_test.go +++ b/internal/cmd/mongodbflex/user/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu02" +) type testCtxKey struct{} @@ -37,9 +39,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - databaseFlag: "default", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + instanceIdFlag: testInstanceId, + databaseFlag: "default", } for _, mod := range mods { mod(flagValues) @@ -51,6 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, InstanceId: testInstanceId, @@ -64,7 +68,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *mongodbflex.ApiPartialUpdateUserRequest)) mongodbflex.ApiPartialUpdateUserRequest { - request := testClient.PartialUpdateUser(testCtx, testProjectId, testInstanceId, testUserId) + request := testClient.PartialUpdateUser(testCtx, testProjectId, testInstanceId, testUserId, testRegion) request = request.PartialUpdateUserPayload(mongodbflex.PartialUpdateUserPayload{ Database: utils.Ptr("default"), }) @@ -128,7 +132,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -136,7 +140,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -144,7 +148,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/pkg/services/mongodbflex/client/client.go b/internal/pkg/services/mongodbflex/client/client.go index b69cc40bf..216fbd9d5 100644 --- a/internal/pkg/services/mongodbflex/client/client.go +++ b/internal/pkg/services/mongodbflex/client/client.go @@ -18,15 +18,12 @@ func ConfigureClient(p *print.Printer, cliVersion string) (*mongodbflex.APIClien p.Debug(print.ErrorLevel, "configure authentication: %v", err) return nil, &errors.AuthError{} } - region := viper.GetString(config.RegionKey) cfgOptions := []sdkConfig.ConfigurationOption{ utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), authCfgOption, } customEndpoint := viper.GetString(config.MongoDBFlexCustomEndpointKey) - if customEndpoint != "" { cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) } diff --git a/internal/pkg/services/mongodbflex/utils/utils.go b/internal/pkg/services/mongodbflex/utils/utils.go index ad2e07f9e..52d9aa311 100644 --- a/internal/pkg/services/mongodbflex/utils/utils.go +++ b/internal/pkg/services/mongodbflex/utils/utils.go @@ -21,10 +21,10 @@ var instanceTypeToReplicas = map[string]int64{ } type MongoDBFlexClient interface { - ListVersionsExecute(ctx context.Context, projectId string) (*mongodbflex.ListVersionsResponse, error) - GetInstanceExecute(ctx context.Context, projectId, instanceId string) (*mongodbflex.GetInstanceResponse, error) - GetUserExecute(ctx context.Context, projectId, instanceId, userId string) (*mongodbflex.GetUserResponse, error) - ListRestoreJobsExecute(ctx context.Context, projectId string, instanceId string) (*mongodbflex.ListRestoreJobsResponse, error) + ListVersionsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListVersionsResponse, error) + GetInstanceExecute(ctx context.Context, projectId, instanceId, region string) (*mongodbflex.GetInstanceResponse, error) + GetUserExecute(ctx context.Context, projectId, instanceId, userId, region string) (*mongodbflex.GetUserResponse, error) + ListRestoreJobsExecute(ctx context.Context, projectId string, instanceId, region string) (*mongodbflex.ListRestoreJobsResponse, error) } func AvailableInstanceTypes() []string { @@ -57,7 +57,7 @@ func GetInstanceType(numReplicas int64) (string, error) { return "", fmt.Errorf("invalid number of replicas: %v", numReplicas) } -func ValidateFlavorId(flavorId string, flavors *[]mongodbflex.HandlersInfraFlavor) error { +func ValidateFlavorId(flavorId string, flavors *[]mongodbflex.InstanceFlavor) error { if flavors == nil { return fmt.Errorf("nil flavors") } @@ -101,7 +101,7 @@ func ValidateStorage(storageClass *string, storageSize *int64, storages *mongodb } } -func LoadFlavorId(cpu, ram int64, flavors *[]mongodbflex.HandlersInfraFlavor) (*string, error) { +func LoadFlavorId(cpu, ram int64, flavors *[]mongodbflex.InstanceFlavor) (*string, error) { if flavors == nil { return nil, fmt.Errorf("nil flavors") } @@ -122,8 +122,8 @@ func LoadFlavorId(cpu, ram int64, flavors *[]mongodbflex.HandlersInfraFlavor) (* } } -func GetLatestMongoDBVersion(ctx context.Context, apiClient MongoDBFlexClient, projectId string) (string, error) { - resp, err := apiClient.ListVersionsExecute(ctx, projectId) +func GetLatestMongoDBVersion(ctx context.Context, apiClient MongoDBFlexClient, projectId, region string) (string, error) { + resp, err := apiClient.ListVersionsExecute(ctx, projectId, region) if err != nil { return "", fmt.Errorf("get MongoDB versions: %w", err) } @@ -144,16 +144,16 @@ func GetLatestMongoDBVersion(ctx context.Context, apiClient MongoDBFlexClient, p return latestVersion, nil } -func GetInstanceName(ctx context.Context, apiClient MongoDBFlexClient, projectId, instanceId string) (string, error) { - resp, err := apiClient.GetInstanceExecute(ctx, projectId, instanceId) +func GetInstanceName(ctx context.Context, apiClient MongoDBFlexClient, projectId, instanceId, region string) (string, error) { + resp, err := apiClient.GetInstanceExecute(ctx, projectId, instanceId, region) if err != nil { return "", fmt.Errorf("get MongoDB Flex instance: %w", err) } return *resp.Item.Name, nil } -func GetUserName(ctx context.Context, apiClient MongoDBFlexClient, projectId, instanceId, userId string) (string, error) { - resp, err := apiClient.GetUserExecute(ctx, projectId, instanceId, userId) +func GetUserName(ctx context.Context, apiClient MongoDBFlexClient, projectId, instanceId, userId, region string) (string, error) { + resp, err := apiClient.GetUserExecute(ctx, projectId, instanceId, userId, region) if err != nil { return "", fmt.Errorf("get MongoDB Flex user: %w", err) } diff --git a/internal/pkg/services/mongodbflex/utils/utils_test.go b/internal/pkg/services/mongodbflex/utils/utils_test.go index 1024c5710..4867c5bb3 100644 --- a/internal/pkg/services/mongodbflex/utils/utils_test.go +++ b/internal/pkg/services/mongodbflex/utils/utils_test.go @@ -20,6 +20,7 @@ var ( ) const ( + testRegion = "eu02" testInstanceName = "instance" testUserName = "user" ) @@ -35,28 +36,28 @@ type mongoDBFlexClientMocked struct { listRestoreJobsResp *mongodbflex.ListRestoreJobsResponse } -func (m *mongoDBFlexClientMocked) ListVersionsExecute(_ context.Context, _ string) (*mongodbflex.ListVersionsResponse, error) { +func (m *mongoDBFlexClientMocked) ListVersionsExecute(_ context.Context, _, _ string) (*mongodbflex.ListVersionsResponse, error) { if m.listVersionsFails { return nil, fmt.Errorf("could not list versions") } return m.listVersionsResp, nil } -func (m *mongoDBFlexClientMocked) ListRestoreJobsExecute(_ context.Context, _, _ string) (*mongodbflex.ListRestoreJobsResponse, error) { +func (m *mongoDBFlexClientMocked) ListRestoreJobsExecute(_ context.Context, _, _, _ string) (*mongodbflex.ListRestoreJobsResponse, error) { if m.listRestoreJobsFails { return nil, fmt.Errorf("could not list versions") } return m.listRestoreJobsResp, nil } -func (m *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _ string) (*mongodbflex.GetInstanceResponse, error) { +func (m *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _, _ string) (*mongodbflex.GetInstanceResponse, error) { if m.getInstanceFails { return nil, fmt.Errorf("could not get instance") } return m.getInstanceResp, nil } -func (m *mongoDBFlexClientMocked) GetUserExecute(_ context.Context, _, _, _ string) (*mongodbflex.GetUserResponse, error) { +func (m *mongoDBFlexClientMocked) GetUserExecute(_ context.Context, _, _, _, _ string) (*mongodbflex.GetUserResponse, error) { if m.getUserFails { return nil, fmt.Errorf("could not get user") } @@ -175,13 +176,13 @@ func TestValidateFlavorId(t *testing.T) { tests := []struct { description string flavorId string - flavors *[]mongodbflex.HandlersInfraFlavor + flavors *[]mongodbflex.InstanceFlavor isValid bool }{ { description: "base", flavorId: "foo", - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ {Id: utils.Ptr("bar-1")}, {Id: utils.Ptr("bar-2")}, {Id: utils.Ptr("foo")}, @@ -197,13 +198,13 @@ func TestValidateFlavorId(t *testing.T) { { description: "no flavors", flavorId: "foo", - flavors: &[]mongodbflex.HandlersInfraFlavor{}, + flavors: &[]mongodbflex.InstanceFlavor{}, isValid: false, }, { description: "nil flavor id", flavorId: "foo", - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ {Id: utils.Ptr("bar-1")}, {Id: nil}, {Id: utils.Ptr("foo")}, @@ -213,7 +214,7 @@ func TestValidateFlavorId(t *testing.T) { { description: "invalid flavor", flavorId: "foo", - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ {Id: utils.Ptr("bar-1")}, {Id: utils.Ptr("bar-2")}, {Id: utils.Ptr("bar-3")}, @@ -240,7 +241,7 @@ func TestLoadFlavorId(t *testing.T) { description string cpu int64 ram int64 - flavors *[]mongodbflex.HandlersInfraFlavor + flavors *[]mongodbflex.InstanceFlavor isValid bool expectedOutput *string }{ @@ -248,7 +249,7 @@ func TestLoadFlavorId(t *testing.T) { description: "base", cpu: 2, ram: 4, - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr("bar-1"), Cpu: utils.Ptr(int64(2)), @@ -279,14 +280,14 @@ func TestLoadFlavorId(t *testing.T) { description: "no flavors", cpu: 2, ram: 4, - flavors: &[]mongodbflex.HandlersInfraFlavor{}, + flavors: &[]mongodbflex.InstanceFlavor{}, isValid: false, }, { description: "flavors with details missing", cpu: 2, ram: 4, - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr("bar-1"), Cpu: nil, @@ -310,7 +311,7 @@ func TestLoadFlavorId(t *testing.T) { description: "match with nil id", cpu: 2, ram: 4, - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr("bar-1"), Cpu: utils.Ptr(int64(2)), @@ -333,7 +334,7 @@ func TestLoadFlavorId(t *testing.T) { description: "invalid settings", cpu: 2, ram: 4, - flavors: &[]mongodbflex.HandlersInfraFlavor{ + flavors: &[]mongodbflex.InstanceFlavor{ { Id: utils.Ptr("bar-1"), Cpu: utils.Ptr(int64(2)), @@ -411,7 +412,7 @@ func TestGetLatestMongoDBFlexVersion(t *testing.T) { listVersionsResp: tt.listVersionsResp, } - output, err := GetLatestMongoDBVersion(context.Background(), client, testProjectId) + output, err := GetLatestMongoDBVersion(context.Background(), client, testProjectId, testRegion) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -461,7 +462,7 @@ func TestGetInstanceName(t *testing.T) { getInstanceResp: tt.getInstanceResp, } - output, err := GetInstanceName(context.Background(), client, testProjectId, testInstanceId) + output, err := GetInstanceName(context.Background(), client, testProjectId, testInstanceId, testRegion) if tt.isValid && err != nil { t.Errorf("failed on valid input") @@ -511,7 +512,7 @@ func TestGetUserName(t *testing.T) { getUserResp: tt.getUserResp, } - output, err := GetUserName(context.Background(), client, testProjectId, testInstanceId, testUserId) + output, err := GetUserName(context.Background(), client, testProjectId, testInstanceId, testUserId, testRegion) if tt.isValid && err != nil { t.Errorf("failed on valid input") From 660099369456f2ae36f6c6591bd5eaf73810fc10 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 15 Jul 2025 09:07:57 +0200 Subject: [PATCH 074/422] chore(deps): update renovatebot/github-action action to v43.0.3 (#864) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 2e1f2a8e3..1e857a5f1 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.2 + uses: renovatebot/github-action@v43.0.3 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 75c6a9d02d090eb49243204b8e7ed08de24194c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 07:14:30 +0000 Subject: [PATCH 075/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#862) Bumps [github.com/stackitcloud/stackit-sdk-go/services/loadbalancer](https://github.com/stackitcloud/stackit-sdk-go) from 1.4.0 to 1.5.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/mongodbflex/v1.4.0...services/mongodbflex/v1.5.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/loadbalancer dependency-version: 1.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 97a3bf5ee..8310cd896 100644 --- a/go.mod +++ b/go.mod @@ -236,7 +236,7 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 diff --git a/go.sum b/go.sum index f89590d9d..724dd9e92 100644 --- a/go.sum +++ b/go.sum @@ -574,8 +574,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 h1:UJDtK96cjQqp5yWb8T github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 h1:5vxOzwQ+rNm0g9ZLQW/31dqdDqGfw/FQbrjxUUAHtiA= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0 h1:Ef4SyTBjIkfwaws4mssa6AoK+OokHFtr7ZIflUpoXVE= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.4.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0 h1:KgptlhV0LgOevtrfMBd2pm/Hrnz6vNSYgAJo6pT7eMM= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCxpFXN2K7g2ih0gQM6cyZ1VhTmtQfI= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= From bd1a0ace740ced2df5cdb90a5ab5993ec4e6ba93 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:54:47 +0200 Subject: [PATCH 076/422] chore(deps): bump golang.org/x/term from 0.32.0 to 0.33.0 (#860) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.32.0 to 0.33.0. - [Commits](https://github.com/golang/term/compare/v0.32.0...v0.33.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8310cd896..45198f645 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.26.0 golang.org/x/oauth2 v0.30.0 - golang.org/x/term v0.32.0 + golang.org/x/term v0.33.0 golang.org/x/text v0.27.0 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 @@ -245,7 +245,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/sys v0.34.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.32.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index 724dd9e92..4da254def 100644 --- a/go.sum +++ b/go.sum @@ -872,8 +872,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -882,8 +882,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 9cec175a88a71c53f633f7966b3af92c766ee0f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 11:02:33 +0000 Subject: [PATCH 077/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#859) Bumps [github.com/stackitcloud/stackit-sdk-go/services/ske](https://github.com/stackitcloud/stackit-sdk-go) from 1.0.0 to 1.1.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.0.0...services/cdn/v1.1.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/ske dependency-version: 1.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 45198f645..360148168 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.26.0 diff --git a/go.sum b/go.sum index 4da254def..80d9cca6c 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 h1:2d28WFQ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1TsWatlsexLeKdkb3L8chcxaXJOy/cLXctsRxhb4xg= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0 h1:PX8VTo2UhPd6BeEaCHFlpIkDbk9OFQEO6eJJ8JkxesA= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.0.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.1.0 h1:Qj2Ild7NmHVm1rvPZg9Utc862sLJFiAfvRFLG0Qc+Uc= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.1.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 h1:pUl/981oAXPnZd7++69NfEWv6JwW9UpxER16XxQUdOk= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0/go.mod h1:S04/QsQrB2EgYGjl62BO+9QUswrlRBoBosigrhdmccM= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From d0354c5627ea8445e654ac82f6bdaab88870d6b2 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 17 Jul 2025 09:53:31 +0200 Subject: [PATCH 078/422] fix(deps): update module github.com/spf13/pflag to v1.0.7 (#871) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 360148168..8437a386c 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.9.1 - github.com/spf13/pflag v1.0.6 + github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 diff --git a/go.sum b/go.sum index 80d9cca6c..338abe366 100644 --- a/go.sum +++ b/go.sum @@ -556,8 +556,9 @@ github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cA 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.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= +github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= From 5d8a9f9a55be96abec08601dc2956a3b863be367 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:01:42 +0000 Subject: [PATCH 079/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#867) Bumps [github.com/stackitcloud/stackit-sdk-go/services/alb](https://github.com/stackitcloud/stackit-sdk-go) from 0.5.0 to 0.6.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.5.0...core/v0.6.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/alb dependency-version: 0.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8437a386c..9f58687b2 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.2 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 diff --git a/go.sum b/go.sum index 338abe366..41db70b99 100644 --- a/go.sum +++ b/go.sum @@ -565,8 +565,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0 h1:7UKUi7Od7KpuVjV4I/jUAV5NEatUomwWFd/IRODbioY= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.5.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.0 h1:eYP2TSEEZassdyA3V9Ci5jGMvK/WH1/gzTAUfvlpRyk= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 h1:KXMiTBV4KcOEQRFddtOUFspL+KRvjDQNDIs73bdiey0= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0/go.mod h1:+2mx2MclJFMQ4Y6b20jspYAnIeFJP3/yvO6Gfvcvf6Q= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 h1:x5mx/C2bdtpOH974RofXD0Y8YOyJtYXwIyaCyWOXMwU= From b7897356957481d87bc092c5a51e24a4929ede1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 08:12:17 +0000 Subject: [PATCH 080/422] chore(deps): bump github.com/golang-jwt/jwt/v5 from 5.2.2 to 5.2.3 (#866) Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.2.2 to 5.2.3. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.2...v5.2.3) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v5 dependency-version: 5.2.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9f58687b2..6ab07093a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24 require ( github.com/fatih/color v1.18.0 github.com/goccy/go-yaml v1.18.0 - github.com/golang-jwt/jwt/v5 v5.2.2 + github.com/golang-jwt/jwt/v5 v5.2.3 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf diff --git a/go.sum b/go.sum index 41db70b99..ae5aef08a 100644 --- a/go.sum +++ b/go.sum @@ -222,8 +222,8 @@ github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeH github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= -github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= +github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= From 0b8327ebfb7062d6c66307cfe4f89e610b55f739 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 10:58:43 +0200 Subject: [PATCH 081/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability (#865) Bumps [github.com/stackitcloud/stackit-sdk-go/services/observability](https://github.com/stackitcloud/stackit-sdk-go) from 0.8.0 to 0.9.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.8.0...core/v0.9.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/observability dependency-version: 0.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6ab07093a..0bf1e4730 100644 --- a/go.mod +++ b/go.mod @@ -240,7 +240,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index ae5aef08a..20839d0b9 100644 --- a/go.sum +++ b/go.sum @@ -585,8 +585,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0 h1:il4vBOejtX github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0 h1:8v9Iupkc3meXcVPMpteXDz07YzY2M5jud50vEtAvbs8= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.8.0/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 h1:NuRgx13h3mnzWcRTLPiL5fk06xpl43vaz+QOuHvSEHA= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 h1:+qFjzDDv/0ZHGdVuW2HzAphRBmlc1+abw7k1RaAqmQo= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 h1:DGgKKCh3AmUBqDG0DrsWVcclxSaG82TVEf18A29w+J0= From 32bd967acbf059a2d8441949f6dca7495fa0cfea Mon Sep 17 00:00:00 2001 From: ivan-tejero Date: Thu, 17 Jul 2025 11:51:22 +0200 Subject: [PATCH 082/422] feat(git): add flags for flavor and acl to instance create cmd, add flavor list cmd (#841) --- docs/stackit_git.md | 6 +- ...it_git_create.md => stackit_git_flavor.md} | 19 +- docs/stackit_git_flavor_list.md | 44 ++++ docs/stackit_git_instance.md | 37 +++ docs/stackit_git_instance_create.md | 49 ++++ ...lete.md => stackit_git_instance_delete.md} | 10 +- ...be.md => stackit_git_instance_describe.md} | 8 +- ...t_list.md => stackit_git_instance_list.md} | 8 +- internal/cmd/git/flavor/flavor.go | 28 +++ internal/cmd/git/flavor/list/list.go | 161 ++++++++++++ internal/cmd/git/flavor/list/list_test.go | 237 ++++++++++++++++++ internal/cmd/git/git.go | 12 +- .../cmd/git/{ => instance}/create/create.go | 33 ++- .../git/{ => instance}/create/create_test.go | 14 +- .../cmd/git/{ => instance}/delete/delete.go | 3 +- .../git/{ => instance}/delete/delete_test.go | 0 .../git/{ => instance}/describe/describe.go | 0 .../{ => instance}/describe/describe_test.go | 0 internal/cmd/git/instance/instance.go | 34 +++ internal/cmd/git/{ => instance}/list/list.go | 0 .../cmd/git/{ => instance}/list/list_test.go | 0 21 files changed, 654 insertions(+), 49 deletions(-) rename docs/{stackit_git_create.md => stackit_git_flavor.md} (65%) create mode 100644 docs/stackit_git_flavor_list.md create mode 100644 docs/stackit_git_instance.md create mode 100644 docs/stackit_git_instance_create.md rename docs/{stackit_git_delete.md => stackit_git_instance_delete.md} (72%) rename docs/{stackit_git_describe.md => stackit_git_instance_describe.md} (75%) rename docs/{stackit_git_list.md => stackit_git_instance_list.md} (79%) create mode 100644 internal/cmd/git/flavor/flavor.go create mode 100644 internal/cmd/git/flavor/list/list.go create mode 100644 internal/cmd/git/flavor/list/list_test.go rename internal/cmd/git/{ => instance}/create/create.go (82%) rename internal/cmd/git/{ => instance}/create/create_test.go (94%) rename internal/cmd/git/{ => instance}/delete/delete.go (97%) rename internal/cmd/git/{ => instance}/delete/delete_test.go (100%) rename internal/cmd/git/{ => instance}/describe/describe.go (100%) rename internal/cmd/git/{ => instance}/describe/describe_test.go (100%) create mode 100644 internal/cmd/git/instance/instance.go rename internal/cmd/git/{ => instance}/list/list.go (100%) rename internal/cmd/git/{ => instance}/list/list_test.go (100%) diff --git a/docs/stackit_git.md b/docs/stackit_git.md index 8a959c7d2..2a9b072e2 100644 --- a/docs/stackit_git.md +++ b/docs/stackit_git.md @@ -30,8 +30,6 @@ stackit git [flags] ### SEE ALSO * [stackit](./stackit.md) - Manage STACKIT resources using the command line -* [stackit git create](./stackit_git_create.md) - Creates STACKIT Git instance -* [stackit git delete](./stackit_git_delete.md) - Deletes STACKIT Git instance -* [stackit git describe](./stackit_git_describe.md) - Describes STACKIT Git instance -* [stackit git list](./stackit_git_list.md) - Lists all instances of STACKIT Git. +* [stackit git flavor](./stackit_git_flavor.md) - Provides functionality for STACKIT Git flavors +* [stackit git instance](./stackit_git_instance.md) - Provides functionality for STACKIT Git instances diff --git a/docs/stackit_git_create.md b/docs/stackit_git_flavor.md similarity index 65% rename from docs/stackit_git_create.md rename to docs/stackit_git_flavor.md index fa7a2a97d..c2ec85a08 100644 --- a/docs/stackit_git_create.md +++ b/docs/stackit_git_flavor.md @@ -1,27 +1,19 @@ -## stackit git create +## stackit git flavor -Creates STACKIT Git instance +Provides functionality for STACKIT Git flavors ### Synopsis -Create a STACKIT Git instance by name. +Provides functionality for STACKIT Git flavors. ``` -stackit git create [flags] -``` - -### Examples - -``` - Create a instance with name 'my-new-instance' - $ stackit git create --name my-new-instance +stackit git flavor [flags] ``` ### Options ``` - -h, --help Help for "stackit git create" - --name string The name of the instance. + -h, --help Help for "stackit git flavor" ``` ### Options inherited from parent commands @@ -38,4 +30,5 @@ stackit git create [flags] ### SEE ALSO * [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git +* [stackit git flavor list](./stackit_git_flavor_list.md) - Lists instances flavors of STACKIT Git. diff --git a/docs/stackit_git_flavor_list.md b/docs/stackit_git_flavor_list.md new file mode 100644 index 000000000..a8fc54b0f --- /dev/null +++ b/docs/stackit_git_flavor_list.md @@ -0,0 +1,44 @@ +## stackit git flavor list + +Lists instances flavors of STACKIT Git. + +### Synopsis + +Lists instances flavors of STACKIT Git for the current project. + +``` +stackit git flavor list [flags] +``` + +### Examples + +``` + List STACKIT Git flavors + $ stackit git flavor list + + Lists up to 10 STACKIT Git flavors + $ stackit git flavor list --limit=10 +``` + +### Options + +``` + -h, --help Help for "stackit git flavor list" + --limit int Limit the output to the first n elements +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git flavor](./stackit_git_flavor.md) - Provides functionality for STACKIT Git flavors + diff --git a/docs/stackit_git_instance.md b/docs/stackit_git_instance.md new file mode 100644 index 000000000..5f7c6d243 --- /dev/null +++ b/docs/stackit_git_instance.md @@ -0,0 +1,37 @@ +## stackit git instance + +Provides functionality for STACKIT Git instances + +### Synopsis + +Provides functionality for STACKIT Git instances. + +``` +stackit git instance [flags] +``` + +### Options + +``` + -h, --help Help for "stackit git instance" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git +* [stackit git instance create](./stackit_git_instance_create.md) - Creates STACKIT Git instance +* [stackit git instance delete](./stackit_git_instance_delete.md) - Deletes STACKIT Git instance +* [stackit git instance describe](./stackit_git_instance_describe.md) - Describes STACKIT Git instance +* [stackit git instance list](./stackit_git_instance_list.md) - Lists all instances of STACKIT Git. + diff --git a/docs/stackit_git_instance_create.md b/docs/stackit_git_instance_create.md new file mode 100644 index 000000000..e5d8bba93 --- /dev/null +++ b/docs/stackit_git_instance_create.md @@ -0,0 +1,49 @@ +## stackit git instance create + +Creates STACKIT Git instance + +### Synopsis + +Create a STACKIT Git instance by name. + +``` +stackit git instance create [flags] +``` + +### Examples + +``` + Create a instance with name 'my-new-instance' + $ stackit git instance create --name my-new-instance + + Create a instance with name 'my-new-instance' and flavor + $ stackit git instance create --name my-new-instance --flavor git-100' + + Create a instance with name 'my-new-instance' and acl + $ stackit git instance create --name my-new-instance --acl 1.1.1.1/1' +``` + +### Options + +``` + --acl strings Acl for the instance. + --flavor string Flavor of the instance. + -h, --help Help for "stackit git instance create" + --name string The name of the instance. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit git instance](./stackit_git_instance.md) - Provides functionality for STACKIT Git instances + diff --git a/docs/stackit_git_delete.md b/docs/stackit_git_instance_delete.md similarity index 72% rename from docs/stackit_git_delete.md rename to docs/stackit_git_instance_delete.md index 6f863ee60..df0a6d46a 100644 --- a/docs/stackit_git_delete.md +++ b/docs/stackit_git_instance_delete.md @@ -1,4 +1,4 @@ -## stackit git delete +## stackit git instance delete Deletes STACKIT Git instance @@ -7,20 +7,20 @@ Deletes STACKIT Git instance Deletes a STACKIT Git instance by its internal ID. ``` -stackit git delete INSTANCE_ID [flags] +stackit git instance delete INSTANCE_ID [flags] ``` ### Examples ``` Delete a instance with ID "xxx" - $ stackit git delete xxx + $ stackit git instance delete xxx ``` ### Options ``` - -h, --help Help for "stackit git delete" + -h, --help Help for "stackit git instance delete" ``` ### Options inherited from parent commands @@ -36,5 +36,5 @@ stackit git delete INSTANCE_ID [flags] ### SEE ALSO -* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git +* [stackit git instance](./stackit_git_instance.md) - Provides functionality for STACKIT Git instances diff --git a/docs/stackit_git_describe.md b/docs/stackit_git_instance_describe.md similarity index 75% rename from docs/stackit_git_describe.md rename to docs/stackit_git_instance_describe.md index e2aedcc40..90716803e 100644 --- a/docs/stackit_git_describe.md +++ b/docs/stackit_git_instance_describe.md @@ -1,4 +1,4 @@ -## stackit git describe +## stackit git instance describe Describes STACKIT Git instance @@ -7,7 +7,7 @@ Describes STACKIT Git instance Describes a STACKIT Git instance by its internal ID. ``` -stackit git describe INSTANCE_ID [flags] +stackit git instance describe INSTANCE_ID [flags] ``` ### Examples @@ -20,7 +20,7 @@ stackit git describe INSTANCE_ID [flags] ### Options ``` - -h, --help Help for "stackit git describe" + -h, --help Help for "stackit git instance describe" ``` ### Options inherited from parent commands @@ -36,5 +36,5 @@ stackit git describe INSTANCE_ID [flags] ### SEE ALSO -* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git +* [stackit git instance](./stackit_git_instance.md) - Provides functionality for STACKIT Git instances diff --git a/docs/stackit_git_list.md b/docs/stackit_git_instance_list.md similarity index 79% rename from docs/stackit_git_list.md rename to docs/stackit_git_instance_list.md index c0f65927b..96afe06d4 100644 --- a/docs/stackit_git_list.md +++ b/docs/stackit_git_instance_list.md @@ -1,4 +1,4 @@ -## stackit git list +## stackit git instance list Lists all instances of STACKIT Git. @@ -7,7 +7,7 @@ Lists all instances of STACKIT Git. Lists all instances of STACKIT Git for the current project. ``` -stackit git list [flags] +stackit git instance list [flags] ``` ### Examples @@ -23,7 +23,7 @@ stackit git list [flags] ### Options ``` - -h, --help Help for "stackit git list" + -h, --help Help for "stackit git instance list" --limit int Limit the output to the first n elements ``` @@ -40,5 +40,5 @@ stackit git list [flags] ### SEE ALSO -* [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git +* [stackit git instance](./stackit_git_instance.md) - Provides functionality for STACKIT Git instances diff --git a/internal/cmd/git/flavor/flavor.go b/internal/cmd/git/flavor/flavor.go new file mode 100644 index 000000000..c6f4c512f --- /dev/null +++ b/internal/cmd/git/flavor/flavor.go @@ -0,0 +1,28 @@ +package flavor + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/git/flavor/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "flavor", + Short: "Provides functionality for STACKIT Git flavors", + Long: "Provides functionality for STACKIT Git flavors.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand( + list.NewCmd(params), + ) +} diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go new file mode 100644 index 000000000..aec140d80 --- /dev/null +++ b/internal/cmd/git/flavor/list/list.go @@ -0,0 +1,161 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +const limitFlag = "limit" + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists instances flavors of STACKIT Git.", + Long: "Lists instances flavors of STACKIT Git for the current project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List STACKIT Git flavors`, + "$ stackit git flavor list"), + examples.NewExample( + "Lists up to 10 STACKIT Git flavors", + "$ stackit git flavor list --limit=10", + ), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get STACKIT Git flavors: %w", err) + } + flavors := *resp.Flavors + if len(flavors) == 0 { + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + params.Printer.Info("No flavors found for project %q\n", projectLabel) + return nil + } else if model.Limit != nil && len(flavors) > int(*model.Limit) { + flavors = (flavors)[:*model.Limit] + } + return outputResult(params.Printer, model.OutputFormat, flavors) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClient) git.ApiListFlavorsRequest { + return apiClient.ListFlavors(ctx, model.ProjectId) +} + +func outputResult(p *print.Printer, outputFormat string, flavors []git.Flavor) error { + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(flavors, "", " ") + if err != nil { + return fmt.Errorf("marshal Observability flavor list: %w", err) + } + p.Outputln(string(details)) + + return nil + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(flavors, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal Observability flavor list: %w", err) + } + p.Outputln(string(details)) + + return nil + default: + table := tables.NewTable() + table.SetHeader("ID", "DESCRIPTION", "DISPLAY_NAME", "AVAILABLE", "SKU") + for i := range flavors { + flavor := (flavors)[i] + table.AddRow( + utils.PtrString(flavor.Id), + utils.PtrString(flavor.Description), + utils.PtrString(flavor.DisplayName), + utils.PtrString(flavor.Availability), + utils.PtrString(flavor.Sku), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + } +} diff --git a/internal/cmd/git/flavor/list/list_test.go b/internal/cmd/git/flavor/list/list_test.go new file mode 100644 index 000000000..1413630b0 --- /dev/null +++ b/internal/cmd/git/flavor/list/list_test.go @@ -0,0 +1,237 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/git" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &git.APIClient{} +var testProjectId = uuid.NewString() + +const ( + testLimit = 10 +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *git.ApiListFlavorsRequest)) git.ApiListFlavorsRequest { + request := testClient.ListFlavors(testCtx, testProjectId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "with limit flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["limit"] = strconv.Itoa(testLimit) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(testLimit)) + }), + }, + { + description: "with limit flag == 0", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["limit"] = strconv.Itoa(0) + }), + isValid: false, + }, + { + description: "with limit flag < 0", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["limit"] = strconv.Itoa(-1) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest git.ApiListFlavorsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + flavors []git.Flavor + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty flavors slice", + args: args{ + flavors: []git.Flavor{}, + }, + wantErr: false, + }, + { + name: "set empty flavors in flavors slice", + args: args{ + flavors: []git.Flavor{{}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.flavors); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/git/git.go b/internal/cmd/git/git.go index fcacb4fcd..72605d968 100644 --- a/internal/cmd/git/git.go +++ b/internal/cmd/git/git.go @@ -1,10 +1,8 @@ package git import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/git/create" - "github.com/stackitcloud/stackit-cli/internal/cmd/git/delete" - "github.com/stackitcloud/stackit-cli/internal/cmd/git/describe" - "github.com/stackitcloud/stackit-cli/internal/cmd/git/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/flavor" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -26,9 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand( - list.NewCmd(params), - describe.NewCmd(params), - create.NewCmd(params), - delete.NewCmd(params), + instance.NewCmd(params), + flavor.NewCmd(params), ) } diff --git a/internal/cmd/git/create/create.go b/internal/cmd/git/instance/create/create.go similarity index 82% rename from internal/cmd/git/create/create.go rename to internal/cmd/git/instance/create/create.go index 6df750b37..761c2be61 100644 --- a/internal/cmd/git/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -5,10 +5,9 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,13 +22,17 @@ import ( ) const ( - nameFlag = "name" + nameFlag = "name" + flavorFlag = "flavor" + aclFlag = "acl" ) type inputModel struct { *globalflags.GlobalFlagModel - Id *string - Name string + Id *string + Name string + Flavor string + Acl []string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -41,7 +44,15 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Create a instance with name 'my-new-instance'`, - `$ stackit git create --name my-new-instance`, + `$ stackit git instance create --name my-new-instance`, + ), + examples.NewExample( + `Create a instance with name 'my-new-instance' and flavor`, + `$ stackit git instance create --name my-new-instance --flavor git-100'`, + ), + examples.NewExample( + `Create a instance with name 'my-new-instance' and acl`, + `$ stackit git instance create --name my-new-instance --acl 1.1.1.1/1'`, ), ), RunE: func(cmd *cobra.Command, _ []string) (err error) { @@ -95,6 +106,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().String(nameFlag, "", "The name of the instance.") + cmd.Flags().String(flavorFlag, "", "Flavor of the instance.") + cmd.Flags().StringSlice(aclFlag, []string{}, "Acl for the instance.") if err := flags.MarkFlagsRequired(cmd, nameFlag); err != nil { cobra.CheckErr(err) } @@ -107,10 +120,14 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { return nil, &errors.ProjectIdError{} } name := flags.FlagToStringValue(p, cmd, nameFlag) + flavor := flags.FlagToStringValue(p, cmd, flavorFlag) + acl := flags.FlagToStringSliceValue(p, cmd, aclFlag) model := inputModel{ GlobalFlagModel: globalFlags, Name: name, + Flavor: flavor, + Acl: acl, } if p.IsVerbosityDebug() { @@ -131,7 +148,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClie func createPayload(model *inputModel) git.CreateInstancePayload { return git.CreateInstancePayload{ - Name: &model.Name, + Name: &model.Name, + Flavor: git.CreateInstancePayloadGetFlavorAttributeType(&model.Flavor), + Acl: &model.Acl, } } diff --git a/internal/cmd/git/create/create_test.go b/internal/cmd/git/instance/create/create_test.go similarity index 94% rename from internal/cmd/git/create/create_test.go rename to internal/cmd/git/instance/create/create_test.go index 26499bf8b..5b46e1eef 100644 --- a/internal/cmd/git/create/create_test.go +++ b/internal/cmd/git/instance/create/create_test.go @@ -21,14 +21,18 @@ var ( testClient = &git.APIClient{} testProjectId = uuid.NewString() - testName = "test-instance" + testName = "test-instance" + testFlavor = "git-100" + testAcl = []string{"0.0.0.0/0"} ) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - nameFlag: testName, + nameFlag: testName, + flavorFlag: testFlavor, + aclFlag: testAcl[0], } for _, mod := range mods { mod(flagValues) @@ -40,6 +44,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, Name: testName, + Flavor: testFlavor, + Acl: testAcl, } for _, mod := range mods { mod(model) @@ -49,7 +55,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureCreatePayload(mods ...func(payload *git.CreateInstancePayload)) (payload git.CreateInstancePayload) { payload = git.CreateInstancePayload{ - Name: &testName, + Name: &testName, + Flavor: git.CreateInstancePayloadGetFlavorAttributeType(&testFlavor), + Acl: &testAcl, } for _, mod := range mods { mod(&payload) diff --git a/internal/cmd/git/delete/delete.go b/internal/cmd/git/instance/delete/delete.go similarity index 97% rename from internal/cmd/git/delete/delete.go rename to internal/cmd/git/instance/delete/delete.go index 67ae11438..c16a6b09e 100644 --- a/internal/cmd/git/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -35,7 +35,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Long: "Deletes a STACKIT Git instance by its internal ID.", Args: args.SingleArg(instanceIdArg, utils.ValidateUUID), Example: examples.Build( - examples.NewExample(`Delete a instance with ID "xxx"`, `$ stackit git delete xxx`), + examples.NewExample(`Delete a instance with ID "xxx"`, + `$ stackit git instance delete xxx`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/git/delete/delete_test.go b/internal/cmd/git/instance/delete/delete_test.go similarity index 100% rename from internal/cmd/git/delete/delete_test.go rename to internal/cmd/git/instance/delete/delete_test.go diff --git a/internal/cmd/git/describe/describe.go b/internal/cmd/git/instance/describe/describe.go similarity index 100% rename from internal/cmd/git/describe/describe.go rename to internal/cmd/git/instance/describe/describe.go diff --git a/internal/cmd/git/describe/describe_test.go b/internal/cmd/git/instance/describe/describe_test.go similarity index 100% rename from internal/cmd/git/describe/describe_test.go rename to internal/cmd/git/instance/describe/describe_test.go diff --git a/internal/cmd/git/instance/instance.go b/internal/cmd/git/instance/instance.go new file mode 100644 index 000000000..b2d66b43a --- /dev/null +++ b/internal/cmd/git/instance/instance.go @@ -0,0 +1,34 @@ +package instance + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "instance", + Short: "Provides functionality for STACKIT Git instances", + Long: "Provides functionality for STACKIT Git instances.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand( + list.NewCmd(params), + describe.NewCmd(params), + create.NewCmd(params), + delete.NewCmd(params), + ) +} diff --git a/internal/cmd/git/list/list.go b/internal/cmd/git/instance/list/list.go similarity index 100% rename from internal/cmd/git/list/list.go rename to internal/cmd/git/instance/list/list.go diff --git a/internal/cmd/git/list/list_test.go b/internal/cmd/git/instance/list/list_test.go similarity index 100% rename from internal/cmd/git/list/list_test.go rename to internal/cmd/git/instance/list/list_test.go From 2f1d07ad5428b7e9ec60fc732b6aa9121f8f340c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Jul 2025 13:22:09 +0200 Subject: [PATCH 083/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex from 1.4.0 to 1.5.0 (#856) Co-authored-by: Ruben Hoenle --- go.mod | 2 +- go.sum | 4 ++-- internal/cmd/mongodbflex/instance/update/update.go | 2 +- .../cmd/mongodbflex/instance/update/update_test.go | 14 +++++++------- internal/pkg/services/mongodbflex/utils/utils.go | 2 +- .../pkg/services/mongodbflex/utils/utils_test.go | 8 ++++---- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 0bf1e4730..c180d7263 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 diff --git a/go.sum b/go.sum index 20839d0b9..6b33a98f0 100644 --- a/go.sum +++ b/go.sum @@ -581,8 +581,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCx github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0 h1:il4vBOejtX0//CWuY6CDpFfPpDIvin5V9QIaKvyXV/M= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.4.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.0 h1:0amQ/exKUwmxGNbEGyWJF7D6wBjo59WGsn6yCX6k3zo= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 h1:NuRgx13h3mnzWcRTLPiL5fk06xpl43vaz+QOuHvSEHA= diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index 92dafbb94..5c11a7ee6 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -201,7 +201,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu type MongoDBFlexClient interface { PartialUpdateInstance(ctx context.Context, projectId, instanceId, region string) mongodbflex.ApiPartialUpdateInstanceRequest - GetInstanceExecute(ctx context.Context, projectId, instanceId, region string) (*mongodbflex.GetInstanceResponse, error) + GetInstanceExecute(ctx context.Context, projectId, instanceId, region string) (*mongodbflex.InstanceResponse, error) ListFlavorsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListFlavorsResponse, error) ListStoragesExecute(ctx context.Context, projectId, flavorId, region string) (*mongodbflex.ListStoragesResponse, error) } diff --git a/internal/cmd/mongodbflex/instance/update/update_test.go b/internal/cmd/mongodbflex/instance/update/update_test.go index 1c0a92f2b..f9bb2dffa 100644 --- a/internal/cmd/mongodbflex/instance/update/update_test.go +++ b/internal/cmd/mongodbflex/instance/update/update_test.go @@ -31,14 +31,14 @@ type mongoDBFlexClientMocked struct { listStoragesFails bool listStoragesResp *mongodbflex.ListStoragesResponse getInstanceFails bool - getInstanceResp *mongodbflex.GetInstanceResponse + getInstanceResp *mongodbflex.InstanceResponse } func (c *mongoDBFlexClientMocked) PartialUpdateInstance(ctx context.Context, projectId, instanceId, region string) mongodbflex.ApiPartialUpdateInstanceRequest { return testClient.PartialUpdateInstance(ctx, projectId, instanceId, region) } -func (c *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _, _ string) (*mongodbflex.GetInstanceResponse, error) { +func (c *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _, _ string) (*mongodbflex.InstanceResponse, error) { if c.getInstanceFails { return nil, fmt.Errorf("get instance failed") } @@ -354,7 +354,7 @@ func TestBuildRequest(t *testing.T) { model *inputModel expectedRequest mongodbflex.ApiPartialUpdateInstanceRequest getInstanceFails bool - getInstanceResp *mongodbflex.GetInstanceResponse + getInstanceResp *mongodbflex.InstanceResponse listFlavorsFails bool listFlavorsResp *mongodbflex.ListFlavorsResponse listStoragesFails bool @@ -414,7 +414,7 @@ func TestBuildRequest(t *testing.T) { model.StorageClass = utils.Ptr("class") }), isValid: true, - getInstanceResp: &mongodbflex.GetInstanceResponse{ + getInstanceResp: &mongodbflex.InstanceResponse{ Item: &mongodbflex.Instance{ Flavor: &mongodbflex.Flavor{ Id: utils.Ptr(testFlavorId), @@ -442,7 +442,7 @@ func TestBuildRequest(t *testing.T) { model.StorageSize = utils.Ptr(int64(10)) }), isValid: true, - getInstanceResp: &mongodbflex.GetInstanceResponse{ + getInstanceResp: &mongodbflex.InstanceResponse{ Item: &mongodbflex.Instance{ Flavor: &mongodbflex.Flavor{ Id: utils.Ptr(testFlavorId), @@ -528,7 +528,7 @@ func TestBuildRequest(t *testing.T) { model.StorageClass = utils.Ptr("non-existing-class") }, ), - getInstanceResp: &mongodbflex.GetInstanceResponse{ + getInstanceResp: &mongodbflex.InstanceResponse{ Item: &mongodbflex.Instance{ Flavor: &mongodbflex.Flavor{ Id: utils.Ptr(testFlavorId), @@ -551,7 +551,7 @@ func TestBuildRequest(t *testing.T) { model.StorageSize = utils.Ptr(int64(9)) }, ), - getInstanceResp: &mongodbflex.GetInstanceResponse{ + getInstanceResp: &mongodbflex.InstanceResponse{ Item: &mongodbflex.Instance{ Flavor: &mongodbflex.Flavor{ Id: utils.Ptr(testFlavorId), diff --git a/internal/pkg/services/mongodbflex/utils/utils.go b/internal/pkg/services/mongodbflex/utils/utils.go index 52d9aa311..a5cbc7016 100644 --- a/internal/pkg/services/mongodbflex/utils/utils.go +++ b/internal/pkg/services/mongodbflex/utils/utils.go @@ -22,7 +22,7 @@ var instanceTypeToReplicas = map[string]int64{ type MongoDBFlexClient interface { ListVersionsExecute(ctx context.Context, projectId, region string) (*mongodbflex.ListVersionsResponse, error) - GetInstanceExecute(ctx context.Context, projectId, instanceId, region string) (*mongodbflex.GetInstanceResponse, error) + GetInstanceExecute(ctx context.Context, projectId, instanceId, region string) (*mongodbflex.InstanceResponse, error) GetUserExecute(ctx context.Context, projectId, instanceId, userId, region string) (*mongodbflex.GetUserResponse, error) ListRestoreJobsExecute(ctx context.Context, projectId string, instanceId, region string) (*mongodbflex.ListRestoreJobsResponse, error) } diff --git a/internal/pkg/services/mongodbflex/utils/utils_test.go b/internal/pkg/services/mongodbflex/utils/utils_test.go index 4867c5bb3..157bc2803 100644 --- a/internal/pkg/services/mongodbflex/utils/utils_test.go +++ b/internal/pkg/services/mongodbflex/utils/utils_test.go @@ -29,7 +29,7 @@ type mongoDBFlexClientMocked struct { listVersionsFails bool listVersionsResp *mongodbflex.ListVersionsResponse getInstanceFails bool - getInstanceResp *mongodbflex.GetInstanceResponse + getInstanceResp *mongodbflex.InstanceResponse getUserFails bool getUserResp *mongodbflex.GetUserResponse listRestoreJobsFails bool @@ -50,7 +50,7 @@ func (m *mongoDBFlexClientMocked) ListRestoreJobsExecute(_ context.Context, _, _ return m.listRestoreJobsResp, nil } -func (m *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _, _ string) (*mongodbflex.GetInstanceResponse, error) { +func (m *mongoDBFlexClientMocked) GetInstanceExecute(_ context.Context, _, _, _ string) (*mongodbflex.InstanceResponse, error) { if m.getInstanceFails { return nil, fmt.Errorf("could not get instance") } @@ -434,13 +434,13 @@ func TestGetInstanceName(t *testing.T) { tests := []struct { description string getInstanceFails bool - getInstanceResp *mongodbflex.GetInstanceResponse + getInstanceResp *mongodbflex.InstanceResponse isValid bool expectedOutput string }{ { description: "base", - getInstanceResp: &mongodbflex.GetInstanceResponse{ + getInstanceResp: &mongodbflex.InstanceResponse{ Item: &mongodbflex.Instance{ Name: utils.Ptr(testInstanceName), }, From f91849da5e0c2cbab722e1c80f4e687019d6a202 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 18 Jul 2025 14:01:31 +0200 Subject: [PATCH 084/422] chore(deps): update module golang.org/x/tools to v0.35.0 (#861) Co-authored-by: Renovate Bot --- go.mod | 6 ++++-- go.sum | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index c180d7263..673f2304e 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( ) require ( - golang.org/x/net v0.41.0 // indirect + golang.org/x/net v0.42.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -207,7 +207,9 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.16.0 // indirect - golang.org/x/tools v0.34.0 // indirect + golang.org/x/tools v0.35.0 // indirect + golang.org/x/tools/go/expect v0.1.1-deprecated // indirect + golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect honnef.co/go/tools v0.6.1 // indirect diff --git a/go.sum b/go.sum index 6b33a98f0..a8066afba 100644 --- a/go.sum +++ b/go.sum @@ -795,8 +795,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -962,8 +962,12 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= -golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= 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= From 5430a95dbec779596bdec6279302cc706421a6f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 21 Jul 2025 12:57:39 +0200 Subject: [PATCH 085/422] fix(ci): mark the workflow as successful on coverage report error (#874) relates to #802 --- .github/workflows/ci.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 14432ab71..50d71d17b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -58,14 +58,15 @@ jobs: name: "Code coverage report" if: github.event_name == 'pull_request' # Do not run when workflow is triggered by push to main branch runs-on: ubuntu-latest - continue-on-error: true # Add this line to prevent pipeline failures in forks needs: main permissions: contents: read actions: read # to download code coverage results from "main" job pull-requests: write # write permission needed to comment on PR steps: - - uses: fgrosse/go-coverage-report@v1.2.0 + - name: Check new code coverage + uses: fgrosse/go-coverage-report@v1.2.0 + continue-on-error: true # Add this line to prevent pipeline failures in forks with: coverage-artifact-name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} - coverage-file-name: ${{ env.CODE_COVERAGE_FILE_NAME }} \ No newline at end of file + coverage-file-name: ${{ env.CODE_COVERAGE_FILE_NAME }} From 231674af0d19d4da1ab38dc8506044b5db0a39ae Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 23 Jul 2025 07:52:11 +0200 Subject: [PATCH 086/422] chore(deps): update renovatebot/github-action action to v43.0.4 (#878) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 1e857a5f1..df77823ed 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.3 + uses: renovatebot/github-action@v43.0.4 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 193ebee981410f8c882b83cd7f92c6bb60496354 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:12:59 +0200 Subject: [PATCH 087/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#880) Bumps [github.com/stackitcloud/stackit-sdk-go/services/rabbitmq](https://github.com/stackitcloud/stackit-sdk-go) from 0.25.0 to 0.25.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v0.25.0...services/logme/v0.25.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/rabbitmq dependency-version: 0.25.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 673f2304e..2a0c0ea34 100644 --- a/go.mod +++ b/go.mod @@ -243,7 +243,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/go.sum b/go.sum index a8066afba..fdd65ebb1 100644 --- a/go.sum +++ b/go.sum @@ -591,8 +591,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 h1:+qFjzDDv/0 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 h1:DGgKKCh3AmUBqDG0DrsWVcclxSaG82TVEf18A29w+J0= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0/go.mod h1:I67K+QjPAIMrW/r/0GOdX2WSmA8J72LNzpe8rElfxFI= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0 h1:Xhgo0Di6NDjkg0Bf3f6LHlQ09u0Dj/3WdDb0xd47vEU= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.0/go.mod h1:YL0l9l9xzJy2BmV+U9XkcXlQaHbE2KyA37GpGvBXIJ4= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 h1:ALrDCBih8Fu8e6530KdOjuH0iMxOLntO381BbKFlTFY= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1/go.mod h1:+qGWSehoV0Js3FalgvT/bOgPj+UqW4I7lP5s8uAxP+o= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 h1:wdQoQ9RUkpX80twtG9xUghW9Xn1ka9zOjIxJDLbtwSo= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0/go.mod h1:PAQH8+1DDGc6uibvC3nDtfRLu8uxutIr25mPJvrCOy8= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 h1:lxI0LnHcTpnF8g0tHTCQ1UIVLlNHk1W1WAclp3Ut0fw= From 89a50f444a8a29daaf3720c683306287f3be07b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 07:21:14 +0000 Subject: [PATCH 088/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#881) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mongodbflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/mongodbflex/v1.5.0...services/mongodbflex/v1.5.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mongodbflex dependency-version: 1.5.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2a0c0ea34..329b582e1 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.0 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 diff --git a/go.sum b/go.sum index fdd65ebb1..8e6ae9293 100644 --- a/go.sum +++ b/go.sum @@ -581,8 +581,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCx github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.0 h1:0amQ/exKUwmxGNbEGyWJF7D6wBjo59WGsn6yCX6k3zo= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.0/go.mod h1:U1Zf/S9IuDvRJq1tRKFT/bsJd4qxYzwtukqX3TL++Mw= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 h1:XOpikSY2IXfBJPzUdgBk69iJXFC99xzfYtY1h4bZ5vM= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1/go.mod h1:G7S/hGa6EyX5Avxxw/PIdbdtbFeiXL/T1vUkPOJ120w= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 h1:NuRgx13h3mnzWcRTLPiL5fk06xpl43vaz+QOuHvSEHA= From a1859d68604fa353045bc734e4dd2dd82c230880 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 09:36:33 +0200 Subject: [PATCH 089/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/secretsmanager (#882) Bumps [github.com/stackitcloud/stackit-sdk-go/services/secretsmanager](https://github.com/stackitcloud/stackit-sdk-go) from 0.13.0 to 0.13.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.13.0...services/dns/v0.13.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/secretsmanager dependency-version: 0.13.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 329b582e1..eab7753b2 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 diff --git a/go.sum b/go.sum index 8e6ae9293..f38a81443 100644 --- a/go.sum +++ b/go.sum @@ -599,8 +599,8 @@ github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 h1:lxI0L github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0/go.mod h1:TBvZpbCju0Zmq8GoS4CEtUg2MqtdqWrGeEAOXwkJNQo= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 h1:ewFXnESJWsUen0T9sSt0lwL28fhqCVB1HSLdY0szrdA= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0 h1:CtCaG8nycfviq/QgNM7OoBWs/Ap9IQvOmvI0tZhYdPI= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.0/go.mod h1:/MiR18oug1V0sxPT4KO6a+LhgPARNBGvgVx3qv3zJ0A= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 h1:WKFzlHllql3JsVcAq+Y1m5pSMkvwp1qH3Vf2N7i8CPg= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1/go.mod h1:WGMFtGugBmUxI+nibI7eUZIQk4AGlDvwqX+m17W1y5w= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1 h1:pvAYt53jUSUf1yHQJ+mcjQ+sgrpUBBqfw1EznGnP5A4= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 h1:poL/Hz3a6OHZ/eKtwMGm5nLqC3fEJjzPQlN/7/+mk8Y= From 8ce470629df6e3066817aa7a5c44a40c335c6310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Otto=20Kr=C3=B6pke?= Date: Thu, 24 Jul 2025 17:24:34 +0200 Subject: [PATCH 090/422] feat(auth): support output format in stackit auth get-access-token command (#889) relates to #888 --- .../auth/get-access-token/get_access_token.go | 64 ++++++++++++++++++- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 25576427a..5e5b9d60b 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -1,14 +1,24 @@ package getaccesstoken import ( + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) +type inputModel struct { + *globalflags.GlobalFlagModel +} + func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "get-access-token", @@ -20,7 +30,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Print a short-lived access token`, "$ stackit auth get-access-token"), ), - RunE: func(_ *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, _ []string) error { + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + userSessionExpired, err := auth.UserSessionExpired() if err != nil { return err @@ -35,9 +50,52 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - params.Printer.Outputf("%s\n", accessToken) - return nil + switch model.OutputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(map[string]string{ + "access_token": accessToken, + }, "", " ") + if err != nil { + return fmt.Errorf("marshal image list: %w", err) + } + params.Printer.Outputln(string(details)) + + return nil + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(map[string]string{ + "access_token": accessToken, + }, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal image list: %w", err) + } + params.Printer.Outputln(string(details)) + + return nil + default: + params.Printer.Outputln(accessToken) + + return nil + } }, } return cmd } + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} From 50bcf38753d29cd25a91232a8d83f4d19b01bd85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:30:36 +0000 Subject: [PATCH 091/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/objectstorage (#887) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/objectstorage dependency-version: 1.3.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eab7753b2..b1eda20bf 100644 --- a/go.mod +++ b/go.mod @@ -241,7 +241,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 diff --git a/go.sum b/go.sum index f38a81443..40bd86e00 100644 --- a/go.sum +++ b/go.sum @@ -583,8 +583,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMk github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 h1:XOpikSY2IXfBJPzUdgBk69iJXFC99xzfYtY1h4bZ5vM= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1/go.mod h1:G7S/hGa6EyX5Avxxw/PIdbdtbFeiXL/T1vUkPOJ120w= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0 h1:bK5FDpSGfUKDXNkqOoiqOU9hua2YfcdYsGS4zQQ9wg0= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.0/go.mod h1:Q2SJXlZTksvNAb1QnpGNfDSw/OMPN9uopaKuptUGhO8= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 h1:NuRgx13h3mnzWcRTLPiL5fk06xpl43vaz+QOuHvSEHA= github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 h1:+qFjzDDv/0ZHGdVuW2HzAphRBmlc1+abw7k1RaAqmQo= From 159e902452481ac6b5557ee547aebbdad325046a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 08:11:44 +0200 Subject: [PATCH 092/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverbackup (#885) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serverbackup dependency-version: 1.3.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b1eda20bf..dd0750abb 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 diff --git a/go.sum b/go.sum index 40bd86e00..4756c3a45 100644 --- a/go.sum +++ b/go.sum @@ -601,8 +601,8 @@ github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 h1:ewFXnESJWsU github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 h1:WKFzlHllql3JsVcAq+Y1m5pSMkvwp1qH3Vf2N7i8CPg= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1/go.mod h1:WGMFtGugBmUxI+nibI7eUZIQk4AGlDvwqX+m17W1y5w= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1 h1:pvAYt53jUSUf1yHQJ+mcjQ+sgrpUBBqfw1EznGnP5A4= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.1/go.mod h1:S/zLsdZvtPXDSYyl7h2GLHhsnVf6AzB96PdslPWevJI= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 h1:tfKC4Z6Uah9AQZrtCn/ytqOgc//ChQRfJ6ozxovgads= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2/go.mod h1:wV7/BUV3BCLq5+E1bHXrKKt/eOPVdWgLArWLAq7rZ/U= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 h1:poL/Hz3a6OHZ/eKtwMGm5nLqC3fEJjzPQlN/7/+mk8Y= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0/go.mod h1:ssbyAHtxyuBvheMEItydM78/JxjDl3naUtllrC7ghDs= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 h1:2d28WFQB9QB3af4uoPFglQDhH1LepEe6F2YoFCBecVI= From 6b1f8971018b9c5b32e032bb707d13276bab3f9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Jul 2025 06:19:33 +0000 Subject: [PATCH 093/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#886) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/iaas dependency-version: 0.27.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dd0750abb..7d3cb5f0c 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 diff --git a/go.sum b/go.sum index 4756c3a45..0bae15924 100644 --- a/go.sum +++ b/go.sum @@ -573,8 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 h1:x5mx/C2bdtpOH974R github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 h1:UJDtK96cjQqp5yWb8TxXLG42SOGcnBSgfYO7P3pk/j0= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0 h1:5vxOzwQ+rNm0g9ZLQW/31dqdDqGfw/FQbrjxUUAHtiA= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.0/go.mod h1:lUGkcbyMkd4nRBDFmKohIwlgtOZqQo4Ek5S5ajw90Xg= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1 h1:0RP8DCwSCbl0KBsRI6INFy/8JW7UqlAd2Yr3dWFS3No= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1/go.mod h1:TvqL/TgVrrdDF387gAhO8QQYLxiaOZwgpmyv6s15TU0= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0 h1:KgptlhV0LgOevtrfMBd2pm/Hrnz6vNSYgAJo6pT7eMM= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCxpFXN2K7g2ih0gQM6cyZ1VhTmtQfI= From c43de4ca2d7b42d0de6f965c13072c4c7faa06b2 Mon Sep 17 00:00:00 2001 From: Piet van der Meulen Date: Fri, 25 Jul 2025 12:11:01 +0200 Subject: [PATCH 094/422] feat(mongodb-flex): add readWriteAnyDatabase role (#884) --- docs/stackit_mongodbflex_user_create.md | 2 +- docs/stackit_mongodbflex_user_update.md | 2 +- internal/cmd/mongodbflex/user/create/create.go | 2 +- internal/cmd/mongodbflex/user/update/update.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/stackit_mongodbflex_user_create.md b/docs/stackit_mongodbflex_user_create.md index 8c42b3bb2..99075fee8 100644 --- a/docs/stackit_mongodbflex_user_create.md +++ b/docs/stackit_mongodbflex_user_create.md @@ -29,7 +29,7 @@ stackit mongodbflex user create [flags] --database string The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it -h, --help Help for "stackit mongodbflex user create" --instance-id string ID of the instance - --role strings Roles of the user, possible values are ["read" "readWrite"] (default [read]) + --role strings Roles of the user, possible values are ["read" "readWrite" "readWriteAnyDatabase"] (default [read]) --username string Username of the user. If not specified, a random username will be assigned ``` diff --git a/docs/stackit_mongodbflex_user_update.md b/docs/stackit_mongodbflex_user_update.md index bcbdfa54f..31a674972 100644 --- a/docs/stackit_mongodbflex_user_update.md +++ b/docs/stackit_mongodbflex_user_update.md @@ -23,7 +23,7 @@ stackit mongodbflex user update USER_ID [flags] --database string The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it -h, --help Help for "stackit mongodbflex user update" --instance-id string ID of the instance - --role strings Roles of the user, possible values are ["read" "readWrite"] (default []) + --role strings Roles of the user, possible values are ["read" "readWrite" "readWriteAnyDatabase"] (default []) ``` ### Options inherited from parent commands diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index 924f91896..2ddf76d34 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -103,7 +103,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { - roleOptions := []string{"read", "readWrite"} + roleOptions := []string{"read", "readWrite", "readWriteAnyDatabase"} cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the instance") cmd.Flags().String(usernameFlag, "", "Username of the user. If not specified, a random username will be assigned") diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index 4742a8e82..5f192f377 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -97,7 +97,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { - roleOptions := []string{"read", "readWrite"} + roleOptions := []string{"read", "readWrite", "readWriteAnyDatabase"} cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the instance") cmd.Flags().String(databaseFlag, "", "The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it") From c31dd87eb817c39ace5a6e81f93726d1254b15d0 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Fri, 25 Jul 2025 13:27:07 +0200 Subject: [PATCH 095/422] docs: Add guide to install the STACKIT CLI as homebrew cask (#879) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Docs: Add guide to uninstall the deprecated formula and reinstall it as cask Co-authored-by: Ruben Hönle --- INSTALLATION.md | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/INSTALLATION.md b/INSTALLATION.md index 35bdd5149..965ceddf9 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -17,7 +17,47 @@ brew tap stackitcloud/tap 2. You can then install the CLI via: ```shell -brew install stackit +brew install --cask stackit +``` + +#### Formula deprecated + +The homebrew formula is deprecated, will no longer be updated and will be removed after 2026-01-22. +You need to install the STACKIT CLI as cask. +Therefor you need to uninstall the formula and reinstall it as cask. + +Your profiles should normally remain. To ensure that nothing will be gone, you should backup them. + +1. Export your existing profiles. This will create a json file in your current directory. +```shell +stackit config profile export default +``` + +2. If you have multiple profiles, then execute the export command for each of them. You can find your profiles via: + +```shell +stackit config profile list +stackit config profile export +``` + +3. Uninstall the formula. +```shell +brew uninstall stackit +``` + +4. Install the STACKIT CLI as cask. +```shell +brew install --cask stackit +``` + +5. Check if your configs are still stored. +```shell +stackit config profile list +``` + +6. In case the profiles are gone, import your profiles via: +```shell +$ stackit config profile import -c @default.json --name myProfile ``` ### Linux From d4663b2fc848068a7d687c964c3cc321ddf01cec Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 28 Jul 2025 08:37:19 +0200 Subject: [PATCH 096/422] fix(deps): update stackit sdk modules (#883) Co-authored-by: Renovate Bot --- go.mod | 38 ++++++++++++++--------------- go.sum | 76 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/go.mod b/go.mod index 7d3cb5f0c..bba753a65 100644 --- a/go.mod +++ b/go.mod @@ -15,24 +15,24 @@ require ( github.com/spf13/cobra v1.9.1 github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 - github.com/stackitcloud/stackit-sdk-go/core v0.17.2 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.0 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 + github.com/stackitcloud/stackit-sdk-go/core v0.17.3 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 + github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.1.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.26.0 golang.org/x/oauth2 v0.30.0 @@ -238,13 +238,13 @@ require ( github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.34.0 // indirect diff --git a/go.sum b/go.sum index 0bae15924..82df7eb29 100644 --- a/go.sum +++ b/go.sum @@ -563,56 +563,56 @@ github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.17.2 h1:jPyn+i8rkp2hM80+hOg0B/1EVRbMt778Tr5RWyK1m2E= -github.com/stackitcloud/stackit-sdk-go/core v0.17.2/go.mod h1:8KIw3czdNJ9sdil9QQimxjR6vHjeINFrRv0iZ67wfn0= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.0 h1:eYP2TSEEZassdyA3V9Ci5jGMvK/WH1/gzTAUfvlpRyk= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.0/go.mod h1:RBLBx00zF9MoA/mcLoWwYaACFE0xrWp/EHlzo5S7nhA= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0 h1:KXMiTBV4KcOEQRFddtOUFspL+KRvjDQNDIs73bdiey0= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.0/go.mod h1:+2mx2MclJFMQ4Y6b20jspYAnIeFJP3/yvO6Gfvcvf6Q= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0 h1:x5mx/C2bdtpOH974RofXD0Y8YOyJtYXwIyaCyWOXMwU= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.0/go.mod h1:xhAdw016dY/hVsLerlExSMocqCc872+S0y1CdV3jAjU= -github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0 h1:UJDtK96cjQqp5yWb8TxXLG42SOGcnBSgfYO7P3pk/j0= -github.com/stackitcloud/stackit-sdk-go/services/git v0.7.0/go.mod h1:agI7SONeLR/IZL3TOgn1tDzfS63O2rWKQE8+huRjEzU= +github.com/stackitcloud/stackit-sdk-go/core v0.17.3 h1:GsZGmRRc/3GJLmCUnsZswirr5wfLRrwavbnL/renOqg= +github.com/stackitcloud/stackit-sdk-go/core v0.17.3/go.mod h1:HBCXJGPgdRulplDzhrmwC+Dak9B/x0nzNtmOpu+1Ahg= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 h1:wJC/7mkIppHTBU0awGdLEFcmnjasp43MM9gX6/gdWvA= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1/go.mod h1:UyN4hlkdiK5beDi5j9xHMENxRE9A9dlIWSXO/unhQW8= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 h1:Kzr1G4g9PHI8ePFnHrHZEX06XtEJQYBK9JExje0aXl0= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1/go.mod h1:OwQ+fYpON4WQpEinvI9lCTuuwj9UBCnPPJcnDpK803U= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= +github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 h1:hkFixFnBcQzU4BSIZFITc8N0gK0pUYk7mk0wdUu5Ki8= +github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1/go.mod h1:Ng1EzrRndG3iGXGH90AZJz//wfK+2YOyDwTnTLwX3a4= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1 h1:0RP8DCwSCbl0KBsRI6INFy/8JW7UqlAd2Yr3dWFS3No= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1/go.mod h1:TvqL/TgVrrdDF387gAhO8QQYLxiaOZwgpmyv6s15TU0= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0 h1:KgptlhV0LgOevtrfMBd2pm/Hrnz6vNSYgAJo6pT7eMM= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.0/go.mod h1:FiVhDlw9+yuTiUmnyGLn2qpsLW26w9OC4TS1y78czvg= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0 h1:QKOfaB7EcuJmBCxpFXN2K7g2ih0gQM6cyZ1VhTmtQfI= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.0/go.mod h1:XjDMHhAQogFXsVR+o138CPYG1FOe0/Nl2Vm+fAgzx2A= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0 h1:vxk6ztgzUIPMkfv27NRpniFqCyGGGFsWJQUvFs43bQA= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.0/go.mod h1:Pb8IEV5/jP8k75dVcN5cn3kP7PHTy/4KXXKpG76oj4U= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 h1:OdJEs8eOfrzn9tCBDLxIyP8hX50zPfcXNYnRoQX+chs= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1/go.mod h1:11uzaOPCF9SeDHXEGOPMlHDD3J5r2TnvCGUwW9Igq9c= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1/go.mod h1:ivt8lvnAoBZsde2jSAuicyn6RgTmHvvNAJ3whaUbAD4= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIeh5XB2Ews2B9Lj5DJlMWIEJh60FfZ4Y= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 h1:XOpikSY2IXfBJPzUdgBk69iJXFC99xzfYtY1h4bZ5vM= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1/go.mod h1:G7S/hGa6EyX5Avxxw/PIdbdtbFeiXL/T1vUkPOJ120w= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0 h1:NuRgx13h3mnzWcRTLPiL5fk06xpl43vaz+QOuHvSEHA= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.0/go.mod h1:+eNo7SEeVRuW7hgujSabSketScSUKGuC88UznPS+UTE= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0 h1:+qFjzDDv/0ZHGdVuW2HzAphRBmlc1+abw7k1RaAqmQo= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.0/go.mod h1:ifKKKCWL1U435fXGQ375SPX+burtfg1I7EGZ58COzRA= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0 h1:DGgKKCh3AmUBqDG0DrsWVcclxSaG82TVEf18A29w+J0= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.0/go.mod h1:I67K+QjPAIMrW/r/0GOdX2WSmA8J72LNzpe8rElfxFI= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.1 h1:eSiUKN61FJ4x42vgIvhVU7bgmrPbj05xR4y0nnRV5Yg= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.1/go.mod h1:oJku0heeBwsy4IToqhvSdPJI++GUNkBSESxOjiLWRVQ= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1/go.mod h1:hyhw+I19NtjKmRLcUkY4boaTxnYSPFGbpn4RxvGqH2s= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 h1:ALrDCBih8Fu8e6530KdOjuH0iMxOLntO381BbKFlTFY= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1/go.mod h1:+qGWSehoV0Js3FalgvT/bOgPj+UqW4I7lP5s8uAxP+o= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0 h1:wdQoQ9RUkpX80twtG9xUghW9Xn1ka9zOjIxJDLbtwSo= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.0/go.mod h1:PAQH8+1DDGc6uibvC3nDtfRLu8uxutIr25mPJvrCOy8= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0 h1:lxI0LnHcTpnF8g0tHTCQ1UIVLlNHk1W1WAclp3Ut0fw= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.0/go.mod h1:TBvZpbCju0Zmq8GoS4CEtUg2MqtdqWrGeEAOXwkJNQo= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0 h1:ewFXnESJWsUen0T9sSt0lwL28fhqCVB1HSLdY0szrdA= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.0/go.mod h1:m9f9XZDeKpmqE/G0Sj5Rpdsiw+qcUo0Rcm3idAbyp1c= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 h1:8uPt82Ez34OYMOijjEYxB1zUW6kiybkt6veQKl0AL68= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1/go.mod h1:1Y2GEICmZDt+kr8aGnBx/sjYVAIYHmtfC8xYi9oxNEE= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1 h1:r7oaINTwLmIG31AaqKTuQHHFF8YNuYGzi+46DOuSjw4= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1/go.mod h1:ipcrPRbwfQXHH18dJVfY7K5ujHF5dTT6isoXgmA7YwQ= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oPt08I2WLsxJDoVDsPMW2VkvKW7/SlUv10= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1/go.mod h1:tip0Ob6x06luy3CmRrmnCMtU5cha95fQLdvZlno3J4w= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 h1:WKFzlHllql3JsVcAq+Y1m5pSMkvwp1qH3Vf2N7i8CPg= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1/go.mod h1:WGMFtGugBmUxI+nibI7eUZIQk4AGlDvwqX+m17W1y5w= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 h1:tfKC4Z6Uah9AQZrtCn/ytqOgc//ChQRfJ6ozxovgads= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2/go.mod h1:wV7/BUV3BCLq5+E1bHXrKKt/eOPVdWgLArWLAq7rZ/U= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0 h1:poL/Hz3a6OHZ/eKtwMGm5nLqC3fEJjzPQlN/7/+mk8Y= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.0/go.mod h1:ssbyAHtxyuBvheMEItydM78/JxjDl3naUtllrC7ghDs= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0 h1:2d28WFQB9QB3af4uoPFglQDhH1LepEe6F2YoFCBecVI= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.0/go.mod h1:t77MA8uyEU9KZd1On5JpnxI3xhVPKIS8WutStqvU8Cw= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1 h1:h1TsWatlsexLeKdkb3L8chcxaXJOy/cLXctsRxhb4xg= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.1/go.mod h1:M4xZ2BnmROvLV2MrAP6A8o9BnyT0CkvpEcP8lBOfRs8= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.1.0 h1:Qj2Ild7NmHVm1rvPZg9Utc862sLJFiAfvRFLG0Qc+Uc= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.1.0/go.mod h1:V09NmPahuUiuZEogVPgxuVqqti0th5B7TVAjuiM09mE= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0 h1:pUl/981oAXPnZd7++69NfEWv6JwW9UpxER16XxQUdOk= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.0/go.mod h1:S04/QsQrB2EgYGjl62BO+9QUswrlRBoBosigrhdmccM= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 h1:hcHX2n5pUsOcv2PPPbSJph1fQ/I6P7g7781T1f1ycEI= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1/go.mod h1:jZwTg3wU4/UxgNJ7TKlFZ3dTIlnfvppnW8kJTc4UXy8= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1 h1:6kEct2wo84DlHkKJTNcUQbKAwARh/ugOTDR3x5mYCWc= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1/go.mod h1:dScCMWYbsf3B+c6a/5CFoVFcYLqHHkEEc622cHFtGGY= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.2.0 h1:rNlTSWShnlkW4vbBuJ3a1NPwQfN5H1+mpdjngLqFRdo= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.2.0/go.mod h1:UPPntEOhriZ4dZXEkjtfkGLFKvfA7Q/JAPG/zfwcoyc= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 h1:r5808lRhtY8l5anft/UwgJEaef1XsoYObmwd3FVai48= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1/go.mod h1:+LYy2pB+tpF0lkkmCf524wvv2Sa49REgEaNh7JGzN6Y= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From e97da4d92b704146fae207302b730ca88ea78428 Mon Sep 17 00:00:00 2001 From: Mauritz Uphoff <39736813+h3adex@users.noreply.github.com> Date: Tue, 29 Jul 2025 11:56:48 +0200 Subject: [PATCH 097/422] feat(ske): add commands to trigger hibernate, wakeup maintenance, and reconcile (#873) relates to STACKITCLI-53 --------- Co-authored-by: Ruben Hoenle --- docs/stackit_ske_cluster.md | 10 +- docs/stackit_ske_cluster_create.md | 8 +- docs/stackit_ske_cluster_delete.md | 2 +- docs/stackit_ske_cluster_describe.md | 8 +- docs/stackit_ske_cluster_hibernate.md | 40 ++++ docs/stackit_ske_cluster_maintenance.md | 40 ++++ docs/stackit_ske_cluster_reconcile.md | 40 ++++ docs/stackit_ske_cluster_update.md | 6 +- docs/stackit_ske_cluster_wakeup.md | 40 ++++ docs/stackit_ske_kubeconfig.md | 2 +- docs/stackit_ske_kubeconfig_create.md | 4 +- go.mod | 2 +- go.sum | 4 +- internal/cmd/ske/cluster/cluster.go | 8 + internal/cmd/ske/cluster/create/create.go | 8 +- internal/cmd/ske/cluster/delete/delete.go | 2 +- internal/cmd/ske/cluster/describe/describe.go | 8 +- .../cmd/ske/cluster/hibernate/hibernate.go | 124 ++++++++++++ .../ske/cluster/hibernate/hibernate_test.go | 186 +++++++++++++++++ .../ske/cluster/maintenance/maintenance.go | 124 ++++++++++++ .../cluster/maintenance/maintenance_test.go | 187 ++++++++++++++++++ .../cmd/ske/cluster/reconcile/reconcile.go | 110 +++++++++++ .../ske/cluster/reconcile/reconcile_test.go | 187 ++++++++++++++++++ internal/cmd/ske/cluster/update/update.go | 6 +- internal/cmd/ske/cluster/wakeup/wakeup.go | 110 +++++++++++ .../cmd/ske/cluster/wakeup/wakeup_test.go | 185 +++++++++++++++++ internal/cmd/ske/kubeconfig/create/create.go | 4 +- internal/cmd/ske/ske.go | 6 +- 28 files changed, 1423 insertions(+), 38 deletions(-) create mode 100644 docs/stackit_ske_cluster_hibernate.md create mode 100644 docs/stackit_ske_cluster_maintenance.md create mode 100644 docs/stackit_ske_cluster_reconcile.md create mode 100644 docs/stackit_ske_cluster_wakeup.md create mode 100644 internal/cmd/ske/cluster/hibernate/hibernate.go create mode 100644 internal/cmd/ske/cluster/hibernate/hibernate_test.go create mode 100644 internal/cmd/ske/cluster/maintenance/maintenance.go create mode 100644 internal/cmd/ske/cluster/maintenance/maintenance_test.go create mode 100644 internal/cmd/ske/cluster/reconcile/reconcile.go create mode 100644 internal/cmd/ske/cluster/reconcile/reconcile_test.go create mode 100644 internal/cmd/ske/cluster/wakeup/wakeup.go create mode 100644 internal/cmd/ske/cluster/wakeup/wakeup_test.go diff --git a/docs/stackit_ske_cluster.md b/docs/stackit_ske_cluster.md index 7df9ba39e..a575e5495 100644 --- a/docs/stackit_ske_cluster.md +++ b/docs/stackit_ske_cluster.md @@ -30,10 +30,14 @@ stackit ske cluster [flags] ### SEE ALSO * [stackit ske](./stackit_ske.md) - Provides functionality for SKE -* [stackit ske cluster create](./stackit_ske_cluster_create.md) - Creates an SKE cluster +* [stackit ske cluster create](./stackit_ske_cluster_create.md) - Creates a SKE cluster * [stackit ske cluster delete](./stackit_ske_cluster_delete.md) - Deletes a SKE cluster -* [stackit ske cluster describe](./stackit_ske_cluster_describe.md) - Shows details of a SKE cluster +* [stackit ske cluster describe](./stackit_ske_cluster_describe.md) - Shows details of a SKE cluster * [stackit ske cluster generate-payload](./stackit_ske_cluster_generate-payload.md) - Generates a payload to create/update SKE clusters +* [stackit ske cluster hibernate](./stackit_ske_cluster_hibernate.md) - Trigger hibernate for a SKE cluster * [stackit ske cluster list](./stackit_ske_cluster_list.md) - Lists all SKE clusters -* [stackit ske cluster update](./stackit_ske_cluster_update.md) - Updates an SKE cluster +* [stackit ske cluster maintenance](./stackit_ske_cluster_maintenance.md) - Trigger maintenance for a SKE cluster +* [stackit ske cluster reconcile](./stackit_ske_cluster_reconcile.md) - Trigger reconcile for a SKE cluster +* [stackit ske cluster update](./stackit_ske_cluster_update.md) - Updates a SKE cluster +* [stackit ske cluster wakeup](./stackit_ske_cluster_wakeup.md) - Trigger wakeup from hibernation for a SKE cluster diff --git a/docs/stackit_ske_cluster_create.md b/docs/stackit_ske_cluster_create.md index fa4e0b492..3c94a7bdd 100644 --- a/docs/stackit_ske_cluster_create.md +++ b/docs/stackit_ske_cluster_create.md @@ -1,6 +1,6 @@ ## stackit ske cluster create -Creates an SKE cluster +Creates a SKE cluster ### Synopsis @@ -15,13 +15,13 @@ stackit ske cluster create CLUSTER_NAME [flags] ### Examples ``` - Create an SKE cluster using default configuration + Create a SKE cluster using default configuration $ stackit ske cluster create my-cluster - Create an SKE cluster using an API payload sourced from the file "./payload.json" + Create a SKE cluster using an API payload sourced from the file "./payload.json" $ stackit ske cluster create my-cluster --payload @./payload.json - Create an SKE cluster using an API payload provided as a JSON string + Create a SKE cluster using an API payload provided as a JSON string $ stackit ske cluster create my-cluster --payload "{...}" Generate a payload with default values, and adapt it with custom values for the different configuration options diff --git a/docs/stackit_ske_cluster_delete.md b/docs/stackit_ske_cluster_delete.md index ad2915d87..c1c0407a7 100644 --- a/docs/stackit_ske_cluster_delete.md +++ b/docs/stackit_ske_cluster_delete.md @@ -13,7 +13,7 @@ stackit ske cluster delete CLUSTER_NAME [flags] ### Examples ``` - Delete an SKE cluster with name "my-cluster" + Delete a SKE cluster with name "my-cluster" $ stackit ske cluster delete my-cluster ``` diff --git a/docs/stackit_ske_cluster_describe.md b/docs/stackit_ske_cluster_describe.md index eb30860a9..91b3949fc 100644 --- a/docs/stackit_ske_cluster_describe.md +++ b/docs/stackit_ske_cluster_describe.md @@ -1,10 +1,10 @@ ## stackit ske cluster describe -Shows details of a SKE cluster +Shows details of a SKE cluster ### Synopsis -Shows details of a STACKIT Kubernetes Engine (SKE) cluster. +Shows details of a STACKIT Kubernetes Engine (SKE) cluster. ``` stackit ske cluster describe CLUSTER_NAME [flags] @@ -13,10 +13,10 @@ stackit ske cluster describe CLUSTER_NAME [flags] ### Examples ``` - Get details of an SKE cluster with name "my-cluster" + Get details of a SKE cluster with name "my-cluster" $ stackit ske cluster describe my-cluster - Get details of an SKE cluster with name "my-cluster" in JSON format + Get details of a SKE cluster with name "my-cluster" in JSON format $ stackit ske cluster describe my-cluster --output-format json ``` diff --git a/docs/stackit_ske_cluster_hibernate.md b/docs/stackit_ske_cluster_hibernate.md new file mode 100644 index 000000000..20baddd1b --- /dev/null +++ b/docs/stackit_ske_cluster_hibernate.md @@ -0,0 +1,40 @@ +## stackit ske cluster hibernate + +Trigger hibernate for a SKE cluster + +### Synopsis + +Trigger hibernate for a STACKIT Kubernetes Engine (SKE) cluster. + +``` +stackit ske cluster hibernate CLUSTER_NAME [flags] +``` + +### Examples + +``` + Trigger hibernate for a SKE cluster with name "my-cluster" + $ stackit ske cluster hibernate my-cluster +``` + +### Options + +``` + -h, --help Help for "stackit ske cluster hibernate" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske cluster](./stackit_ske_cluster.md) - Provides functionality for SKE cluster + diff --git a/docs/stackit_ske_cluster_maintenance.md b/docs/stackit_ske_cluster_maintenance.md new file mode 100644 index 000000000..0a6c6540c --- /dev/null +++ b/docs/stackit_ske_cluster_maintenance.md @@ -0,0 +1,40 @@ +## stackit ske cluster maintenance + +Trigger maintenance for a SKE cluster + +### Synopsis + +Trigger maintenance for a STACKIT Kubernetes Engine (SKE) cluster. + +``` +stackit ske cluster maintenance CLUSTER_NAME [flags] +``` + +### Examples + +``` + Trigger maintenance for a SKE cluster with name "my-cluster" + $ stackit ske cluster maintenance my-cluster +``` + +### Options + +``` + -h, --help Help for "stackit ske cluster maintenance" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske cluster](./stackit_ske_cluster.md) - Provides functionality for SKE cluster + diff --git a/docs/stackit_ske_cluster_reconcile.md b/docs/stackit_ske_cluster_reconcile.md new file mode 100644 index 000000000..64887316d --- /dev/null +++ b/docs/stackit_ske_cluster_reconcile.md @@ -0,0 +1,40 @@ +## stackit ske cluster reconcile + +Trigger reconcile for a SKE cluster + +### Synopsis + +Trigger reconcile for a STACKIT Kubernetes Engine (SKE) cluster. + +``` +stackit ske cluster reconcile CLUSTER_NAME [flags] +``` + +### Examples + +``` + Trigger reconcile for a SKE cluster with name "my-cluster" + $ stackit ske cluster reconcile my-cluster +``` + +### Options + +``` + -h, --help Help for "stackit ske cluster reconcile" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske cluster](./stackit_ske_cluster.md) - Provides functionality for SKE cluster + diff --git a/docs/stackit_ske_cluster_update.md b/docs/stackit_ske_cluster_update.md index 5209cc5df..24fa95748 100644 --- a/docs/stackit_ske_cluster_update.md +++ b/docs/stackit_ske_cluster_update.md @@ -1,6 +1,6 @@ ## stackit ske cluster update -Updates an SKE cluster +Updates a SKE cluster ### Synopsis @@ -15,10 +15,10 @@ stackit ske cluster update CLUSTER_NAME [flags] ### Examples ``` - Update an SKE cluster using an API payload sourced from the file "./payload.json" + Update a SKE cluster using an API payload sourced from the file "./payload.json" $ stackit ske cluster update my-cluster --payload @./payload.json - Update an SKE cluster using an API payload provided as a JSON string + Update a SKE cluster using an API payload provided as a JSON string $ stackit ske cluster update my-cluster --payload "{...}" Generate a payload with the current values of a cluster, and adapt it with custom values for the different configuration options diff --git a/docs/stackit_ske_cluster_wakeup.md b/docs/stackit_ske_cluster_wakeup.md new file mode 100644 index 000000000..7b07e9965 --- /dev/null +++ b/docs/stackit_ske_cluster_wakeup.md @@ -0,0 +1,40 @@ +## stackit ske cluster wakeup + +Trigger wakeup from hibernation for a SKE cluster + +### Synopsis + +Trigger wakeup from hibernation for a STACKIT Kubernetes Engine (SKE) cluster. + +``` +stackit ske cluster wakeup CLUSTER_NAME [flags] +``` + +### Examples + +``` + Trigger wakeup from hibernation for a SKE cluster with name "my-cluster" + $ stackit ske cluster wakeup my-cluster +``` + +### Options + +``` + -h, --help Help for "stackit ske cluster wakeup" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske cluster](./stackit_ske_cluster.md) - Provides functionality for SKE cluster + diff --git a/docs/stackit_ske_kubeconfig.md b/docs/stackit_ske_kubeconfig.md index 5c7d3adf0..83634e149 100644 --- a/docs/stackit_ske_kubeconfig.md +++ b/docs/stackit_ske_kubeconfig.md @@ -30,6 +30,6 @@ stackit ske kubeconfig [flags] ### SEE ALSO * [stackit ske](./stackit_ske.md) - Provides functionality for SKE -* [stackit ske kubeconfig create](./stackit_ske_kubeconfig_create.md) - Creates or update a kubeconfig for an SKE cluster +* [stackit ske kubeconfig create](./stackit_ske_kubeconfig_create.md) - Creates or update a kubeconfig for a SKE cluster * [stackit ske kubeconfig login](./stackit_ske_kubeconfig_login.md) - Login plugin for kubernetes clients diff --git a/docs/stackit_ske_kubeconfig_create.md b/docs/stackit_ske_kubeconfig_create.md index d3d0e5622..c0f95423b 100644 --- a/docs/stackit_ske_kubeconfig_create.md +++ b/docs/stackit_ske_kubeconfig_create.md @@ -1,10 +1,10 @@ ## stackit ske kubeconfig create -Creates or update a kubeconfig for an SKE cluster +Creates or update a kubeconfig for a SKE cluster ### Synopsis -Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exits in the kubeconfig file the information will be updated. +Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exists in the kubeconfig file the information will be updated. By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created. You can override this behavior by specifying a custom filepath with the --filepath flag. diff --git a/go.mod b/go.mod index bba753a65..41c43fc2f 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.26.0 diff --git a/go.sum b/go.sum index 82df7eb29..c344eaabc 100644 --- a/go.sum +++ b/go.sum @@ -609,8 +609,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1 h1:6kEct2w github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1/go.mod h1:dScCMWYbsf3B+c6a/5CFoVFcYLqHHkEEc622cHFtGGY= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.2.0 h1:rNlTSWShnlkW4vbBuJ3a1NPwQfN5H1+mpdjngLqFRdo= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.2.0/go.mod h1:UPPntEOhriZ4dZXEkjtfkGLFKvfA7Q/JAPG/zfwcoyc= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 h1:hPCpRcWEzwzGONZJsKH+j2TjN1LRTH7Tp/q0TyzmL5M= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0/go.mod h1:jDYRbagjOwKEVsvkxdUErXIvvTOLw9WdBVjaXr5YOD8= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 h1:r5808lRhtY8l5anft/UwgJEaef1XsoYObmwd3FVai48= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1/go.mod h1:+LYy2pB+tpF0lkkmCf524wvv2Sa49REgEaNh7JGzN6Y= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= diff --git a/internal/cmd/ske/cluster/cluster.go b/internal/cmd/ske/cluster/cluster.go index 0158b7173..87994c2fa 100644 --- a/internal/cmd/ske/cluster/cluster.go +++ b/internal/cmd/ske/cluster/cluster.go @@ -6,8 +6,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/describe" generatepayload "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/generate-payload" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/hibernate" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/maintenance" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/reconcile" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/wakeup" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -33,4 +37,8 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(hibernate.NewCmd(params)) + cmd.AddCommand(maintenance.NewCmd(params)) + cmd.AddCommand(reconcile.NewCmd(params)) + cmd.AddCommand(wakeup.NewCmd(params)) } diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 557fb9a3a..af9ba2336 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -40,7 +40,7 @@ type inputModel struct { func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", clusterNameArg), - Short: "Creates an SKE cluster", + Short: "Creates a SKE cluster", Long: fmt.Sprintf("%s\n%s\n%s", "Creates a STACKIT Kubernetes Engine (SKE) cluster.", "The payload can be provided as a JSON string or a file path prefixed with \"@\".", @@ -49,13 +49,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( examples.NewExample( - `Create an SKE cluster using default configuration`, + `Create a SKE cluster using default configuration`, "$ stackit ske cluster create my-cluster"), examples.NewExample( - `Create an SKE cluster using an API payload sourced from the file "./payload.json"`, + `Create a SKE cluster using an API payload sourced from the file "./payload.json"`, "$ stackit ske cluster create my-cluster --payload @./payload.json"), examples.NewExample( - `Create an SKE cluster using an API payload provided as a JSON string`, + `Create a SKE cluster using an API payload provided as a JSON string`, `$ stackit ske cluster create my-cluster --payload "{...}"`), examples.NewExample( `Generate a payload with default values, and adapt it with custom values for the different configuration options`, diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index b10871bfe..12068d9e3 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -35,7 +35,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( examples.NewExample( - `Delete an SKE cluster with name "my-cluster"`, + `Delete a SKE cluster with name "my-cluster"`, "$ stackit ske cluster delete my-cluster"), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 40bf4897f..04d33baad 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -31,15 +31,15 @@ type inputModel struct { func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", clusterNameArg), - Short: "Shows details of a SKE cluster", - Long: "Shows details of a STACKIT Kubernetes Engine (SKE) cluster.", + Short: "Shows details of a SKE cluster", + Long: "Shows details of a STACKIT Kubernetes Engine (SKE) cluster.", Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( examples.NewExample( - `Get details of an SKE cluster with name "my-cluster"`, + `Get details of a SKE cluster with name "my-cluster"`, "$ stackit ske cluster describe my-cluster"), examples.NewExample( - `Get details of an SKE cluster with name "my-cluster" in JSON format`, + `Get details of a SKE cluster with name "my-cluster" in JSON format`, "$ stackit ske cluster describe my-cluster --output-format json"), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go new file mode 100644 index 000000000..4c0be63ab --- /dev/null +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -0,0 +1,124 @@ +package hibernate + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/ske" + "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" +) + +const ( + clusterNameArg = "CLUSTER_NAME" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ClusterName string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("hibernate %s", clusterNameArg), + Short: "Trigger hibernate for a SKE cluster", + Long: "Trigger hibernate for a STACKIT Kubernetes Engine (SKE) cluster.", + Args: args.SingleArg(clusterNameArg, nil), + Example: examples.Build( + examples.NewExample( + `Trigger hibernate for a SKE cluster with name "my-cluster"`, + "$ stackit ske cluster hibernate my-cluster"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to trigger hibernate for %q in project %q?", model.ClusterName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("hibernate SKE cluster: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Hibernating cluster") + _, err = wait.TriggerClusterHibernationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for SKE cluster hibernation: %w", err) + } + s.Stop() + } + + operationState := "Hibernated" + if model.Async { + operationState = "Triggered hibernation of" + } + params.Printer.Outputf("%s cluster %q\n", operationState, model.ClusterName) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + clusterName := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ClusterName: clusterName, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerHibernateRequest { + req := apiClient.TriggerHibernate(ctx, model.ProjectId, model.Region, model.ClusterName) + return req +} diff --git a/internal/cmd/ske/cluster/hibernate/hibernate_test.go b/internal/cmd/ske/cluster/hibernate/hibernate_test.go new file mode 100644 index 000000000..d9d531ef1 --- /dev/null +++ b/internal/cmd/ske/cluster/hibernate/hibernate_test.go @@ -0,0 +1,186 @@ +package hibernate + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testClusterName = "my-cluster" +) + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} +var testProjectId = uuid.NewString() + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testClusterName, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ClusterName: testClusterName, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *ske.ApiTriggerHibernateRequest)) ske.ApiTriggerHibernateRequest { + request := testClient.TriggerHibernate(testCtx, testProjectId, testRegion, testClusterName) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "missing project id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + delete(fv, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "invalid project id - empty string", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid uuid format", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "not-a-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if len(tt.argValues) == 0 { + _, err := parseInput(p, cmd, tt.argValues) + if err == nil && !tt.isValid { + t.Fatalf("expected error due to missing args") + } + return + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("data does not match:\n%s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest ske.ApiTriggerHibernateRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(tt.expectedRequest), + ) + if diff != "" { + t.Fatalf("request mismatch:\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go new file mode 100644 index 000000000..3396ad7c3 --- /dev/null +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -0,0 +1,124 @@ +package maintenance + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/ske" + "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" +) + +const ( + clusterNameArg = "CLUSTER_NAME" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ClusterName string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("maintenance %s", clusterNameArg), + Short: "Trigger maintenance for a SKE cluster", + Long: "Trigger maintenance for a STACKIT Kubernetes Engine (SKE) cluster.", + Args: args.SingleArg(clusterNameArg, nil), + Example: examples.Build( + examples.NewExample( + `Trigger maintenance for a SKE cluster with name "my-cluster"`, + "$ stackit ske cluster maintenance my-cluster"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to trigger maintenance for %q in project %q?", model.ClusterName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("trigger maintenance SKE cluster: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Performing cluster maintenance") + _, err = wait.TriggerClusterMaintenanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for SKE cluster maintenance to complete: %w", err) + } + s.Stop() + } + + operationState := "Performed maintenance for" + if model.Async { + operationState = "Triggered maintenance for" + } + params.Printer.Outputf("%s cluster %q\n", operationState, model.ClusterName) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + clusterName := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ClusterName: clusterName, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerMaintenanceRequest { + req := apiClient.TriggerMaintenance(ctx, model.ProjectId, model.Region, model.ClusterName) + return req +} diff --git a/internal/cmd/ske/cluster/maintenance/maintenance_test.go b/internal/cmd/ske/cluster/maintenance/maintenance_test.go new file mode 100644 index 000000000..fe0ab07cb --- /dev/null +++ b/internal/cmd/ske/cluster/maintenance/maintenance_test.go @@ -0,0 +1,187 @@ +package maintenance + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testClusterName = "my-cluster" +) + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} +var testProjectId = uuid.NewString() + +func fixtureArgValues(mods ...func([]string)) []string { + argValues := []string{ + testClusterName, + } + for _, m := range mods { + m(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, m := range mods { + m(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(*inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ClusterName: testClusterName, + } + for _, m := range mods { + m(model) + } + return model +} + +func fixtureRequest(mods ...func(*ske.ApiTriggerMaintenanceRequest)) ske.ApiTriggerMaintenanceRequest { + request := testClient.TriggerMaintenance(testCtx, testProjectId, testRegion, testClusterName) + for _, m := range mods { + m(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "missing project id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + delete(fv, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "invalid project id - empty string", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid uuid format", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "not-a-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if len(tt.argValues) == 0 { + _, err := parseInput(p, cmd, tt.argValues) + if err == nil && !tt.isValid { + t.Fatalf("expected error due to missing args") + } + return + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("input model mismatch:\n%s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest ske.ApiTriggerMaintenanceRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := buildRequest(testCtx, tt.model, testClient) + want := tt.expectedRequest + + diff := cmp.Diff(got, want, + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(want), + ) + if diff != "" { + t.Fatalf("request mismatch:\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/ske/cluster/reconcile/reconcile.go b/internal/cmd/ske/cluster/reconcile/reconcile.go new file mode 100644 index 000000000..54c98dae0 --- /dev/null +++ b/internal/cmd/ske/cluster/reconcile/reconcile.go @@ -0,0 +1,110 @@ +package reconcile + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/ske" + "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" +) + +const ( + clusterNameArg = "CLUSTER_NAME" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ClusterName string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("reconcile %s", clusterNameArg), + Short: "Trigger reconcile for a SKE cluster", + Long: "Trigger reconcile for a STACKIT Kubernetes Engine (SKE) cluster.", + Args: args.SingleArg(clusterNameArg, nil), + Example: examples.Build( + examples.NewExample( + `Trigger reconcile for a SKE cluster with name "my-cluster"`, + "$ stackit ske cluster reconcile my-cluster"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("reconcile SKE cluster: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Performing cluster reconciliation") + _, err = wait.TriggerClusterReconciliationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for SKE cluster reconciliation: %w", err) + } + s.Stop() + } + + operationState := "Performed reconciliation for" + if model.Async { + operationState = "Triggered reconcile for" + } + params.Printer.Outputf("%s cluster %q\n", operationState, model.ClusterName) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + clusterName := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ClusterName: clusterName, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerReconcileRequest { + req := apiClient.TriggerReconcile(ctx, model.ProjectId, model.Region, model.ClusterName) + return req +} diff --git a/internal/cmd/ske/cluster/reconcile/reconcile_test.go b/internal/cmd/ske/cluster/reconcile/reconcile_test.go new file mode 100644 index 000000000..5c96f295b --- /dev/null +++ b/internal/cmd/ske/cluster/reconcile/reconcile_test.go @@ -0,0 +1,187 @@ +package reconcile + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testClusterName = "my-cluster" +) + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} +var testProjectId = uuid.NewString() + +func fixtureArgValues(mods ...func([]string)) []string { + argValues := []string{ + testClusterName, + } + for _, m := range mods { + m(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, m := range mods { + m(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(*inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ClusterName: testClusterName, + } + for _, m := range mods { + m(model) + } + return model +} + +func fixtureRequest(mods ...func(request *ske.ApiTriggerReconcileRequest)) ske.ApiTriggerHibernateRequest { + request := testClient.TriggerReconcile(testCtx, testProjectId, testRegion, testClusterName) + for _, m := range mods { + m(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "missing project id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + delete(fv, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "invalid project id - empty string", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid uuid format", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "not-a-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if len(tt.argValues) == 0 { + _, err := parseInput(p, cmd, tt.argValues) + if err == nil && !tt.isValid { + t.Fatalf("expected error due to missing args") + } + return + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("input model mismatch:\n%s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest ske.ApiTriggerHibernateRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := buildRequest(testCtx, tt.model, testClient) + want := tt.expectedRequest + + diff := cmp.Diff(got, want, + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(want), + ) + if diff != "" { + t.Fatalf("request mismatch:\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 420c06349..8c32f8d95 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -37,7 +37,7 @@ type inputModel struct { func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", clusterNameArg), - Short: "Updates an SKE cluster", + Short: "Updates a SKE cluster", Long: fmt.Sprintf("%s\n%s\n%s", "Updates a STACKIT Kubernetes Engine (SKE) cluster.", "The payload can be provided as a JSON string or a file path prefixed with \"@\".", @@ -46,10 +46,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( examples.NewExample( - `Update an SKE cluster using an API payload sourced from the file "./payload.json"`, + `Update a SKE cluster using an API payload sourced from the file "./payload.json"`, "$ stackit ske cluster update my-cluster --payload @./payload.json"), examples.NewExample( - `Update an SKE cluster using an API payload provided as a JSON string`, + `Update a SKE cluster using an API payload provided as a JSON string`, `$ stackit ske cluster update my-cluster --payload "{...}"`), examples.NewExample( `Generate a payload with the current values of a cluster, and adapt it with custom values for the different configuration options`, diff --git a/internal/cmd/ske/cluster/wakeup/wakeup.go b/internal/cmd/ske/cluster/wakeup/wakeup.go new file mode 100644 index 000000000..e7b9b6534 --- /dev/null +++ b/internal/cmd/ske/cluster/wakeup/wakeup.go @@ -0,0 +1,110 @@ +package wakeup + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/ske" + "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" +) + +const ( + clusterNameArg = "CLUSTER_NAME" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ClusterName string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("wakeup %s", clusterNameArg), + Short: "Trigger wakeup from hibernation for a SKE cluster", + Long: "Trigger wakeup from hibernation for a STACKIT Kubernetes Engine (SKE) cluster.", + Args: args.SingleArg(clusterNameArg, nil), + Example: examples.Build( + examples.NewExample( + `Trigger wakeup from hibernation for a SKE cluster with name "my-cluster"`, + "$ stackit ske cluster wakeup my-cluster"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("wakeup SKE cluster: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Performing cluster wakeup") + _, err = wait.TriggerClusterWakeupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for SKE cluster wakeup: %w", err) + } + s.Stop() + } + + operationState := "Performed wakeup of" + if model.Async { + operationState = "Triggered wakeup of" + } + params.Printer.Outputf("%s cluster %q\n", operationState, model.ClusterName) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + clusterName := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ClusterName: clusterName, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerWakeupRequest { + req := apiClient.TriggerWakeup(ctx, model.ProjectId, model.Region, model.ClusterName) + return req +} diff --git a/internal/cmd/ske/cluster/wakeup/wakeup_test.go b/internal/cmd/ske/cluster/wakeup/wakeup_test.go new file mode 100644 index 000000000..dd93881c1 --- /dev/null +++ b/internal/cmd/ske/cluster/wakeup/wakeup_test.go @@ -0,0 +1,185 @@ +package wakeup + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testClusterName = "my-cluster" +) + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} +var testProjectId = uuid.NewString() + +func fixtureArgValues(mods ...func([]string)) []string { + argValues := []string{testClusterName} + for _, m := range mods { + m(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(map[string]string)) map[string]string { + flags := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, m := range mods { + m(flags) + } + return flags +} + +func fixtureInputModel(mods ...func(*inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ClusterName: testClusterName, + } + for _, m := range mods { + m(model) + } + return model +} + +func fixtureRequest(mods ...func(*ske.ApiTriggerWakeupRequest)) ske.ApiTriggerWakeupRequest { + req := testClient.TriggerWakeup(testCtx, testProjectId, testRegion, testClusterName) + for _, m := range mods { + m(&req) + } + return req +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "missing project id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + delete(fv, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "invalid project id - empty string", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid uuid format", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(fv map[string]string) { + fv[globalflags.ProjectIdFlag] = "not-a-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + if len(tt.argValues) == 0 { + _, err := parseInput(p, cmd, tt.argValues) + if err == nil && !tt.isValid { + t.Fatalf("expected failure due to missing args") + } + return + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("unexpected error: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("input model mismatch:\n%s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest ske.ApiTriggerHibernateRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := buildRequest(testCtx, tt.model, testClient) + want := tt.expectedRequest + + diff := cmp.Diff(got, want, + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(want), + ) + if diff != "" { + t.Fatalf("request mismatch:\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index fe2907958..681b74db9 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -44,9 +44,9 @@ type inputModel struct { func NewCmd(params *params.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", clusterNameArg), - Short: "Creates or update a kubeconfig for an SKE cluster", + Short: "Creates or update a kubeconfig for a SKE cluster", Long: fmt.Sprintf("%s\n\n%s\n%s\n%s\n%s", - "Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exits in the kubeconfig file the information will be updated.", + "Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exists in the kubeconfig file the information will be updated.", "By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created.", "You can override this behavior by specifying a custom filepath with the --filepath flag.\n", "An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 1h.\n", diff --git a/internal/cmd/ske/ske.go b/internal/cmd/ske/ske.go index 137165e06..e782119db 100644 --- a/internal/cmd/ske/ske.go +++ b/internal/cmd/ske/ske.go @@ -28,11 +28,11 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(cluster.NewCmd(params)) + cmd.AddCommand(credentials.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) cmd.AddCommand(enable.NewCmd(params)) cmd.AddCommand(kubeconfig.NewCmd(params)) - cmd.AddCommand(disable.NewCmd(params)) - cmd.AddCommand(cluster.NewCmd(params)) - cmd.AddCommand(credentials.NewCmd(params)) cmd.AddCommand(options.NewCmd(params)) } From 9e9e67deec7fc1c4a5f184fe1c423e716dc267a3 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:05:02 +0200 Subject: [PATCH 098/422] chore(deps): update renovatebot/github-action action to v43.0.5 (#897) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index df77823ed..01da40dbf 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.4 + uses: renovatebot/github-action@v43.0.5 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 2446141aa4db825ac913b6915fe6b396b344711b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 12:16:10 +0200 Subject: [PATCH 099/422] chore(deps): bump github.com/jedib0t/go-pretty/v6 from 6.6.7 to 6.6.8 (#896) Bumps [github.com/jedib0t/go-pretty/v6](https://github.com/jedib0t/go-pretty) from 6.6.7 to 6.6.8. - [Release notes](https://github.com/jedib0t/go-pretty/releases) - [Commits](https://github.com/jedib0t/go-pretty/compare/v6.6.7...v6.6.8) --- updated-dependencies: - dependency-name: github.com/jedib0t/go-pretty/v6 dependency-version: 6.6.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 41c43fc2f..6b73d2617 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.6.7 + github.com/jedib0t/go-pretty/v6 v6.6.8 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.9.1 diff --git a/go.sum b/go.sum index c344eaabc..503f66c59 100644 --- a/go.sum +++ b/go.sum @@ -342,8 +342,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.6.7 h1:m+LbHpm0aIAPLzLbMfn8dc3Ht8MW7lsSO4MPItz/Uuo= -github.com/jedib0t/go-pretty/v6 v6.6.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.6.8 h1:JnnzQeRz2bACBobIaa/r+nqjvws4yEhcmaZ4n1QzsEc= +github.com/jedib0t/go-pretty/v6 v6.6.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From db88d79c3b6feeffea01497d1a2be5f1dfa0e13b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Jul 2025 17:15:16 +0200 Subject: [PATCH 100/422] chore(deps): bump github.com/golang-jwt/jwt/v5 from 5.2.3 to 5.3.0 (#901) Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.2.3 to 5.3.0. - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md) - [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.3...v5.3.0) --- updated-dependencies: - dependency-name: github.com/golang-jwt/jwt/v5 dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6b73d2617..a2d00487f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24 require ( github.com/fatih/color v1.18.0 github.com/goccy/go-yaml v1.18.0 - github.com/golang-jwt/jwt/v5 v5.2.3 + github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf diff --git a/go.sum b/go.sum index 503f66c59..dd2f02561 100644 --- a/go.sum +++ b/go.sum @@ -222,8 +222,8 @@ github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeH github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= -github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= From 7ba5ffc69f07ba72d8acd61d7aab7c7a5d84de77 Mon Sep 17 00:00:00 2001 From: Kevin Gimbel Date: Mon, 4 Aug 2025 11:21:45 +0200 Subject: [PATCH 101/422] feat(ske): respect KUBECONFIG environment variable (#876) relates to #875 --- docs/stackit_ske_kubeconfig_create.md | 4 +- internal/cmd/ske/kubeconfig/create/create.go | 4 +- internal/pkg/services/ske/utils/utils.go | 6 ++- internal/pkg/services/ske/utils/utils_test.go | 45 +++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/docs/stackit_ske_kubeconfig_create.md b/docs/stackit_ske_kubeconfig_create.md index c0f95423b..476d50bab 100644 --- a/docs/stackit_ske_kubeconfig_create.md +++ b/docs/stackit_ske_kubeconfig_create.md @@ -7,7 +7,7 @@ Creates or update a kubeconfig for a SKE cluster Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exists in the kubeconfig file the information will be updated. By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created. -You can override this behavior by specifying a custom filepath with the --filepath flag. +You can override this behavior by specifying a custom filepath using the --filepath flag or by setting the KUBECONFIG env variable (fallback). An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 1h. @@ -47,7 +47,7 @@ stackit ske kubeconfig create CLUSTER_NAME [flags] ``` --disable-writing Disable the writing of kubeconfig. Set the output format to json or yaml using the --output-format flag to display the kubeconfig. -e, --expiration string Expiration time for the kubeconfig in seconds(s), minutes(m), hours(h), days(d) or months(M). Example: 30d. By default, expiration time is 1h - --filepath string Path to create the kubeconfig file. By default, the kubeconfig is created as 'config' in the .kube folder, in the user's home directory. + --filepath string Path to create the kubeconfig file. Will fall back to KUBECONFIG env variable if not set. In case both aren't set, the kubeconfig is created as file named 'config' in the .kube folder in the user's home directory. -h, --help Help for "stackit ske kubeconfig create" -l, --login Create a login kubeconfig that obtains valid credentials via the STACKIT CLI. This flag is mutually exclusive with the expiration flag. --overwrite Overwrite the kubeconfig file. diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index 681b74db9..f420009f0 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -48,7 +48,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Long: fmt.Sprintf("%s\n\n%s\n%s\n%s\n%s", "Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exists in the kubeconfig file the information will be updated.", "By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created.", - "You can override this behavior by specifying a custom filepath with the --filepath flag.\n", + "You can override this behavior by specifying a custom filepath using the --filepath flag or by setting the KUBECONFIG env variable (fallback).\n", "An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 1h.\n", "Note that the format is , e.g. 30d for 30 days and you can't combine units."), Args: args.SingleArg(clusterNameArg, nil), @@ -170,7 +170,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(disableWritingFlag, false, fmt.Sprintf("Disable the writing of kubeconfig. Set the output format to json or yaml using the --%s flag to display the kubeconfig.", globalflags.OutputFormatFlag)) cmd.Flags().BoolP(loginFlag, "l", false, "Create a login kubeconfig that obtains valid credentials via the STACKIT CLI. This flag is mutually exclusive with the expiration flag.") - cmd.Flags().String(filepathFlag, "", "Path to create the kubeconfig file. By default, the kubeconfig is created as 'config' in the .kube folder, in the user's home directory.") + cmd.Flags().String(filepathFlag, "", "Path to create the kubeconfig file. Will fall back to KUBECONFIG env variable if not set. In case both aren't set, the kubeconfig is created as file named 'config' in the .kube folder in the user's home directory.") cmd.Flags().StringP(expirationFlag, "e", "", "Expiration time for the kubeconfig in seconds(s), minutes(m), hours(h), days(d) or months(M). Example: 30d. By default, expiration time is 1h") cmd.Flags().Bool(overwriteFlag, false, "Overwrite the kubeconfig file.") cmd.MarkFlagsMutuallyExclusive(loginFlag, expirationFlag) diff --git a/internal/pkg/services/ske/utils/utils.go b/internal/pkg/services/ske/utils/utils.go index 4c5604fc4..605ca4158 100644 --- a/internal/pkg/services/ske/utils/utils.go +++ b/internal/pkg/services/ske/utils/utils.go @@ -284,8 +284,12 @@ func WriteConfigFile(configPath, data string) error { return nil } -// GetDefaultKubeconfigPath returns the default location for the kubeconfig file. +// GetDefaultKubeconfigPath returns the default location for the kubeconfig file or the value of KUBECONFIG if set. func GetDefaultKubeconfigPath() (string, error) { + if kubeconfigEnv := os.Getenv("KUBECONFIG"); kubeconfigEnv != "" { + return kubeconfigEnv, nil + } + userHome, err := os.UserHomeDir() if err != nil { return "", fmt.Errorf("get user home directory: %w", err) diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index 27b9b8d6a..917d590ae 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -698,3 +698,48 @@ func TestGetDefaultKubeconfigPath(t *testing.T) { }) } } + +func TestGetDefaultKubeconfigPathWithEnvVar(t *testing.T) { + tests := []struct { + description string + kubeconfigEnvVar string + expected string + userHome string + }{ + { + description: "base", + kubeconfigEnvVar: "~/.kube/custom/config", + expected: "~/.kube/custom/config", + userHome: "/home/test-user", + }, + { + description: "return user home when environment var is empty", + kubeconfigEnvVar: "", + expected: "/home/test-user/.kube/config", + userHome: "/home/test-user", + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + // Setup environment variables + err := os.Setenv("KUBECONFIG", tt.kubeconfigEnvVar) + if err != nil { + t.Errorf("could not set KUBECONFIG environment variable: %s", err) + } + err = os.Setenv("HOME", tt.userHome) + if err != nil { + t.Errorf("could not set HOME environment variable: %s", err) + } + + output, err := GetDefaultKubeconfigPath() + + if err != nil { + t.Errorf("failed on valid input") + } + if output != tt.expected { + t.Errorf("expected output to be %s, got %s", tt.expected, output) + } + }) + } +} From 8c7662401a6f33b1e11d6439068efd40a8069bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:43:45 +0200 Subject: [PATCH 102/422] fix(cli): stackit auth get-access-token does not work as expected (#922) --- .../cmd/auth/get-access-token/get_access_token.go | 3 +-- internal/pkg/auth/auth.go | 15 +++++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 5e5b9d60b..c0c59e294 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -44,8 +44,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return &cliErr.SessionExpiredError{} } - // Try to get a valid access token, refreshing if necessary - accessToken, err := auth.RefreshAccessToken(params.Printer) + accessToken, err := auth.GetValidAccessToken(params.Printer) if err != nil { return err } diff --git a/internal/pkg/auth/auth.go b/internal/pkg/auth/auth.go index 634813f24..9a9b48817 100644 --- a/internal/pkg/auth/auth.go +++ b/internal/pkg/auth/auth.go @@ -134,15 +134,22 @@ func getEmailFromToken(token string) (string, error) { return claims.Email, nil } -// RefreshAccessToken refreshes the access token if it's expired for the user token flow. -// It returns the new access token or an error if the refresh fails. -func RefreshAccessToken(p *print.Printer) (string, error) { +// GetValidAccessToken returns a valid access token for the current authentication flow. +// For user token flows, it refreshes the token if necessary. +// For service account flows, it returns the current access token. +func GetValidAccessToken(p *print.Printer) (string, error) { flow, err := GetAuthFlow() if err != nil { return "", fmt.Errorf("get authentication flow: %w", err) } + + // For service account flows, just return the current token + if flow == AUTH_FLOW_SERVICE_ACCOUNT_TOKEN || flow == AUTH_FLOW_SERVICE_ACCOUNT_KEY { + return GetAccessToken() + } + if flow != AUTH_FLOW_USER_TOKEN { - return "", fmt.Errorf("token refresh is only supported for user token flow, current flow: %s", flow) + return "", fmt.Errorf("unsupported authentication flow: %s", flow) } // Load tokens from storage From 5d8c4ee6c222fd6370573ee385fdae4858da1ef5 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 13 Aug 2025 08:51:02 +0200 Subject: [PATCH 103/422] chore(deps): update module golang.org/x/tools to v0.36.0 (#911) Co-authored-by: Renovate Bot --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index a2d00487f..bc5fc121a 100644 --- a/go.mod +++ b/go.mod @@ -34,16 +34,16 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.26.0 + golang.org/x/mod v0.27.0 golang.org/x/oauth2 v0.30.0 - golang.org/x/term v0.33.0 - golang.org/x/text v0.27.0 + golang.org/x/term v0.34.0 + golang.org/x/text v0.28.0 k8s.io/apimachinery v0.32.3 k8s.io/client-go v0.32.3 ) require ( - golang.org/x/net v0.42.0 // indirect + golang.org/x/net v0.43.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -207,7 +207,7 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.16.0 // indirect - golang.org/x/tools v0.35.0 // indirect + golang.org/x/tools v0.36.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/protobuf v1.36.6 // indirect @@ -247,7 +247,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.34.0 // indirect + golang.org/x/sys v0.35.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.32.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index dd2f02561..f8def98fa 100644 --- a/go.sum +++ b/go.sum @@ -753,8 +753,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +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-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -795,8 +795,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +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.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -873,8 +873,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +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.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -883,8 +883,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= -golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +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.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -897,8 +897,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +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.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -962,8 +962,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +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/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= From 99134f70ababe7c51d82a586d9d5364d192a9031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:16:42 +0200 Subject: [PATCH 104/422] chore(deps): bump renovatebot/github-action from 43.0.5 to 43.0.7 (#919) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.5 to 43.0.7. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.5...v43.0.7) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 01da40dbf..b6365adf9 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.5 + uses: renovatebot/github-action@v43.0.7 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 6e065f64a586c846771447b5e2afd4941f5fcbcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:25:41 +0200 Subject: [PATCH 105/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#917) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serviceaccount](https://github.com/stackitcloud/stackit-sdk-go) from 0.9.1 to 0.11.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/dns/v0.9.1...services/ske/v0.11.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serviceaccount dependency-version: 0.11.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bc5fc121a..17a2b8e21 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 diff --git a/go.sum b/go.sum index f8def98fa..91a0cc7bb 100644 --- a/go.sum +++ b/go.sum @@ -605,8 +605,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 h1:tfKC4Z6Ua github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2/go.mod h1:wV7/BUV3BCLq5+E1bHXrKKt/eOPVdWgLArWLAq7rZ/U= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 h1:hcHX2n5pUsOcv2PPPbSJph1fQ/I6P7g7781T1f1ycEI= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1/go.mod h1:jZwTg3wU4/UxgNJ7TKlFZ3dTIlnfvppnW8kJTc4UXy8= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1 h1:6kEct2wo84DlHkKJTNcUQbKAwARh/ugOTDR3x5mYCWc= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.9.1/go.mod h1:dScCMWYbsf3B+c6a/5CFoVFcYLqHHkEEc622cHFtGGY= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0 h1:u0PjbKDuIVOMm9hyxLeqSM51ExtJXJ+TdSJT5hDW6wk= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 h1:hPCpRcWEzwzGONZJsKH+j2TjN1LRTH7Tp/q0TyzmL5M= From 7869a21826b361ca9f57daac41cee2e57c21dd01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:34:52 +0200 Subject: [PATCH 106/422] chore(deps): bump actions/checkout from 4 to 5 (#920) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 4 ++-- .github/workflows/release.yaml | 2 +- .github/workflows/renovate.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 50d71d17b..a9a3dd3fa 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install go uses: actions/setup-go@v5 @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Check GoReleaser uses: goreleaser/goreleaser-action@v6 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 09d8ce121..1954acadd 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,7 +26,7 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SECRET_ACCESS_KEY }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: # Allow goreleaser to access older tag information. fetch-depth: 0 diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index b6365adf9..fcc641580 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Self-hosted Renovate uses: renovatebot/github-action@v43.0.7 with: From b4ddc7990392a3440f8dbc1b5f7d40d19dc41f21 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:56:45 +0200 Subject: [PATCH 107/422] fix(deps): update stackit sdk modules (#903) * fix(deps): update stackit sdk modules * chore(linter): fix linter issues for image and volume Signed-off-by: Alexander Dahmen --------- Signed-off-by: Alexander Dahmen Co-authored-by: Renovate Bot Co-authored-by: Alexander Dahmen --- go.mod | 6 +++--- go.sum | 12 ++++++------ internal/cmd/image/list/list.go | 3 ++- internal/cmd/volume/list/list.go | 3 ++- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 17a2b8e21..7fe1a21be 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.0 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1 @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.1 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 91a0cc7bb..0fac107be 100644 --- a/go.sum +++ b/go.sum @@ -573,20 +573,20 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 h1:hkFixFnBcQzU4BSIZFITc8N0gK0pUYk7mk0wdUu5Ki8= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1/go.mod h1:Ng1EzrRndG3iGXGH90AZJz//wfK+2YOyDwTnTLwX3a4= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1 h1:0RP8DCwSCbl0KBsRI6INFy/8JW7UqlAd2Yr3dWFS3No= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.27.1/go.mod h1:TvqL/TgVrrdDF387gAhO8QQYLxiaOZwgpmyv6s15TU0= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.0 h1:j4FKFOVkcTot8xNxpvDsPzIFyjADE4GxXF0rFE6/Uo4= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.0/go.mod h1:b/jgJf7QHdRzU2fmZeJJtu5j0TAevDRghzcn5MyRmOI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 h1:OdJEs8eOfrzn9tCBDLxIyP8hX50zPfcXNYnRoQX+chs= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1/go.mod h1:11uzaOPCF9SeDHXEGOPMlHDD3J5r2TnvCGUwW9Igq9c= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1/go.mod h1:ivt8lvnAoBZsde2jSAuicyn6RgTmHvvNAJ3whaUbAD4= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIeh5XB2Ews2B9Lj5DJlMWIEJh60FfZ4Y= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1 h1:XOpikSY2IXfBJPzUdgBk69iJXFC99xzfYtY1h4bZ5vM= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.1/go.mod h1:G7S/hGa6EyX5Avxxw/PIdbdtbFeiXL/T1vUkPOJ120w= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/aGHepE/+gVsvSg1sRkPOyIUI/jkCyUOrWg= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.1 h1:eSiUKN61FJ4x42vgIvhVU7bgmrPbj05xR4y0nnRV5Yg= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.9.1/go.mod h1:oJku0heeBwsy4IToqhvSdPJI++GUNkBSESxOjiLWRVQ= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.10.0 h1:SIctDqGprEoZArWaTds7hzQyh8Pqaz95Nmuj/1QuDEQ= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.10.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index 67e0c951c..57280b383 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -166,7 +166,8 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err default: table := tables.NewTable() table.SetHeader("ID", "NAME", "OS", "ARCHITECTURE", "DISTRIBUTION", "VERSION", "LABELS") - for _, item := range items { + for i := range items { + item := items[i] var ( architecture string = "n/a" os string = "n/a" diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index 7534bb4a3..aac08c50b 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -167,7 +167,8 @@ func outputResult(p *print.Printer, outputFormat string, volumes []iaas.Volume) table := tables.NewTable() table.SetHeader("ID", "Name", "Status", "Server", "Availability Zone", "Size (GB)") - for _, volume := range volumes { + for i := range volumes { + volume := volumes[i] table.AddRow( utils.PtrString(volume.Id), utils.PtrString(volume.Name), From 0ac494e8b64004bc6d07aed6b688f9163160163e Mon Sep 17 00:00:00 2001 From: Lukas Hoehl Date: Wed, 13 Aug 2025 11:06:20 +0200 Subject: [PATCH 108/422] feat(ske): show cluster errors in table output (#907) Signed-off-by: Lukas Hoehl Co-authored-by: Benjosh95 --- internal/cmd/ske/cluster/describe/describe.go | 19 ++ .../cmd/ske/cluster/describe/describe_test.go | 179 ++++++++++++++++++ 2 files changed, 198 insertions(+) diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 04d33baad..a983f442e 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "github.com/goccy/go-yaml" "github.com/spf13/cobra" @@ -131,11 +132,15 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e if cluster.HasStatus() { table.AddRow("STATE", utils.PtrString(cluster.Status.Aggregated)) table.AddSeparator() + if clusterErrs := cluster.Status.GetErrors(); len(clusterErrs) != 0 { + handleClusterErrors(clusterErrs, &table) + } } if cluster.Kubernetes != nil { table.AddRow("VERSION", utils.PtrString(cluster.Kubernetes.Version)) table.AddSeparator() } + table.AddRow("ACL", acl) err := table.Display(p) if err != nil { @@ -145,3 +150,17 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e return nil } } + +func handleClusterErrors(clusterErrs []ske.ClusterError, table *tables.Table) { + errs := make([]string, 0, len(clusterErrs)) + for _, e := range clusterErrs { + b := new(strings.Builder) + fmt.Fprint(b, e.GetCode()) + if msg, ok := e.GetMessageOk(); ok { + fmt.Fprintf(b, ": %s", msg) + } + errs = append(errs, b.String()) + } + table.AddRow("ERRORS", strings.Join(errs, "\n")) + table.AddSeparator() +} diff --git a/internal/cmd/ske/cluster/describe/describe_test.go b/internal/cmd/ske/cluster/describe/describe_test.go index df33417ff..a5f7f766e 100644 --- a/internal/cmd/ske/cluster/describe/describe_test.go +++ b/internal/cmd/ske/cluster/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -234,6 +235,184 @@ func TestOutputResult(t *testing.T) { }, wantErr: false, }, + { + name: "cluster with single error", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), + Message: utils.Ptr("Network configuration not found"), + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster with multiple errors", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), + Message: utils.Ptr("Network configuration not found"), + }, + { + Code: utils.Ptr("SKE_NODE_MACHINE_TYPE_NOT_FOUND"), + Message: utils.Ptr("Specified machine type unavailable"), + }, + { + Code: utils.Ptr("SKE_FETCHING_ERRORS_NOT_POSSIBLE"), + Message: utils.Ptr("Fetching errors not possible"), + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster with error but no message", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_FETCHING_ERRORS_NOT_POSSIBLE"), + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster with nil errors", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: nil, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster with empty errors array", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{}, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster without status", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + }, + }, + wantErr: false, + }, + { + name: "JSON output format with errors", + args: args{ + outputFormat: print.JSONOutputFormat, + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), + Message: utils.Ptr("Network configuration not found"), + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "YAML output format with errors", + args: args{ + outputFormat: print.YAMLOutputFormat, + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), + Message: utils.Ptr("Network configuration not found"), + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster with kubernetes info and errors", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Kubernetes: &ske.Kubernetes{ + Version: utils.Ptr("1.28.0"), + }, + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), + Message: utils.Ptr("Network configuration not found"), + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "cluster with extensions and errors", + args: args{ + outputFormat: "", + cluster: &ske.Cluster{ + Name: utils.Ptr("test-cluster"), + Extensions: &ske.Extension{ + Acl: &ske.ACL{ + AllowedCidrs: &[]string{"10.0.0.0/8"}, + Enabled: utils.Ptr(true), + }, + }, + Status: &ske.ClusterStatus{ + Errors: &[]ske.ClusterError{ + { + Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), + Message: utils.Ptr("Network configuration not found"), + }, + }, + }, + }, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) From 343c352d249218f3f8fc34502bed6a721b16e2b4 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 18 Aug 2025 08:16:26 +0200 Subject: [PATCH 109/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/iaas to v0.29.1 (#927) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7fe1a21be..125b89639 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.1 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index 0fac107be..25bb26a89 100644 --- a/go.sum +++ b/go.sum @@ -573,8 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 h1:hkFixFnBcQzU4BSIZFITc8N0gK0pUYk7mk0wdUu5Ki8= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1/go.mod h1:Ng1EzrRndG3iGXGH90AZJz//wfK+2YOyDwTnTLwX3a4= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.0 h1:j4FKFOVkcTot8xNxpvDsPzIFyjADE4GxXF0rFE6/Uo4= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.0/go.mod h1:b/jgJf7QHdRzU2fmZeJJtu5j0TAevDRghzcn5MyRmOI= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.1 h1:GfE+FaeIKSVaKvgzh8Eacum+bQVyRS6ngltkh0qNGtM= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.1/go.mod h1:b/jgJf7QHdRzU2fmZeJJtu5j0TAevDRghzcn5MyRmOI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 h1:OdJEs8eOfrzn9tCBDLxIyP8hX50zPfcXNYnRoQX+chs= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1/go.mod h1:11uzaOPCF9SeDHXEGOPMlHDD3J5r2TnvCGUwW9Igq9c= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= From 97596bdf3960ce5889d0b42a0cf46e10e0177db3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 10:45:44 +0200 Subject: [PATCH 110/422] chore(deps): bump renovatebot/github-action from 43.0.7 to 43.0.8 (#929) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.7 to 43.0.8. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.7...v43.0.8) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index fcc641580..f2578c438 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.7 + uses: renovatebot/github-action@v43.0.8 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From eb7c321b89ab97628e2b2ce5468cab7874b1db6b Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Wed, 20 Aug 2025 09:11:12 +0200 Subject: [PATCH 111/422] chore(image): add example how to create an image with uefi disabled (#926) Signed-off-by: Alexander Dahmen --- docs/stackit_image_create.md | 3 +++ internal/cmd/image/create/create.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/docs/stackit_image_create.md b/docs/stackit_image_create.md index 1dbfc5278..eb8a0a3e9 100644 --- a/docs/stackit_image_create.md +++ b/docs/stackit_image_create.md @@ -18,6 +18,9 @@ stackit image create [flags] Create an image with name 'my-new-image' from a qcow2 image read from '/my/qcow2/image' with labels describing its contents $ stackit image create --name my-new-image --disk-format=qcow2 --local-file-path=/my/qcow2/image --labels os=linux,distro=alpine,version=3.12 + + Create an image with name 'my-new-image' from a raw disk image located in '/my/raw/image' with uefi disabled + $ stackit image create --name my-new-image --disk-format=raw --local-file-path=/my/raw/image --uefi=false ``` ### Options diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 0e0a84cbb..3ffe26a68 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -99,6 +99,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create an image with name 'my-new-image' from a qcow2 image read from '/my/qcow2/image' with labels describing its contents`, `$ stackit image create --name my-new-image --disk-format=qcow2 --local-file-path=/my/qcow2/image --labels os=linux,distro=alpine,version=3.12`, ), + examples.NewExample( + `Create an image with name 'my-new-image' from a raw disk image located in '/my/raw/image' with uefi disabled`, + `$ stackit image create --name my-new-image --disk-format=raw --local-file-path=/my/raw/image --uefi=false`, + ), ), RunE: func(cmd *cobra.Command, _ []string) (err error) { ctx := context.Background() From df2b82470fe667ef1006cf51546c23dd52a4220d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Fri, 22 Aug 2025 11:59:46 +0200 Subject: [PATCH 112/422] fix: remove access_token prefix from YAML output in get-access-token (#933) --- .../cmd/auth/get-access-token/get_access_token.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index c0c59e294..f5040d85c 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -59,16 +58,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } params.Printer.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(map[string]string{ - "access_token": accessToken, - }, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal image list: %w", err) - } - params.Printer.Outputln(string(details)) - return nil default: params.Printer.Outputln(accessToken) From d21ed69650453fe3aab6524a4d37c96932826a2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 13:46:13 +0200 Subject: [PATCH 113/422] chore(deps): bump renovatebot/github-action from 43.0.8 to 43.0.9 (#936) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.8 to 43.0.9. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.8...v43.0.9) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index f2578c438..4d8f2595d 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.8 + uses: renovatebot/github-action@v43.0.9 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 4bcfd896eb07c9730052b3ceb9e856e2ed4f07b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Aug 2025 08:52:41 +0200 Subject: [PATCH 114/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability (#938) Bumps [github.com/stackitcloud/stackit-sdk-go/services/observability](https://github.com/stackitcloud/stackit-sdk-go) from 0.10.0 to 0.11.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.10.0...services/ske/v0.11.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/observability dependency-version: 0.11.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 125b89639..cd28f9a4c 100644 --- a/go.mod +++ b/go.mod @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.10.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.11.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 25bb26a89..c9c76e334 100644 --- a/go.sum +++ b/go.sum @@ -585,8 +585,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/a github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.10.0 h1:SIctDqGprEoZArWaTds7hzQyh8Pqaz95Nmuj/1QuDEQ= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.10.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.11.1 h1:y4CfGRNRGdAV3i6+ATIHsr+n6+As5kL9GBXO7FK6gy8= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.11.1/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= From 798c0c31448dabf4ae622ae438ada654ba7f1788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 28 Aug 2025 09:07:21 +0200 Subject: [PATCH 115/422] chore(scripts): use bash found in path in shebang (#937) --- scripts/check-docs.sh | 2 +- scripts/publish-apt-packages.sh | 2 +- scripts/replace.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/check-docs.sh b/scripts/check-docs.sh index d81181db9..cb2058804 100755 --- a/scripts/check-docs.sh +++ b/scripts/check-docs.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # This script is used to ensure for PRs the docs are up-to-date via the CI pipeline # Usage: ./check-docs.sh diff --git a/scripts/publish-apt-packages.sh b/scripts/publish-apt-packages.sh index f6ec84174..9766afcd6 100755 --- a/scripts/publish-apt-packages.sh +++ b/scripts/publish-apt-packages.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # This script is used to publish new packages to the CLI APT repository # Usage: ./publish-apt-packages.sh diff --git a/scripts/replace.sh b/scripts/replace.sh index 0c37f4b85..9326b1f72 100755 --- a/scripts/replace.sh +++ b/scripts/replace.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Add replace directives to local files to go.work set -eo pipefail From a0eee4ef7bbed38042fa10dc99d0533166671142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 29 Aug 2025 10:53:42 +0200 Subject: [PATCH 116/422] fix(ske): print valid json output when listing clusters (#940) also print valid json output when project has no ske clusters relates to STACKITCLI-240 --- internal/cmd/root.go | 3 +-- internal/cmd/ske/cluster/list/list.go | 26 +++++++++++++--------- internal/cmd/ske/cluster/list/list_test.go | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 750bdfa9a..5803cccbe 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -6,8 +6,6 @@ import ( "strings" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - affinityGroups "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups" "github.com/stackitcloud/stackit-cli/internal/cmd/auth" "github.com/stackitcloud/stackit-cli/internal/cmd/beta" @@ -28,6 +26,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch" "github.com/stackitcloud/stackit-cli/internal/cmd/organization" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex" "github.com/stackitcloud/stackit-cli/internal/cmd/project" publicip "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip" diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index 31b8f2b7b..8c357924a 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -85,22 +85,21 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get SKE clusters: %w", err) } clusters := *resp.Items - if len(clusters) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No clusters found for project %q\n", projectLabel) - return nil - } // Truncate output if model.Limit != nil && len(clusters) > int(*model.Limit) { clusters = clusters[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, clusters) + projectLabel := model.ProjectId + if len(clusters) == 0 { + projectLabel, err = projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + } + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, clusters) }, } @@ -148,7 +147,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClie return req } -func outputResult(p *print.Printer, outputFormat string, clusters []ske.Cluster) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, clusters []ske.Cluster) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(clusters, "", " ") @@ -167,6 +166,11 @@ func outputResult(p *print.Printer, outputFormat string, clusters []ske.Cluster) return nil default: + if len(clusters) == 0 { + p.Outputf("No clusters found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("NAME", "STATE", "VERSION", "POOLS", "MONITORING") for i := range clusters { diff --git a/internal/cmd/ske/cluster/list/list_test.go b/internal/cmd/ske/cluster/list/list_test.go index e3c1a063c..4f0543544 100644 --- a/internal/cmd/ske/cluster/list/list_test.go +++ b/internal/cmd/ske/cluster/list/list_test.go @@ -226,7 +226,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.clusters); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, "dummy-projectlabel", tt.args.clusters); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From 79cd1483a508b0e1a20692aeff3f0cbcfe8da22c Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 29 Aug 2025 10:59:29 +0200 Subject: [PATCH 117/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/iaas to v0.29.2 (#943) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cd28f9a4c..a0e80ac11 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.1 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index c9c76e334..2b64ce4e2 100644 --- a/go.sum +++ b/go.sum @@ -573,8 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 h1:hkFixFnBcQzU4BSIZFITc8N0gK0pUYk7mk0wdUu5Ki8= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1/go.mod h1:Ng1EzrRndG3iGXGH90AZJz//wfK+2YOyDwTnTLwX3a4= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.1 h1:GfE+FaeIKSVaKvgzh8Eacum+bQVyRS6ngltkh0qNGtM= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.1/go.mod h1:b/jgJf7QHdRzU2fmZeJJtu5j0TAevDRghzcn5MyRmOI= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.2 h1:BvrbqLi9u0943TTkflPDLGbXgqgVzv7oy8tZHD3q3lg= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.2/go.mod h1:b/jgJf7QHdRzU2fmZeJJtu5j0TAevDRghzcn5MyRmOI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 h1:OdJEs8eOfrzn9tCBDLxIyP8hX50zPfcXNYnRoQX+chs= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1/go.mod h1:11uzaOPCF9SeDHXEGOPMlHDD3J5r2TnvCGUwW9Igq9c= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= From 388abee418c70594ad6d0bac422923e847ee45f7 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 2 Sep 2025 10:13:52 +0200 Subject: [PATCH 118/422] fix(goreleaser): Remove conflicts configuration for homebrew_casks (#945) - remove conflicts_with formula because it is deprecated https://goreleaser.com/deprecations/#homebrew_casksconflictsformula --- .goreleaser.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index f8c772377..8808082eb 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -117,8 +117,6 @@ signs: homebrew_casks: - name: stackit directory: Casks - conflicts: - - formula: stackit repository: owner: stackitcloud name: homebrew-tap From cc2cad24985a18ce6828b5834e73af806970dc50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Sep 2025 09:52:33 +0000 Subject: [PATCH 119/422] chore(deps): bump github.com/spf13/cobra from 1.9.1 to 1.10.1 (#947) --- go.mod | 4 ++-- go.sum | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index a0e80ac11..04b8031de 100644 --- a/go.mod +++ b/go.mod @@ -12,8 +12,8 @@ require ( github.com/jedib0t/go-pretty/v6 v6.6.8 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 - github.com/spf13/cobra v1.9.1 - github.com/spf13/pflag v1.0.7 + github.com/spf13/cobra v1.10.1 + github.com/spf13/pflag v1.0.9 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 diff --git a/go.sum b/go.sum index 2b64ce4e2..f1e88abfa 100644 --- a/go.sum +++ b/go.sum @@ -553,12 +553,11 @@ github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= -github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= From 825589e247a2f51144f336ce8f9ca722648da981 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Sep 2025 10:14:46 +0000 Subject: [PATCH 120/422] chore(deps): bump renovatebot/github-action from 43.0.9 to 43.0.10 (#950) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 4d8f2595d..31c9cb47a 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.9 + uses: renovatebot/github-action@v43.0.10 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From b260b7bd96cee2b7d2b0216c6854f6c58ff41a1d Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:19:49 +0200 Subject: [PATCH 121/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/observability to v0.12.0 (#951) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 04b8031de..c2e599b9e 100644 --- a/go.mod +++ b/go.mod @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.11.1 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index f1e88abfa..6b21cebd3 100644 --- a/go.sum +++ b/go.sum @@ -584,8 +584,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/a github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.11.1 h1:y4CfGRNRGdAV3i6+ATIHsr+n6+As5kL9GBXO7FK6gy8= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.11.1/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.12.0 h1:myi6k4LQJJGaMGwzBKp5hlatrCNNf8FR+/gqnzxnGb8= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.12.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= From ab54d0923296ba9003bb6a4464027b0feb8a1ded Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 3 Sep 2025 14:27:51 +0200 Subject: [PATCH 122/422] fix(deps): update module github.com/spf13/pflag to v1.0.10 (#948) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index c2e599b9e..91ba08b53 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 - github.com/spf13/pflag v1.0.9 + github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.20.1 github.com/stackitcloud/stackit-sdk-go/core v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 diff --git a/go.sum b/go.sum index 6b21cebd3..a2aa99036 100644 --- a/go.sum +++ b/go.sum @@ -556,8 +556,9 @@ github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cA github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= 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/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= From 9dfc1f315fc2921537d93e84e36b36fa01a68bbd Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Wed, 3 Sep 2025 17:30:02 +0200 Subject: [PATCH 123/422] fix: update aptly in release pipeline (#953) * workaround for aptly isn't needed anymore - segmentation fault was fixed in 1.6.1 --- .github/workflows/release.yaml | 7 ++---- aptly.rb | 40 ---------------------------------- 2 files changed, 2 insertions(+), 45 deletions(-) delete mode 100644 aptly.rb diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 1954acadd..597131ecb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -61,11 +61,8 @@ jobs: APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }} SIGNING_CERTIFICATE_BASE64: ${{ secrets.APPLICATION_ID_CERT }} AUTHKEY_BASE64: ${{ secrets.APPLE_API_KEY }} - # aptly version 1.6.0 results in an segmentation fault. Therefore we fall back to version 1.5.0. - # Since it is not possible to specify a version via brew command a formula was added for aptly 1.5.0 - # (source: https://github.com/Homebrew/homebrew-core/pull/202415/files) - - name: Install Aptly version 1.5.0 - run: brew install aptly.rb + - name: Install Aptly + run: brew install aptly - name: Install Snapcraft uses: samuelmeuli/action-snapcraft@v3 - name: Run GoReleaser diff --git a/aptly.rb b/aptly.rb deleted file mode 100644 index 8b1f49727..000000000 --- a/aptly.rb +++ /dev/null @@ -1,40 +0,0 @@ -class Aptly < Formula - desc "Swiss army knife for Debian repository management" - homepage "https://www.aptly.info/" - url "https://github.com/aptly-dev/aptly/archive/refs/tags/v1.5.0.tar.gz" - sha256 "07e18ce606feb8c86a1f79f7f5dd724079ac27196faa61a2cefa5b599bbb5bb1" - license "MIT" - head "https://github.com/aptly-dev/aptly.git", branch: "master" - - bottle do - rebuild 2 - sha256 cellar: :any_skip_relocation, arm64_sequoia: "f689184731329b1c22f23af361e31cd8aa6992084434d49281227654281a8f45" - sha256 cellar: :any_skip_relocation, arm64_sonoma: "0d022b595e520ea53e23b1dfceb4a45139e7e2ba735994196135c1f9c1a36d4c" - sha256 cellar: :any_skip_relocation, arm64_ventura: "c6fa91fb368a63d5558b8c287b330845e04f90bd4fe7223e161493b01747c869" - sha256 cellar: :any_skip_relocation, arm64_monterey: "19c0c8c0b35c1c5faa2a71fc0bd088725f5623f465369dcca5b2cea59322714c" - sha256 cellar: :any_skip_relocation, arm64_big_sur: "2314abe4aae7ea53660920d311cacccd168045994e1a9eddf12a381b215c1908" - sha256 cellar: :any_skip_relocation, sonoma: "0f077e265538e235ad867b39edc756180c8a0fba7ac5385ab59b18e827519f4c" - sha256 cellar: :any_skip_relocation, ventura: "d132d06243b93952309f3fbe1970d87cde272ea103cf1829c880c1b8a85a12cb" - sha256 cellar: :any_skip_relocation, monterey: "86111a102d0782a77bab0d48015bd275f120a36964d86f8f613f1a8f73d94664" - sha256 cellar: :any_skip_relocation, big_sur: "d622cfe1d925f0058f583b8bf48b0bdcee36a441f1bcf145040e5f93879f8765" - sha256 cellar: :any_skip_relocation, catalina: "5d9d495ec8215cfade3e856528dfa233496849517813b19a9ba8d60cb72c4751" - sha256 cellar: :any_skip_relocation, x86_64_linux: "bbff5503f74ef5dcaae33846e285ecf1a23c23de1c858760ae1789ef6fc99524" - end - - depends_on "go" => :build - - def install - system "go", "generate" if build.head? - system "go", "build", *std_go_args(ldflags: "-s -w -X main.Version=#{version}") - - bash_completion.install "completion.d/aptly" - end - - test do - assert_match "aptly version:", shell_output("#{bin}/aptly version") - - (testpath/".aptly.conf").write("{}") - result = shell_output("#{bin}/aptly -config='#{testpath}/.aptly.conf' mirror list") - assert_match "No mirrors found, create one with", result - end -end \ No newline at end of file From dc56c93ec588b30b44719323ef74f868808399a2 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Thu, 4 Sep 2025 13:15:01 +0200 Subject: [PATCH 124/422] fix: s3 publish endpoint could not be parsed (#956) --- .aptly.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.aptly.conf b/.aptly.conf index cbea3aee1..deb53174e 100644 --- a/.aptly.conf +++ b/.aptly.conf @@ -25,7 +25,7 @@ "region": "eu01", "bucket": "distribution", "acl":"public-read", - "endpoint": "object.storage.eu01.onstackit.cloud" + "endpoint": "https://object.storage.eu01.onstackit.cloud" } }, "SwiftPublishEndpoints": {}, From d088df6a2ed13a66a5a6488ef0e90869c36f81c4 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:40:23 +0200 Subject: [PATCH 125/422] fix: release pipeline increase max-tries in download of mirror (#957) --- scripts/publish-apt-packages.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/publish-apt-packages.sh b/scripts/publish-apt-packages.sh index 9766afcd6..02227d012 100755 --- a/scripts/publish-apt-packages.sh +++ b/scripts/publish-apt-packages.sh @@ -27,7 +27,7 @@ aptly mirror create -config "${APTLY_CONFIG_FILE_PATH}" -keyring="${CUSTOM_KEYRI # Update the mirror to the latest state printf "\n>>> Updating mirror \n" -aptly mirror update -keyring="${CUSTOM_KEYRING_FILE}" current +aptly mirror update -keyring="${CUSTOM_KEYRING_FILE}" -max-tries=5 current # Create a snapshot of the mirror printf "\n>>> Creating snapshop from mirror \n" From b373f14508150e3d0412fc07d1f1c24791a4615f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 4 Sep 2025 16:25:38 +0200 Subject: [PATCH 126/422] chore(ci/cd): split apt publishing from release pipeline (#958) --- .github/workflows/release.yaml | 47 +++++++++++++++++++++++++++++---- scripts/publish-apt-packages.sh | 2 -- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 597131ecb..0b91843fd 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,26 +21,26 @@ jobs: runs-on: macOS-latest env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }} - # Needed to publish new packages to our S3-hosted APT repo - AWS_ACCESS_KEY_ID: ${{ secrets.OBJECT_STORAGE_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SECRET_ACCESS_KEY }} steps: - name: Checkout uses: actions/checkout@v5 with: # Allow goreleaser to access older tag information. fetch-depth: 0 + - name: Install go uses: actions/setup-go@v5 with: go-version-file: "go.mod" cache: true + - name: Import GPG key uses: crazy-max/ghaction-import-gpg@v6 id: import_gpg with: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} passphrase: ${{ secrets.GPG_PASSPHRASE }} + - name: Set up keychain run: | echo -n $SIGNING_CERTIFICATE_BASE64 | base64 -d -o ./ApplicationID.p12 @@ -61,10 +61,9 @@ jobs: APPLE_KEY_ID: ${{ secrets.APPLE_KEY_ID }} SIGNING_CERTIFICATE_BASE64: ${{ secrets.APPLICATION_ID_CERT }} AUTHKEY_BASE64: ${{ secrets.APPLE_API_KEY }} - - name: Install Aptly - run: brew install aptly - name: Install Snapcraft uses: samuelmeuli/action-snapcraft@v3 + - name: Run GoReleaser uses: goreleaser/goreleaser-action@v6 with: @@ -72,6 +71,44 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.CLI_RELEASE }} GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }} + + # artifacts need to be passed to the "publish-apt" job somehow + - name: Upload artifacts to workflow + uses: actions/upload-artifact@v4 + with: + name: goreleaser-dist-temp + path: dist + retention-days: 1 + + publish-apt: + name: Publish APT + runs-on: ubuntu-latest + needs: [goreleaser] + env: + # Needed to publish new packages to our S3-hosted APT repo + AWS_ACCESS_KEY_ID: ${{ secrets.OBJECT_STORAGE_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SECRET_ACCESS_KEY }} + steps: + - name: Checkout + uses: actions/checkout@v5 + + # use the artifacts from the "goreleaser" job + - name: Download artifacts from workflow + uses: actions/download-artifact@v4 + with: + name: goreleaser-dist-temp + path: dist + + - name: Install Aptly + run: brew install aptly + + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v6 + id: import_gpg + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} + - name: Publish packages to APT repo if: contains(github.ref_name, '-') == false env: diff --git a/scripts/publish-apt-packages.sh b/scripts/publish-apt-packages.sh index 02227d012..9d122d80b 100755 --- a/scripts/publish-apt-packages.sh +++ b/scripts/publish-apt-packages.sh @@ -4,8 +4,6 @@ # Usage: ./publish-apt-packages.sh set -eo pipefail -ROOT_DIR=$(git rev-parse --show-toplevel) - PACKAGES_BUCKET_URL="https://packages.stackit.cloud" PUBLIC_KEY_FILE_PATH="keys/key.gpg" APT_REPO_PATH="apt/cli" From c9d95ae938e9c2420443d730516a89098889f47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 4 Sep 2025 16:53:46 +0200 Subject: [PATCH 127/422] fix(ci/cd): use correct runner type for apt publishing (#962) --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0b91843fd..191e9a1e2 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -82,7 +82,7 @@ jobs: publish-apt: name: Publish APT - runs-on: ubuntu-latest + runs-on: macOS-latest needs: [goreleaser] env: # Needed to publish new packages to our S3-hosted APT repo From 0cb04b68e2fc6d1cc2f1530d13332a6bb35a5a08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 17:11:49 +0200 Subject: [PATCH 128/422] chore(deps): bump actions/stale from 9 to 10 (#959) Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v9...v10) --- updated-dependencies: - dependency-name: actions/stale dependency-version: '10' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 3ee54f0da..f5e745a71 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -23,7 +23,7 @@ jobs: timeout-minutes: 10 steps: - name: "Mark old PRs as stale" - uses: actions/stale@v9 + uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-pr-message: "This PR was marked as stale after ${{ env.DAYS_BEFORE_PR_STALE }} days of inactivity and will be closed after another ${{ env.DAYS_BEFORE_PR_CLOSE }} days of further inactivity. If this PR should be kept open, just add a comment, remove the stale label or push new commits to it." From b3eb402fe4db01021fbbab8d3cc047211f0d8671 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:18:40 +0000 Subject: [PATCH 129/422] chore(deps): bump actions/setup-go from 5 to 6 (#960) Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5 to 6. - [Release notes](https://github.com/actions/setup-go/releases) - [Commits](https://github.com/actions/setup-go/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-go dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a9a3dd3fa..6311125ba 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v5 - name: Install go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: "go.mod" cache: true diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 191e9a1e2..da7d76f13 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -29,7 +29,7 @@ jobs: fetch-depth: 0 - name: Install go - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version-file: "go.mod" cache: true From 9c9876636d1ae5fae8226916ebc38fad286eafa8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 08:14:29 +0000 Subject: [PATCH 130/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability (#961) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 91ba08b53..9169c13d8 100644 --- a/go.mod +++ b/go.mod @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.12.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.13.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index a2aa99036..6fd451a8f 100644 --- a/go.sum +++ b/go.sum @@ -585,8 +585,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/a github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.12.0 h1:myi6k4LQJJGaMGwzBKp5hlatrCNNf8FR+/gqnzxnGb8= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.12.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.13.0 h1:nlWoD5DhHmyd1oWVcmvWebNy1T4hoWv3GfwbqDGR0w4= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.13.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= From b6db9f831ce537274928ae4f5eee13ce6c392784 Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Fri, 5 Sep 2025 10:24:16 +0200 Subject: [PATCH 131/422] chore(cli): Move STACKIT CLI to GA (#944) Signed-off-by: Alexander Dahmen --- .goreleaser.yaml | 6 +++--- INSTALLATION.md | 2 +- README.md | 3 +-- docs/stackit.md | 3 +-- internal/cmd/root.go | 4 ++-- internal/pkg/auth/templates/login-successful.html | 2 +- 6 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 8808082eb..9f9ae85c1 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -124,7 +124,7 @@ homebrew_casks: name: CLI Release Bot email: noreply@stackit.de homepage: "https://github.com/stackitcloud/stackit-cli" - description: "A command-line interface to manage STACKIT resources.\nThis CLI is in a beta state. More services and functionality will be supported soon." + description: "A command-line interface to manage STACKIT resources." license: "Apache-2.0" # If set to auto, the release will not be uploaded to the homebrew tap repo # if the tag has a prerelease indicator (e.g. v0.0.1-alpha1) @@ -144,12 +144,12 @@ snapcrafts: # centre graphical frontends title: STACKIT CLI summary: A command-line interface to manage STACKIT resources. - description: "A command-line interface to manage STACKIT resources.\nThis CLI is in a beta state. More services and functionality will be supported soon." + description: "A command-line interface to manage STACKIT resources." license: Apache-2.0 confinement: classic # Grade "devel" will only release to `edge` and `beta` channels # Grade "stable" will also release to the `candidate` and `stable` channels - grade: devel + grade: stable # Whether to publish the Snap to the store publish: true diff --git a/INSTALLATION.md b/INSTALLATION.md index 965ceddf9..3a5045149 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -67,7 +67,7 @@ $ stackit config profile import -c @default.json --name myProfile The STACKIT CLI is available as a [Snap](https://snapcraft.io/stackit), and can be installed via: ```shell -sudo snap install stackit --beta --classic +sudo snap install stackit --classic ``` or via the [Snap Store](https://snapcraft.io/snap-store) for desktop. diff --git a/README.md b/README.md index fad966e7b..56fa01bcf 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@
-# STACKIT CLI (BETA) +# STACKIT CLI [![Go Report Card](https://goreportcard.com/badge/github.com/stackitcloud/stackit-cli)](https://goreportcard.com/report/github.com/stackitcloud/stackit-cli) ![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/stackitcloud/stackit-cli) [![GitHub License](https://img.shields.io/github/license/stackitcloud/stackit-cli)](https://www.apache.org/licenses/LICENSE-2.0) @@ -19,7 +19,6 @@ The STACKIT CLI allows you to manage your STACKIT services and resources as well - DNS zones and record-sets - Databases such as PostgreSQL Flex, MongoDB Flex and SQLServer Flex -This CLI is in a BETA state. More services and functionality will be supported soon. Your feedback is appreciated! Feel free to open [GitHub issues](https://github.com/stackitcloud/stackit-cli) to provide feature requests and bug reports. diff --git a/docs/stackit.md b/docs/stackit.md index 3cc35f2f9..d0ddc4554 100644 --- a/docs/stackit.md +++ b/docs/stackit.md @@ -5,8 +5,7 @@ Manage STACKIT resources using the command line ### Synopsis Manage STACKIT resources using the command line. -This CLI is in a BETA state. -More services and functionality will be supported soon. Your feedback is appreciated! +Your feedback is appreciated! ``` stackit [flags] diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 5803cccbe..4e0ac6ea9 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -54,7 +54,7 @@ func NewRootCmd(version, date string, p *print.Printer) *cobra.Command { cmd := &cobra.Command{ Use: "stackit", Short: "Manage STACKIT resources using the command line", - Long: "Manage STACKIT resources using the command line.\nThis CLI is in a BETA state.\nMore services and functionality will be supported soon. Your feedback is appreciated!", + Long: "Manage STACKIT resources using the command line.\nYour feedback is appreciated!", Args: args.NoArgs, SilenceErrors: true, // Error is beautified in a custom way before being printed SilenceUsage: true, @@ -97,7 +97,7 @@ func NewRootCmd(version, date string, p *print.Printer) *cobra.Command { }, RunE: func(cmd *cobra.Command, _ []string) error { if flags.FlagToBoolValue(p, cmd, "version") { - p.Outputf("STACKIT CLI (beta)\n") + p.Outputf("STACKIT CLI\n") parsedDate, err := time.Parse(time.RFC3339, date) if err != nil { diff --git a/internal/pkg/auth/templates/login-successful.html b/internal/pkg/auth/templates/login-successful.html index d8519cad0..3e2d0a5ba 100644 --- a/internal/pkg/auth/templates/login-successful.html +++ b/internal/pkg/auth/templates/login-successful.html @@ -6,7 +6,7 @@ From 9ab6e2a6c079301e81418c8f06a62d3f1a6a7061 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:31:50 +0200 Subject: [PATCH 132/422] docs: add the envs `STACKIT_SERVICE_ACCOUNT_KEY` and `STACKIT_PRIVATE_KEY` to AUTHENTICATION.md (#963) --- AUTHENTICATION.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/AUTHENTICATION.md b/AUTHENTICATION.md index 1ec7ea3ba..1cf3003f8 100644 --- a/AUTHENTICATION.md +++ b/AUTHENTICATION.md @@ -92,7 +92,12 @@ The expected format of the service account key is a **json** with the following > - setting the environment variable `STACKIT_PRIVATE_KEY_PATH` > - setting `STACKIT_PRIVATE_KEY_PATH` in the credentials file (see above) -4. The CLI will search for the keys and, if valid, will use them to get access and refresh tokens which will be used to authenticate all the requests. +4. Alternative, if you want to pass the keys directly without storing a file on disk: + + - setting the environment variable `STACKIT_SERVICE_ACCOUNT_KEY` with the content of the service account key + - optional: setting the environment variable `STACKIT_PRIVATE_KEY` with the content of the private key + +5. The CLI will search for the keys and, if valid, will use them to get access and refresh tokens which will be used to authenticate all the requests. ### Token flow From 411d8d4b2b5ae3335feedc328ee61cf585f413f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 16:00:48 +0200 Subject: [PATCH 133/422] chore(deps): bump actions/download-artifact from 4 to 5 (#967) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index da7d76f13..0760269ed 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -94,7 +94,7 @@ jobs: # use the artifacts from the "goreleaser" job - name: Download artifacts from workflow - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: goreleaser-dist-temp path: dist From eb2399bab5e6d0e642ada0493691194db33113d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 14:06:37 +0000 Subject: [PATCH 134/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability (#965) Bumps [github.com/stackitcloud/stackit-sdk-go/services/observability](https://github.com/stackitcloud/stackit-sdk-go) from 0.13.0 to 0.14.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.13.0...core/v0.14.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/observability dependency-version: 0.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9169c13d8..f16df32e0 100644 --- a/go.mod +++ b/go.mod @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.13.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 6fd451a8f..3178c8536 100644 --- a/go.sum +++ b/go.sum @@ -585,8 +585,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/a github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.13.0 h1:nlWoD5DhHmyd1oWVcmvWebNy1T4hoWv3GfwbqDGR0w4= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.13.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0 h1:oewwaYjABWbNqDkmSwIXmjDBK4a46+tnznyZSXh3Xk0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= From e925b899f8c69d89cc11d887cd542bbc20ee68ee Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:54:03 +0200 Subject: [PATCH 135/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/ske to v1.4.0 (#968) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f16df32e0..c487eca06 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.27.0 diff --git a/go.sum b/go.sum index 3178c8536..00b66a78c 100644 --- a/go.sum +++ b/go.sum @@ -609,8 +609,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0 h1:u0PjbK github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0 h1:hPCpRcWEzwzGONZJsKH+j2TjN1LRTH7Tp/q0TyzmL5M= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.3.0/go.mod h1:jDYRbagjOwKEVsvkxdUErXIvvTOLw9WdBVjaXr5YOD8= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 h1:V6RFvybDeJvvmT3g7/BZodF0gozz3TEpahbpiTftbeY= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0/go.mod h1:xRBgpJ8P5Nf1T5tD0tGAeNg1FNQzx5VF7qqOXt2Fp3s= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 h1:r5808lRhtY8l5anft/UwgJEaef1XsoYObmwd3FVai48= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1/go.mod h1:+LYy2pB+tpF0lkkmCf524wvv2Sa49REgEaNh7JGzN6Y= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From 97e4b55a979e676180762a8c0beff28ac95a0063 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:10:39 +0200 Subject: [PATCH 136/422] chore(deps): bump renovatebot/github-action from 43.0.10 to 43.0.11 (#973) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.10 to 43.0.11. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.10...v43.0.11) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 31c9cb47a..a986c4930 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.10 + uses: renovatebot/github-action@v43.0.11 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From a5438f4cac3a794cb95d04891a83252aa9ae1f1e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 9 Sep 2025 09:02:39 +0200 Subject: [PATCH 137/422] fix(deps): update module github.com/spf13/viper to v1.21.0 (#974) Co-authored-by: Renovate Bot --- go.mod | 17 +++++++++-------- go.sum | 34 ++++++++++++++++++---------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index c487eca06..7b74bbce9 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 - github.com/spf13/viper v1.20.1 + github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 @@ -102,7 +102,7 @@ require ( github.com/go-toolsmith/astp v1.1.0 // indirect github.com/go-toolsmith/strparse v1.1.0 // indirect github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/gofrs/flock v0.12.1 // indirect @@ -183,7 +183,7 @@ require ( github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/stretchr/testify v1.10.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect github.com/tdakkota/asciicheck v0.4.1 // indirect github.com/tetafro/godot v1.5.1 // indirect github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect @@ -205,6 +205,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/tools v0.36.0 // indirect @@ -221,7 +222,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -234,10 +235,10 @@ require ( github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.14.0 // indirect - github.com/spf13/cast v1.7.1 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 diff --git a/go.sum b/go.sum index 00b66a78c..78202de4e 100644 --- a/go.sum +++ b/go.sum @@ -156,8 +156,8 @@ github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47A github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= @@ -207,8 +207,8 @@ github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQi github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= @@ -520,8 +520,8 @@ github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I= github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= @@ -545,22 +545,22 @@ github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY= github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw= github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM= github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= -github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 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/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= -github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.3 h1:GsZGmRRc/3GJLmCUnsZswirr5wfLRrwavbnL/renOqg= @@ -629,8 +629,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8= @@ -699,6 +699,8 @@ 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.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= From 521cee89abb345566ee39938b2d5baeee2264dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 9 Sep 2025 16:47:57 +0200 Subject: [PATCH 138/422] chore(docs): add subcommand registration hint to contribution guide (#979) --- CONTRIBUTION.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index e380d0458..21a668d8c 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -59,6 +59,10 @@ Please remember to always add unit tests for `parseInput`, `buildRequest` (in `b If the new command `bar` is the first command in the CLI using a STACKIT service `foo`, please refer to [Onboarding a new STACKIT service](./CONTRIBUTION.md/#onboarding-a-new-stackit-service). +You may also have to register the `bar` command as a new sub-command: + +https://github.com/stackitcloud/stackit-cli/blob/a5438f4cac3a794cb95d04891a83252aa9ae1f1e/internal/cmd/root.go#L162-L195 + #### Outputs, prints and debug logs The CLI has 4 different verbosity levels: From 352189b011dd2d7852fecd5799924d2e83d9585a Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 10 Sep 2025 10:43:31 +0200 Subject: [PATCH 139/422] fix(deps): update stackit sdk modules (#980) * fix(deps): update stackit sdk modules * chore(objectstorage): Attribute expires is now a NullableString Signed-off-by: Alexander Dahmen --------- Signed-off-by: Alexander Dahmen Co-authored-by: Renovate Bot Co-authored-by: Alexander Dahmen --- go.mod | 4 ++-- go.sum | 8 ++++---- internal/cmd/object-storage/credentials/create/create.go | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 7b74bbce9..8ad2582b8 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 @@ -242,7 +242,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 diff --git a/go.sum b/go.sum index 78202de4e..f2ab016dc 100644 --- a/go.sum +++ b/go.sum @@ -583,8 +583,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIe github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/aGHepE/+gVsvSg1sRkPOyIUI/jkCyUOrWg= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1 h1:4jsFLbDVEosYTgQz6lPds1E9KDOiHwjuhWqcG+lo5B4= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.3.1/go.mod h1:j1SHAS5lN8F9b/iPUOfjAl9QAA9tOT7NKOiDEzcM2zc= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 h1:g3yNDUc3JydAikezUrI9bQ4nuMJpVeAQ35jOFfFmq1U= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0/go.mod h1:foslkEiICdtHR3v0A/i/Rgo6EP9MMula9XNC9luNOgw= github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0 h1:oewwaYjABWbNqDkmSwIXmjDBK4a46+tnznyZSXh3Xk0= github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= @@ -605,8 +605,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 h1:tfKC4Z6Ua github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2/go.mod h1:wV7/BUV3BCLq5+E1bHXrKKt/eOPVdWgLArWLAq7rZ/U= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 h1:hcHX2n5pUsOcv2PPPbSJph1fQ/I6P7g7781T1f1ycEI= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1/go.mod h1:jZwTg3wU4/UxgNJ7TKlFZ3dTIlnfvppnW8kJTc4UXy8= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0 h1:u0PjbKDuIVOMm9hyxLeqSM51ExtJXJ+TdSJT5hDW6wk= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.0/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 h1:crKlHl7QVF97A8CTBK3PBtVpO9c/7qwFvRJi5UN/F7Y= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 h1:V6RFvybDeJvvmT3g7/BZodF0gozz3TEpahbpiTftbeY= diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index eaef679f5..5a809c8d1 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -162,8 +162,8 @@ func outputResult(p *print.Printer, outputFormat, credentialsGroupLabel string, return nil default: expireDate := "Never" - if resp.Expires != nil && *resp.Expires != "" { - expireDate = *resp.Expires + if resp.Expires != nil && resp.Expires.IsSet() && *resp.Expires.Get() != "" { + expireDate = *resp.Expires.Get() } p.Outputf("Created credentials in group %q. Credentials ID: %s\n\n", credentialsGroupLabel, utils.PtrString(resp.KeyId)) From 2efac7d043798ad487b6cf6f3a8d06694740d6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 10 Sep 2025 11:33:42 +0200 Subject: [PATCH 140/422] fix(redis): output valid json on list cmd (#966) relates to STACKITCLI-242 --- internal/cmd/redis/credentials/list/list.go | 25 +++++++++++------- .../cmd/redis/credentials/list/list_test.go | 2 +- internal/cmd/redis/instance/list/list.go | 26 +++++++++++-------- internal/cmd/redis/instance/list/list_test.go | 2 +- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index d7edc501e..e6b4d8c7e 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -69,21 +69,21 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("list Redis credentials: %w", err) } credentials := *resp.CredentialsList + + // Truncate output + if model.Limit != nil && len(credentials) > int(*model.Limit) { + credentials = credentials[:*model.Limit] + } + + instanceLabel := model.InstanceId if len(credentials) == 0 { - instanceLabel, err := redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + instanceLabel, err = redisUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = model.InstanceId } - params.Printer.Info("No credentials found for instance %q\n", instanceLabel) - return nil } - // Truncate output - if model.Limit != nil && len(credentials) > int(*model.Limit) { - credentials = credentials[:*model.Limit] - } - return outputResult(params.Printer, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, credentials) }, } configureFlags(cmd) @@ -135,7 +135,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *redis.APICl return req } -func outputResult(p *print.Printer, outputFormat string, credentials []redis.CredentialsListItem) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, credentials []redis.CredentialsListItem) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(credentials, "", " ") @@ -154,6 +154,11 @@ func outputResult(p *print.Printer, outputFormat string, credentials []redis.Cre return nil default: + if len(credentials) == 0 { + p.Outputf("No credentials found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID") for i := range credentials { diff --git a/internal/cmd/redis/credentials/list/list_test.go b/internal/cmd/redis/credentials/list/list_test.go index a37f530c4..a6c29f283 100644 --- a/internal/cmd/redis/credentials/list/list_test.go +++ b/internal/cmd/redis/credentials/list/list_test.go @@ -238,7 +238,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, "dummy-instance-label", tt.args.credentials); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index cc2bcacbd..1c073147b 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -67,22 +67,21 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("get Redis instances: %w", err) } instances := *resp.Instances - if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil - } // Truncate output if model.Limit != nil && len(instances) > int(*model.Limit) { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + projectLabel := model.ProjectId + if len(instances) == 0 { + projectLabel, err = projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + } + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -130,7 +129,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *redis.APICl return req } -func outputResult(p *print.Printer, outputFormat string, instances []redis.Instance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []redis.Instance) error { switch outputFormat { case print.JSONOutputFormat: details, err := json.MarshalIndent(instances, "", " ") @@ -149,6 +148,11 @@ func outputResult(p *print.Printer, outputFormat string, instances []redis.Insta return nil default: + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { diff --git a/internal/cmd/redis/instance/list/list_test.go b/internal/cmd/redis/instance/list/list_test.go index aff5c8020..f35a6eddd 100644 --- a/internal/cmd/redis/instance/list/list_test.go +++ b/internal/cmd/redis/instance/list/list_test.go @@ -216,7 +216,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, "dummy-project-label", tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From dd3c5168202cc06101629308b43da875811cbe1a Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Wed, 10 Sep 2025 16:21:06 +0200 Subject: [PATCH 141/422] fix: add completions to linux archives (#982) * fix: add missing completions to linux archives for homebrew distribution --- .goreleaser.yaml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 9f9ae85c1..37412c183 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -48,25 +48,22 @@ builds: - cmd: spctl -a -t open --context context:primary-signature -v dist/{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.dmg output: true # Completion files - - cmd: mkdir -p dist/macos-builds_{{.Target}}/completions - - cmd: sh -c './dist/macos-builds_{{.Target}}/{{.Name}} completion zsh > ./dist/macos-builds_{{.Target}}/completions/stackit.zsh' - - cmd: sh -c './dist/macos-builds_{{.Target}}/{{.Name}} completion bash > ./dist/macos-builds_{{.Target}}/completions/stackit.bash' - - cmd: sh -c './dist/macos-builds_{{.Target}}/{{.Name}} completion fish > ./dist/macos-builds_{{.Target}}/completions/stackit.fish' + - cmd: mkdir -p dist/completions + - cmd: sh -c 'go run main.go completion zsh > ./dist/completions/stackit.zsh' + - cmd: sh -c 'go run main.go completion bash > ./dist/completions/stackit.bash' + - cmd: sh -c 'go run main.go completion fish > ./dist/completions/stackit.fish' archives: + - id: windows-archives + ids: + - windows-builds + formats: [ 'zip' ] - ids: - linux-builds - - windows-builds - formats: [ 'tar.gz' ] - format_overrides: - - goos: windows - formats: [ 'zip' ] - - id: macos-archives - ids: - macos-builds formats: [ 'tar.gz' ] files: - - src: ./dist/macos-builds_{{.Target}}/completions/* + - src: ./dist/completions/* dst: completions - LICENSE.md - README.md From 96571d0d9b5938feff9c0607521fbe9f168e6002 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 12 Sep 2025 07:19:22 +0200 Subject: [PATCH 142/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/iaas to v0.30.0 (#988) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8ad2582b8..cf000c443 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.2 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.30.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index f2ab016dc..45fd904a5 100644 --- a/go.sum +++ b/go.sum @@ -573,8 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 h1:hkFixFnBcQzU4BSIZFITc8N0gK0pUYk7mk0wdUu5Ki8= github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1/go.mod h1:Ng1EzrRndG3iGXGH90AZJz//wfK+2YOyDwTnTLwX3a4= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.2 h1:BvrbqLi9u0943TTkflPDLGbXgqgVzv7oy8tZHD3q3lg= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.29.2/go.mod h1:b/jgJf7QHdRzU2fmZeJJtu5j0TAevDRghzcn5MyRmOI= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.30.0 h1:01+noyCSadNH3ALHufcVXxNs0hBsetzJkOMN1Fe0VLc= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.30.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 h1:OdJEs8eOfrzn9tCBDLxIyP8hX50zPfcXNYnRoQX+chs= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1/go.mod h1:11uzaOPCF9SeDHXEGOPMlHDD3J5r2TnvCGUwW9Igq9c= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= From d1e9eca3fa3b4e6543dafe71d442cbfa0af78f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Fri, 12 Sep 2025 09:47:37 +0200 Subject: [PATCH 143/422] fix: use refresh tokens in curl commands for user token flow (#981) --- .../cmd/auth/get-access-token/get_access_token.go | 3 ++- internal/cmd/curl/curl.go | 13 +++---------- internal/pkg/auth/auth.go | 2 +- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index f5040d85c..39bb3be7d 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -45,7 +45,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { accessToken, err := auth.GetValidAccessToken(params.Printer) if err != nil { - return err + params.Printer.Debug(print.ErrorLevel, "get valid access token: %v", err) + return &cliErr.SessionExpiredError{} } switch model.OutputFormat { diff --git a/internal/cmd/curl/curl.go b/internal/cmd/curl/curl.go index 15b79627a..afe797a28 100644 --- a/internal/cmd/curl/curl.go +++ b/internal/cmd/curl/curl.go @@ -181,17 +181,10 @@ func getBearerToken(p *print.Printer) (string, error) { return "", &errors.SessionExpiredError{} } - accessToken, err := auth.GetAccessToken() + accessToken, err := auth.GetValidAccessToken(p) if err != nil { - return "", err - } - - accessTokenExpired, err := auth.TokenExpired(accessToken) - if err != nil { - return "", err - } - if accessTokenExpired { - return "", &errors.AccessTokenExpiredError{} + p.Debug(print.ErrorLevel, "get valid access token: %v", err) + return "", &errors.SessionExpiredError{} } return accessToken, nil diff --git a/internal/pkg/auth/auth.go b/internal/pkg/auth/auth.go index 9a9b48817..ea549a2cb 100644 --- a/internal/pkg/auth/auth.go +++ b/internal/pkg/auth/auth.go @@ -202,7 +202,7 @@ func GetValidAccessToken(p *print.Printer) (string, error) { // Refresh the tokens err = refreshTokens(utf) if err != nil { - return "", fmt.Errorf("refresh access token: %w", err) + return "", fmt.Errorf("access token and refresh token expired: %w", err) } // Return the new access token From 6ab82203353f1e1c362424474a9a3a5f3a3ee77b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 16:49:46 +0200 Subject: [PATCH 144/422] chore(deps): bump renovatebot/github-action from 43.0.11 to 43.0.12 (#990) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.11 to 43.0.12. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.11...v43.0.12) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index a986c4930..758e5a418 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.11 + uses: renovatebot/github-action@v43.0.12 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 813914beab80156cab7d7c16948ca05fa2cdb8c1 Mon Sep 17 00:00:00 2001 From: Kai Kummerer <70690427+Kumm-Kai@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:39:38 +0200 Subject: [PATCH 145/422] fix(ske/login): use region from kubeconfig (#989) * fix STACKITProjectID json key * get region from execCredential cluster config and fallback to region from CLI config --- internal/cmd/ske/kubeconfig/login/login.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index 3edc33b1f..e51f69c63 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -120,11 +120,11 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } type clusterConfig struct { - STACKITProjectID string `json:"stackitProjectId"` + STACKITProjectID string `json:"stackitProjectID"` ClusterName string `json:"clusterName"` + Region string `json:"region"` cacheKey string - Region string } func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, error) { @@ -157,8 +157,10 @@ func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, e config.cacheKey = fmt.Sprintf("ske-login-%x", sha256.Sum256([]byte(execCredential.Spec.Cluster.Server))) - globalFlags := globalflags.Parse(p, cmd) - config.Region = globalFlags.Region + // NOTE: Fallback if region is not set in the kubeconfig (this was the case in the past) + if config.Region == "" { + config.Region = globalflags.Parse(p, cmd).Region + } return config, nil } From f89f79a35303feacb70c327b33582071ee2ba17e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:47:22 +0000 Subject: [PATCH 146/422] chore(deps): bump k8s.io/client-go from 0.32.3 to 0.34.1 (#984) --- go.mod | 23 ++++++++++++----------- go.sum | 54 ++++++++++++++++++++++++++++-------------------------- 2 files changed, 40 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index cf000c443..68e4d4bcd 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/stackitcloud/stackit-cli -go 1.24 +go 1.24.0 require ( github.com/fatih/color v1.18.0 @@ -38,8 +38,8 @@ require ( golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.34.0 golang.org/x/text v0.28.0 - k8s.io/apimachinery v0.32.3 - k8s.io/client-go v0.32.3 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 ) require ( @@ -91,7 +91,7 @@ require ( github.com/ettle/strcase v0.2.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/firefart/nonamedreturns v1.0.6 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/ghostiam/protogetter v0.3.15 // indirect github.com/go-critic/go-critic v0.13.0 // indirect @@ -205,6 +205,7 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.16.0 // indirect @@ -216,6 +217,8 @@ require ( honnef.co/go/tools v0.6.1 // indirect mvdan.cc/gofumpt v0.8.0 // indirect mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) require ( @@ -226,12 +229,11 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -250,12 +252,11 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.35.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.32.3 // indirect + k8s.io/api v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) tool ( diff --git a/go.sum b/go.sum index 45fd904a5..197b7cf59 100644 --- a/go.sum +++ b/go.sum @@ -140,8 +140,8 @@ github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42 github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -158,8 +158,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +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/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY= @@ -271,8 +271,8 @@ github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNF github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= -github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -285,12 +285,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -432,8 +429,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -699,6 +697,8 @@ 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.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1081,18 +1081,18 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= 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-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= -k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +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= mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k= mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg= mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8= @@ -1100,9 +1100,11 @@ mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5gin rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= -sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +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= From 7b2e623eef212846434bc22374119a5991d8b87d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:56:09 +0000 Subject: [PATCH 147/422] chore(deps): bump golang.org/x/term from 0.34.0 to 0.35.0 (#987) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 68e4d4bcd..a3f7f67f0 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.27.0 golang.org/x/oauth2 v0.30.0 - golang.org/x/term v0.34.0 + golang.org/x/term v0.35.0 golang.org/x/text v0.28.0 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 @@ -250,7 +250,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.35.0 // indirect + golang.org/x/sys v0.36.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index 197b7cf59..398d9ec8a 100644 --- a/go.sum +++ b/go.sum @@ -875,8 +875,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -885,8 +885,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -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/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From b3152d7b27307294fe111d76a6eef7501f28a7d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 10:05:07 +0000 Subject: [PATCH 148/422] chore(deps): bump golang.org/x/text from 0.28.0 to 0.29.0 (#972) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index a3f7f67f0..38d145f7c 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( golang.org/x/mod v0.27.0 golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.35.0 - golang.org/x/text v0.28.0 + golang.org/x/text v0.29.0 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 ) @@ -208,7 +208,7 @@ require ( go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/sync v0.16.0 // indirect + golang.org/x/sync v0.17.0 // indirect golang.org/x/tools v0.36.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect diff --git a/go.sum b/go.sum index 398d9ec8a..07e130051 100644 --- a/go.sum +++ b/go.sum @@ -822,8 +822,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -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.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -899,8 +899,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= +golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From c8ba019030d0167b1eaf9d69323df31cdf91c811 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 12:30:38 +0200 Subject: [PATCH 149/422] chore(deps): bump golang.org/x/mod from 0.27.0 to 0.28.0 (#971) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 38d145f7c..dce0f7d6c 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.27.0 + golang.org/x/mod v0.28.0 golang.org/x/oauth2 v0.30.0 golang.org/x/term v0.35.0 golang.org/x/text v0.29.0 diff --git a/go.sum b/go.sum index 07e130051..7519c4d0a 100644 --- a/go.sum +++ b/go.sum @@ -755,8 +755,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -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.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From fa8dea5b905a5e3510bbc454fc67cd49430cdef0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Sep 2025 10:39:30 +0000 Subject: [PATCH 150/422] chore(deps): bump golang.org/x/oauth2 from 0.30.0 to 0.31.0 (#970) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dce0f7d6c..706e4c843 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.28.0 - golang.org/x/oauth2 v0.30.0 + golang.org/x/oauth2 v0.31.0 golang.org/x/term v0.35.0 golang.org/x/text v0.29.0 k8s.io/apimachinery v0.34.1 diff --git a/go.sum b/go.sum index 7519c4d0a..def1c58e0 100644 --- a/go.sum +++ b/go.sum @@ -805,8 +805,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= -golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= +golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 9896dba5bd9d2bcc8576ae11647b4e5694c4db43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 19 Sep 2025 17:15:32 +0200 Subject: [PATCH 151/422] chore(flags): add unit test for string to string flag parsing (#983) --- internal/pkg/flags/flag_to_value_test.go | 73 ++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 internal/pkg/flags/flag_to_value_test.go diff --git a/internal/pkg/flags/flag_to_value_test.go b/internal/pkg/flags/flag_to_value_test.go new file mode 100644 index 000000000..5a71f40db --- /dev/null +++ b/internal/pkg/flags/flag_to_value_test.go @@ -0,0 +1,73 @@ +package flags + +import ( + "fmt" + "reflect" + "testing" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func TestFlagToStringToStringPointer(t *testing.T) { + const flagName = "labels" + + tests := []struct { + name string + flagValue *string + want *map[string]string + }{ + { + name: "flag unset", + flagValue: nil, + want: nil, + }, + { + name: "flag set with single value", + flagValue: utils.Ptr("foo=bar"), + want: &map[string]string{ + "foo": "bar", + }, + }, + { + name: "flag set with multiple values", + flagValue: utils.Ptr("foo=bar,label1=value1,label2=value2"), + want: &map[string]string{ + "foo": "bar", + "label1": "value1", + "label2": "value2", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + // create a new, simple test command with a string-to-string flag + cmd := func() *cobra.Command { + cmd := &cobra.Command{ + Use: "greet", + Short: "A simple greeting command", + Long: "A simple greeting command", + Run: func(_ *cobra.Command, _ []string) { + fmt.Println("Hello world") + }, + } + cmd.Flags().StringToString(flagName, nil, "Labels are key-value string pairs.") + return cmd + }() + + // set the flag value if a value use given, else consider the flag unset + if tt.flagValue != nil { + err := cmd.Flags().Set(flagName, *tt.flagValue) + if err != nil { + t.Error(err) + } + } + + if got := FlagToStringToStringPointer(p, cmd, flagName); !reflect.DeepEqual(got, tt.want) { + t.Errorf("FlagToStringToStringPointer() = %v, want %v", got, tt.want) + } + }) + } +} From 5bfe1b3a8a56ba90d8f4eed3201ab226a247ab7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:58:00 +0200 Subject: [PATCH 152/422] chore(deps): bump renovatebot/github-action from 43.0.12 to 43.0.13 (#994) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 758e5a418..9b509bd86 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.12 + uses: renovatebot/github-action@v43.0.13 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From f30f1877b493e00dacb512ad13461cf3bc79ebb4 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 23 Sep 2025 12:06:18 +0200 Subject: [PATCH 153/422] chore(deps): update module golang.org/x/tools to v0.44.0 (#986) Co-authored-by: Renovate Bot --- go.mod | 5 +++-- go.sum | 10 ++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 706e4c843..9b3dcc8ee 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( ) require ( - golang.org/x/net v0.43.0 // indirect + golang.org/x/net v0.44.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -209,7 +209,8 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/tools v0.36.0 // indirect + golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 // indirect + golang.org/x/tools v0.37.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/protobuf v1.36.6 // indirect diff --git a/go.sum b/go.sum index def1c58e0..34d386281 100644 --- a/go.sum +++ b/go.sum @@ -797,8 +797,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -877,6 +877,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= +golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -964,8 +966,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -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.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= From a2d59a5533aadad13ae4c48b1f56ae8aa61cd439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Wed, 24 Sep 2025 11:02:22 +0200 Subject: [PATCH 154/422] fix: yaml output of servers userdata is bytearray instead of base64 (#998) --- internal/cmd/server/describe/describe.go | 7 +- internal/cmd/server/list/list.go | 7 +- internal/pkg/utils/utils.go | 97 ++++++++ internal/pkg/utils/utils_test.go | 296 +++++++++++++++++++++++ 4 files changed, 405 insertions(+), 2 deletions(-) diff --git a/internal/cmd/server/describe/describe.go b/internal/cmd/server/describe/describe.go index 85444e6ec..ee6e32ea6 100644 --- a/internal/cmd/server/describe/describe.go +++ b/internal/cmd/server/describe/describe.go @@ -118,7 +118,12 @@ func outputResult(p *print.Printer, outputFormat string, server *iaas.Server) er return nil case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(server, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + // This is a temporary workaround to get the desired base64 encoded yaml output for userdata + // and will be replaced by a fix in the Go-SDK + // ref: https://jira.schwarz/browse/STACKITSDK-246 + patchedServer := utils.ConvertToBase64PatchedServer(server) + + details, err := yaml.MarshalWithOptions(patchedServer, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) if err != nil { return fmt.Errorf("marshal server: %w", err) } diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index 29eb51222..8c1596cbb 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -158,7 +158,12 @@ func outputResult(p *print.Printer, outputFormat string, servers []iaas.Server) return nil case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(servers, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + // This is a temporary workaround to get the desired base64 encoded yaml output for userdata + // and will be replaced by a fix in the Go-SDK + // ref: https://jira.schwarz/browse/STACKITSDK-246 + patchedServers := utils.ConvertToBase64PatchedServers(servers) + + details, err := yaml.MarshalWithOptions(patchedServers, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) if err != nil { return fmt.Errorf("marshal server: %w", err) } diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index 2db0936b8..4c362fea2 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -13,6 +13,7 @@ import ( "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) // Ptr Returns the pointer to any type T @@ -153,3 +154,99 @@ func ConvertStringMapToInterfaceMap(m *map[string]string) *map[string]interface{ } return &result } + +// Base64Bytes implements yaml.Marshaler to convert []byte to base64 strings +// ref: https://carlosbecker.com/posts/go-custom-marshaling +type Base64Bytes []byte + +// MarshalYAML implements yaml.Marshaler +func (b Base64Bytes) MarshalYAML() (interface{}, error) { + if len(b) == 0 { + return "", nil + } + return base64.StdEncoding.EncodeToString(b), nil +} + +type Base64PatchedServer struct { + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Status *string `json:"status,omitempty"` + AvailabilityZone *string `json:"availabilityZone,omitempty"` + BootVolume *iaas.CreateServerPayloadBootVolume `json:"bootVolume,omitempty"` + CreatedAt *time.Time `json:"createdAt,omitempty"` + ErrorMessage *string `json:"errorMessage,omitempty"` + PowerStatus *string `json:"powerStatus,omitempty"` + AffinityGroup *string `json:"affinityGroup,omitempty"` + ImageId *string `json:"imageId,omitempty"` + KeypairName *string `json:"keypairName,omitempty"` + MachineType *string `json:"machineType,omitempty"` + Labels *map[string]interface{} `json:"labels,omitempty"` + LaunchedAt *time.Time `json:"launchedAt,omitempty"` + MaintenanceWindow *iaas.ServerMaintenance `json:"maintenanceWindow,omitempty"` + Metadata *map[string]interface{} `json:"metadata,omitempty"` + Networking *iaas.CreateServerPayloadNetworking `json:"networking,omitempty"` + Nics *[]iaas.ServerNetwork `json:"nics,omitempty"` + SecurityGroups *[]string `json:"securityGroups,omitempty"` + ServiceAccountMails *[]string `json:"serviceAccountMails,omitempty"` + UpdatedAt *time.Time `json:"updatedAt,omitempty"` + UserData *Base64Bytes `json:"userData,omitempty"` + Volumes *[]string `json:"volumes,omitempty"` +} + +// ConvertToBase64PatchedServer converts an iaas.Server to Base64PatchedServer +// This is a temporary workaround to get the desired base64 encoded yaml output for userdata +// and will be replaced by a fix in the Go-SDK +// ref: https://jira.schwarz/browse/STACKITSDK-246 +func ConvertToBase64PatchedServer(server *iaas.Server) *Base64PatchedServer { + if server == nil { + return nil + } + + var userData *Base64Bytes + if server.UserData != nil { + userData = Ptr(Base64Bytes(*server.UserData)) + } + + return &Base64PatchedServer{ + Id: server.Id, + Name: server.Name, + Status: server.Status, + AvailabilityZone: server.AvailabilityZone, + BootVolume: server.BootVolume, + CreatedAt: server.CreatedAt, + ErrorMessage: server.ErrorMessage, + PowerStatus: server.PowerStatus, + AffinityGroup: server.AffinityGroup, + ImageId: server.ImageId, + KeypairName: server.KeypairName, + MachineType: server.MachineType, + Labels: server.Labels, + LaunchedAt: server.LaunchedAt, + MaintenanceWindow: server.MaintenanceWindow, + Metadata: server.Metadata, + Networking: server.Networking, + Nics: server.Nics, + SecurityGroups: server.SecurityGroups, + ServiceAccountMails: server.ServiceAccountMails, + UpdatedAt: server.UpdatedAt, + UserData: userData, + Volumes: server.Volumes, + } +} + +// ConvertToBase64PatchedServers converts a slice of iaas.Server to a slice of Base64PatchedServer +// This is a temporary workaround to get the desired base64 encoded yaml output for userdata +// and will be replaced by a fix in the Go-SDK +// ref: https://jira.schwarz/browse/STACKITSDK-246 +func ConvertToBase64PatchedServers(servers []iaas.Server) []Base64PatchedServer { + if servers == nil { + return nil + } + + result := make([]Base64PatchedServer, len(servers)) + for i := range servers { + result[i] = *ConvertToBase64PatchedServer(&servers[i]) + } + + return result +} diff --git a/internal/pkg/utils/utils_test.go b/internal/pkg/utils/utils_test.go index 86588bad8..79fdbae5e 100644 --- a/internal/pkg/utils/utils_test.go +++ b/internal/pkg/utils/utils_test.go @@ -3,8 +3,10 @@ package utils import ( "reflect" "testing" + "time" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -248,3 +250,297 @@ func TestConvertStringMapToInterfaceMap(t *testing.T) { }) } } + +func TestConvertToBase64PatchedServer(t *testing.T) { + now := time.Now() + userData := []byte("test") + emptyUserData := []byte("") + + tests := []struct { + name string + input *iaas.Server + expected *Base64PatchedServer + }{ + { + name: "nil input", + input: nil, + expected: nil, + }, + { + name: "server with user data", + input: &iaas.Server{ + Id: Ptr("server-123"), + Name: Ptr("test-server"), + Status: Ptr("ACTIVE"), + AvailabilityZone: Ptr("eu01-1"), + MachineType: Ptr("t1.1"), + UserData: &userData, + CreatedAt: &now, + PowerStatus: Ptr("RUNNING"), + AffinityGroup: Ptr("group-1"), + ImageId: Ptr("image-123"), + KeypairName: Ptr("keypair-1"), + }, + expected: &Base64PatchedServer{ + Id: Ptr("server-123"), + Name: Ptr("test-server"), + Status: Ptr("ACTIVE"), + AvailabilityZone: Ptr("eu01-1"), + MachineType: Ptr("t1.1"), + UserData: Ptr(Base64Bytes(userData)), + CreatedAt: &now, + PowerStatus: Ptr("RUNNING"), + AffinityGroup: Ptr("group-1"), + ImageId: Ptr("image-123"), + KeypairName: Ptr("keypair-1"), + }, + }, + { + name: "server with empty user data", + input: &iaas.Server{ + Id: Ptr("server-456"), + Name: Ptr("test-server-2"), + Status: Ptr("STOPPED"), + AvailabilityZone: Ptr("eu01-2"), + MachineType: Ptr("t1.2"), + UserData: &emptyUserData, + }, + expected: &Base64PatchedServer{ + Id: Ptr("server-456"), + Name: Ptr("test-server-2"), + Status: Ptr("STOPPED"), + AvailabilityZone: Ptr("eu01-2"), + MachineType: Ptr("t1.2"), + UserData: Ptr(Base64Bytes(emptyUserData)), + }, + }, + { + name: "server without user data", + input: &iaas.Server{ + Id: Ptr("server-789"), + Name: Ptr("test-server-3"), + Status: Ptr("CREATING"), + AvailabilityZone: Ptr("eu01-3"), + MachineType: Ptr("t1.3"), + UserData: nil, + }, + expected: &Base64PatchedServer{ + Id: Ptr("server-789"), + Name: Ptr("test-server-3"), + Status: Ptr("CREATING"), + AvailabilityZone: Ptr("eu01-3"), + MachineType: Ptr("t1.3"), + UserData: nil, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := ConvertToBase64PatchedServer(tt.input) + + if result == nil && tt.expected == nil { + return + } + + if (result == nil && tt.expected != nil) || (result != nil && tt.expected == nil) { + t.Errorf("ConvertToBase64PatchedServer() = %v, want %v", result, tt.expected) + return + } + + if !reflect.DeepEqual(result, tt.expected) { + t.Errorf("ConvertToBase64PatchedServer() = %v, want %v", result, tt.expected) + } + }) + } +} + +func TestConvertToBase64PatchedServers(t *testing.T) { + now := time.Now() + userData1 := []byte("test1") + userData2 := []byte("test2") + emptyUserData := []byte("") + + tests := []struct { + name string + input []iaas.Server + expected []Base64PatchedServer + }{ + { + name: "nil input", + input: nil, + expected: nil, + }, + { + name: "empty slice", + input: []iaas.Server{}, + expected: []Base64PatchedServer{}, + }, + { + name: "single server with user data", + input: []iaas.Server{ + { + Id: Ptr("server-1"), + Name: Ptr("test-server-1"), + Status: Ptr("ACTIVE"), + MachineType: Ptr("t1.1"), + AvailabilityZone: Ptr("eu01-1"), + UserData: &userData1, + CreatedAt: &now, + }, + }, + expected: []Base64PatchedServer{ + { + Id: Ptr("server-1"), + Name: Ptr("test-server-1"), + Status: Ptr("ACTIVE"), + MachineType: Ptr("t1.1"), + AvailabilityZone: Ptr("eu01-1"), + UserData: Ptr(Base64Bytes(userData1)), + CreatedAt: &now, + }, + }, + }, + { + name: "multiple servers mixed", + input: []iaas.Server{ + { + Id: Ptr("server-1"), + Name: Ptr("test-server-1"), + Status: Ptr("ACTIVE"), + MachineType: Ptr("t1.1"), + AvailabilityZone: Ptr("eu01-1"), + UserData: &userData1, + CreatedAt: &now, + }, + { + Id: Ptr("server-2"), + Name: Ptr("test-server-2"), + Status: Ptr("STOPPED"), + MachineType: Ptr("t1.2"), + AvailabilityZone: Ptr("eu01-2"), + UserData: &userData2, + }, + { + Id: Ptr("server-3"), + Name: Ptr("test-server-3"), + Status: Ptr("CREATING"), + MachineType: Ptr("t1.3"), + AvailabilityZone: Ptr("eu01-3"), + UserData: &emptyUserData, + }, + { + Id: Ptr("server-4"), + Name: Ptr("test-server-4"), + Status: Ptr("ERROR"), + MachineType: Ptr("t1.4"), + AvailabilityZone: Ptr("eu01-4"), + UserData: nil, + }, + }, + expected: []Base64PatchedServer{ + { + Id: Ptr("server-1"), + Name: Ptr("test-server-1"), + Status: Ptr("ACTIVE"), + MachineType: Ptr("t1.1"), + AvailabilityZone: Ptr("eu01-1"), + UserData: Ptr(Base64Bytes(userData1)), + CreatedAt: &now, + }, + { + Id: Ptr("server-2"), + Name: Ptr("test-server-2"), + Status: Ptr("STOPPED"), + MachineType: Ptr("t1.2"), + AvailabilityZone: Ptr("eu01-2"), + UserData: Ptr(Base64Bytes(userData2)), + }, + { + Id: Ptr("server-3"), + Name: Ptr("test-server-3"), + Status: Ptr("CREATING"), + MachineType: Ptr("t1.3"), + AvailabilityZone: Ptr("eu01-3"), + UserData: Ptr(Base64Bytes(emptyUserData)), + }, + { + Id: Ptr("server-4"), + Name: Ptr("test-server-4"), + Status: Ptr("ERROR"), + MachineType: Ptr("t1.4"), + AvailabilityZone: Ptr("eu01-4"), + UserData: nil, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := ConvertToBase64PatchedServers(tt.input) + + if result == nil && tt.expected == nil { + return + } + + if (result == nil && tt.expected != nil) || (result != nil && tt.expected == nil) { + t.Errorf("ConvertToBase64PatchedServers() = %v, want %v", result, tt.expected) + return + } + + if len(result) != len(tt.expected) { + t.Errorf("ConvertToBase64PatchedServers() length = %d, want %d", len(result), len(tt.expected)) + return + } + + for i, server := range result { + if !reflect.DeepEqual(server, tt.expected[i]) { + t.Errorf("ConvertToBase64PatchedServers() [%d] = %v, want %v", i, server, tt.expected[i]) + } + } + }) + } +} + +func TestBase64Bytes_MarshalYAML(t *testing.T) { + tests := []struct { + name string + input Base64Bytes + expected interface{} + }{ + { + name: "empty bytes", + input: Base64Bytes{}, + expected: "", + }, + { + name: "nil bytes", + input: Base64Bytes(nil), + expected: "", + }, + { + name: "simple text", + input: Base64Bytes("test"), + expected: "dGVzdA==", + }, + { + name: "special characters", + input: Base64Bytes("test@#$%"), + expected: "dGVzdEAjJCU=", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.input.MarshalYAML() + if err != nil { + t.Errorf("MarshalYAML() error = %v", err) + return + } + if result != tt.expected { + t.Errorf("MarshalYAML() = %v, want %v", result, tt.expected) + } + }) + } +} From ca6dc4be6500739067f6126d6ef0cade12f9cb2a Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 25 Sep 2025 16:30:31 +0200 Subject: [PATCH 155/422] fix(deps): update stackit sdk modules (#999) Co-authored-by: Renovate Bot Co-authored-by: Ruben Hoenle --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- internal/cmd/beta/alb/list/list.go | 4 +++- .../pkg/services/load-balancer/utils/utils.go | 4 +++- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 9b3dcc8ee..a9e301c25 100644 --- a/go.mod +++ b/go.mod @@ -16,11 +16,11 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.17.3 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 - github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.30.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 @@ -242,7 +242,7 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 diff --git a/go.sum b/go.sum index 34d386281..cc8db5fd2 100644 --- a/go.sum +++ b/go.sum @@ -563,18 +563,18 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.17.3 h1:GsZGmRRc/3GJLmCUnsZswirr5wfLRrwavbnL/renOqg= github.com/stackitcloud/stackit-sdk-go/core v0.17.3/go.mod h1:HBCXJGPgdRulplDzhrmwC+Dak9B/x0nzNtmOpu+1Ahg= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1 h1:wJC/7mkIppHTBU0awGdLEFcmnjasp43MM9gX6/gdWvA= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.6.1/go.mod h1:UyN4hlkdiK5beDi5j9xHMENxRE9A9dlIWSXO/unhQW8= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 h1:UM/HvewAgELEvZ4zk++Ykd6jUTSL+asRqtK+DszDOzE= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0/go.mod h1:mOmGoNLPXLJ5tKLnhOnhKW7wL9Giy/4DowiDZNLlQCY= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 h1:Kzr1G4g9PHI8ePFnHrHZEX06XtEJQYBK9JExje0aXl0= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1/go.mod h1:OwQ+fYpON4WQpEinvI9lCTuuwj9UBCnPPJcnDpK803U= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= -github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1 h1:hkFixFnBcQzU4BSIZFITc8N0gK0pUYk7mk0wdUu5Ki8= -github.com/stackitcloud/stackit-sdk-go/services/git v0.7.1/go.mod h1:Ng1EzrRndG3iGXGH90AZJz//wfK+2YOyDwTnTLwX3a4= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.30.0 h1:01+noyCSadNH3ALHufcVXxNs0hBsetzJkOMN1Fe0VLc= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.30.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1 h1:OdJEs8eOfrzn9tCBDLxIyP8hX50zPfcXNYnRoQX+chs= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.5.1/go.mod h1:11uzaOPCF9SeDHXEGOPMlHDD3J5r2TnvCGUwW9Igq9c= +github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 h1:/weT7P5Uwy1Qlhw0NidqtQBlbbb/dQehweDV/I9ShXg= +github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 h1:dnEjyapuv8WwRN5vE2z6+4/+ZqQTBx+bX27x2nOF7Jw= +github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1/go.mod h1:ivt8lvnAoBZsde2jSAuicyn6RgTmHvvNAJ3whaUbAD4= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIeh5XB2Ews2B9Lj5DJlMWIEJh60FfZ4Y= diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index 6df67a81a..a4d1480db 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -156,7 +156,9 @@ func outputResult(p *print.Printer, outputFormat string, items []alb.LoadBalance default: table := tables.NewTable() table.SetHeader("NAME", "EXTERNAL ADDRESS", "REGION", "STATUS", "VERSION", "ERRORS") - for _, item := range items { + for i := range items { + item := &items[i] + var errNo int if item.Errors != nil { errNo = len(*item.Errors) diff --git a/internal/pkg/services/load-balancer/utils/utils.go b/internal/pkg/services/load-balancer/utils/utils.go index 4bc13db61..1a5ba6076 100644 --- a/internal/pkg/services/load-balancer/utils/utils.go +++ b/internal/pkg/services/load-balancer/utils/utils.go @@ -159,7 +159,9 @@ func GetUsedObsCredentials(ctx context.Context, apiClient LoadBalancerClient, al } var usedCredentialsRefs []string - for _, loadBalancer := range *loadBalancers.LoadBalancers { + for i := range *loadBalancers.LoadBalancers { + loadBalancer := &(*loadBalancers.LoadBalancers)[i] + if loadBalancer.Options == nil || loadBalancer.Options.Observability == nil { continue } From 95cedde5aef762e7250c6bc1a7e5f3a525099764 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Sep 2025 08:51:56 +0200 Subject: [PATCH 156/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/authorization (#1007) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a9e301c25..e95d8cf67 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 diff --git a/go.sum b/go.sum index cc8db5fd2..61d5cc4f2 100644 --- a/go.sum +++ b/go.sum @@ -565,8 +565,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.17.3 h1:GsZGmRRc/3GJLmCUnsZswirr5 github.com/stackitcloud/stackit-sdk-go/core v0.17.3/go.mod h1:HBCXJGPgdRulplDzhrmwC+Dak9B/x0nzNtmOpu+1Ahg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 h1:UM/HvewAgELEvZ4zk++Ykd6jUTSL+asRqtK+DszDOzE= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0/go.mod h1:mOmGoNLPXLJ5tKLnhOnhKW7wL9Giy/4DowiDZNLlQCY= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1 h1:Kzr1G4g9PHI8ePFnHrHZEX06XtEJQYBK9JExje0aXl0= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.8.1/go.mod h1:OwQ+fYpON4WQpEinvI9lCTuuwj9UBCnPPJcnDpK803U= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 h1:/weT7P5Uwy1Qlhw0NidqtQBlbbb/dQehweDV/I9ShXg= From edf55a4fc5bdd2e68e7d82596fa86cba931c092a Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 30 Sep 2025 15:21:02 +0200 Subject: [PATCH 157/422] chore(deps): update renovatebot/github-action action to v43.0.14 (#1011) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 9b509bd86..f05ae9118 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.13 + uses: renovatebot/github-action@v43.0.14 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 14481e42f57b366c1310e8027c41604b75473351 Mon Sep 17 00:00:00 2001 From: Mauritz Uphoff <39736813+h3adex@users.noreply.github.com> Date: Thu, 2 Oct 2025 12:10:54 +0200 Subject: [PATCH 158/422] feat: provide functionality to list public ip-ranges (#993) Co-authored-by: Benjosh95 --- docs/stackit_public-ip.md | 1 + docs/stackit_public-ip_ranges.md | 34 +++ docs/stackit_public-ip_ranges_list.md | 47 ++++ internal/cmd/public-ip/public-ip.go | 2 + internal/cmd/public-ip/ranges/list/list.go | 149 +++++++++++++ .../cmd/public-ip/ranges/list/list_test.go | 210 ++++++++++++++++++ internal/cmd/public-ip/ranges/ranges.go | 26 +++ internal/pkg/utils/utils.go | 9 + internal/pkg/utils/utils_test.go | 46 ++++ 9 files changed, 524 insertions(+) create mode 100644 docs/stackit_public-ip_ranges.md create mode 100644 docs/stackit_public-ip_ranges_list.md create mode 100644 internal/cmd/public-ip/ranges/list/list.go create mode 100644 internal/cmd/public-ip/ranges/list/list_test.go create mode 100644 internal/cmd/public-ip/ranges/ranges.go diff --git a/docs/stackit_public-ip.md b/docs/stackit_public-ip.md index 99bfd899f..d5dcafd53 100644 --- a/docs/stackit_public-ip.md +++ b/docs/stackit_public-ip.md @@ -36,5 +36,6 @@ stackit public-ip [flags] * [stackit public-ip describe](./stackit_public-ip_describe.md) - Shows details of a Public IP * [stackit public-ip disassociate](./stackit_public-ip_disassociate.md) - Disassociates a Public IP from a network interface or a virtual IP * [stackit public-ip list](./stackit_public-ip_list.md) - Lists all Public IPs of a project +* [stackit public-ip ranges](./stackit_public-ip_ranges.md) - Provides functionality for STACKIT public-ip ranges * [stackit public-ip update](./stackit_public-ip_update.md) - Updates a Public IP diff --git a/docs/stackit_public-ip_ranges.md b/docs/stackit_public-ip_ranges.md new file mode 100644 index 000000000..025ddba9b --- /dev/null +++ b/docs/stackit_public-ip_ranges.md @@ -0,0 +1,34 @@ +## stackit public-ip ranges + +Provides functionality for STACKIT public-ip ranges + +### Synopsis + +Provides functionality for STACKIT public-ip ranges + +``` +stackit public-ip ranges [flags] +``` + +### Options + +``` + -h, --help Help for "stackit public-ip ranges" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit public-ip](./stackit_public-ip.md) - Provides functionality for public IPs +* [stackit public-ip ranges list](./stackit_public-ip_ranges_list.md) - Lists all STACKIT public-ip ranges + diff --git a/docs/stackit_public-ip_ranges_list.md b/docs/stackit_public-ip_ranges_list.md new file mode 100644 index 000000000..c152b9851 --- /dev/null +++ b/docs/stackit_public-ip_ranges_list.md @@ -0,0 +1,47 @@ +## stackit public-ip ranges list + +Lists all STACKIT public-ip ranges + +### Synopsis + +Lists all STACKIT public-ip ranges. + +``` +stackit public-ip ranges list [flags] +``` + +### Examples + +``` + Lists all STACKIT public-ip ranges + $ stackit public-ip ranges list + + Lists all STACKIT public-ip ranges, piping to a tool like fzf for interactive selection + $ stackit public-ip ranges list -o pretty | fzf + + Lists up to 10 STACKIT public-ip ranges + $ stackit public-ip ranges list --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit public-ip ranges list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit public-ip ranges](./stackit_public-ip_ranges.md) - Provides functionality for STACKIT public-ip ranges + diff --git a/internal/cmd/public-ip/public-ip.go b/internal/cmd/public-ip/public-ip.go index 3be1ac1c4..d16565288 100644 --- a/internal/cmd/public-ip/public-ip.go +++ b/internal/cmd/public-ip/public-ip.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/disassociate" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/ranges" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -35,4 +36,5 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(update.NewCmd(params)) cmd.AddCommand(associate.NewCmd(params)) cmd.AddCommand(disassociate.NewCmd(params)) + cmd.AddCommand(ranges.NewCmd(params)) } diff --git a/internal/cmd/public-ip/ranges/list/list.go b/internal/cmd/public-ip/ranges/list/list.go new file mode 100644 index 000000000..54168b448 --- /dev/null +++ b/internal/cmd/public-ip/ranges/list/list.go @@ -0,0 +1,149 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + limitFlag = "limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all STACKIT public-ip ranges", + Long: "Lists all STACKIT public-ip ranges.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Lists all STACKIT public-ip ranges`, + "$ stackit public-ip ranges list", + ), + examples.NewExample( + `Lists all STACKIT public-ip ranges, piping to a tool like fzf for interactive selection`, + "$ stackit public-ip ranges list -o pretty | fzf", + ), + examples.NewExample( + `Lists up to 10 STACKIT public-ip ranges`, + "$ stackit public-ip ranges list --limit 10", + ), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := apiClient.ListPublicIPRanges(ctx) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list public IP ranges: %w", err) + } + publicIpRanges := utils.GetSliceFromPointer(resp.Items) + + // Truncate output + if model.Limit != nil && len(publicIpRanges) > int(*model.Limit) { + publicIpRanges = publicIpRanges[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, publicIpRanges) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + if p.IsVerbosityDebug() { + modelStr, err := print.BuildDebugStrFromInputModel(model) + if err != nil { + p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) + } + } + + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, publicIpRanges []iaas.PublicNetwork) error { + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(publicIpRanges, "", " ") + if err != nil { + return fmt.Errorf("marshal public IP ranges: %w", err) + } + p.Outputln(string(details)) + + return nil + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(publicIpRanges, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal public IP ranges: %w", err) + } + p.Outputln(string(details)) + + return nil + default: + if len(publicIpRanges) == 0 { + p.Outputln("No public IP ranges found") + return nil + } + + for _, item := range publicIpRanges { + if item.Cidr != nil && *item.Cidr != "" { + p.Outputln(*item.Cidr) + } + } + + return nil + } +} diff --git a/internal/cmd/public-ip/ranges/list/list_test.go b/internal/cmd/public-ip/ranges/list/list_test.go new file mode 100644 index 000000000..f9aa0d6be --- /dev/null +++ b/internal/cmd/public-ip/ranges/list/list_test.go @@ -0,0 +1,210 @@ +package list + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +func TestParseInput(t *testing.T) { + projectId := uuid.New().String() + tests := []struct { + description string + globalFlags map[string]string + expectedModel *inputModel + isValid bool + }{ + { + description: "valid project id", + globalFlags: map[string]string{ + "project-id": projectId, + }, + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: projectId, + Verbosity: globalflags.InfoVerbosity, + }, + }, + isValid: true, + }, + { + description: "missing project id does not lead into error", + globalFlags: map[string]string{}, + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.InfoVerbosity, + }, + }, + isValid: true, + }, + { + description: "valid input with limit", + globalFlags: map[string]string{ + "limit": "10", + }, + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.InfoVerbosity, + }, + Limit: utils.Ptr(int64(10)), + }, + isValid: true, + }, + { + description: "valid input without limit", + globalFlags: map[string]string{}, + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.InfoVerbosity, + }, + }, + isValid: true, + }, + { + description: "invalid limit (zero)", + globalFlags: map[string]string{ + "limit": "0", + }, + expectedModel: nil, + isValid: false, + }, + { + description: "invalid limit (negative)", + globalFlags: map[string]string{ + "limit": "-1", + }, + expectedModel: nil, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatal(err) + } + + for flag, value := range tt.globalFlags { + if err := cmd.Flags().Set(flag, value); err != nil { + t.Fatalf("Failed to set global flag %s: %v", flag, err) + } + } + + model, err := parseInput(p, cmd) + if !tt.isValid && err == nil { + t.Fatalf("parseInput() error = %v, wantErr %v", err, !tt.isValid) + } + + if tt.isValid { + if diff := cmp.Diff(model, tt.expectedModel); diff != "" { + t.Fatalf("Model mismatch (-want +got):\n%s", diff) + } + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + name string + outputFormat string + publicIpRanges []iaas.PublicNetwork + expectedOutput string + wantErr bool + }{ + { + name: "JSON output single", + outputFormat: "json", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + }, + wantErr: false, + }, + { + name: "JSON output multiple", + outputFormat: "json", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + {Cidr: utils.Ptr("192.167.0.0/24")}, + }, + wantErr: false, + }, + { + name: "YAML output single", + outputFormat: "yaml", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + }, + wantErr: false, + }, + { + name: "YAML output multiple", + outputFormat: "yaml", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + {Cidr: utils.Ptr("192.167.0.0/24")}, + }, + wantErr: false, + }, + { + name: "pretty output single", + outputFormat: "pretty", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + }, + wantErr: false, + }, + { + name: "pretty output multiple", + outputFormat: "pretty", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + {Cidr: utils.Ptr("192.167.0.0/24")}, + }, + wantErr: false, + }, + { + name: "default output", + outputFormat: "", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: utils.Ptr("192.168.0.0/24")}, + }, + wantErr: false, + }, + { + name: "empty list", + outputFormat: "json", + publicIpRanges: []iaas.PublicNetwork{}, + wantErr: false, + }, + { + name: "nil CIDR", + outputFormat: "pretty", + publicIpRanges: []iaas.PublicNetwork{ + {Cidr: nil}, + {Cidr: utils.Ptr("192.168.0.0/24")}, + }, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + err := outputResult(p, tt.outputFormat, tt.publicIpRanges) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/public-ip/ranges/ranges.go b/internal/cmd/public-ip/ranges/ranges.go new file mode 100644 index 000000000..8d616ac5a --- /dev/null +++ b/internal/cmd/public-ip/ranges/ranges.go @@ -0,0 +1,26 @@ +package ranges + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/ranges/list" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "ranges", + Short: "Provides functionality for STACKIT public-ip ranges", + Long: "Provides functionality for STACKIT public-ip ranges", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) +} diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index 4c362fea2..2a68bc14c 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -250,3 +250,12 @@ func ConvertToBase64PatchedServers(servers []iaas.Server) []Base64PatchedServer return result } + +// GetSliceFromPointer returns the value of a pointer to a slice of type T. +// If the pointer is nil, it returns an empty slice. +func GetSliceFromPointer[T any](s *[]T) []T { + if s == nil || *s == nil { + return []T{} + } + return *s +} diff --git a/internal/pkg/utils/utils_test.go b/internal/pkg/utils/utils_test.go index 79fdbae5e..4591c84c9 100644 --- a/internal/pkg/utils/utils_test.go +++ b/internal/pkg/utils/utils_test.go @@ -544,3 +544,49 @@ func TestBase64Bytes_MarshalYAML(t *testing.T) { }) } } +func TestGetSliceFromPointer(t *testing.T) { + tests := []struct { + name string + input *[]string + expected []string + }{ + { + name: "nil pointer", + input: nil, + expected: []string{}, + }, + { + name: "pointer to nil slice", + input: func() *[]string { + var s []string + return &s + }(), + expected: []string{}, + }, + { + name: "empty slice", + input: &[]string{}, + expected: []string{}, + }, + { + name: "populated slice", + input: &[]string{"item1", "item2"}, + expected: []string{"item1", "item2"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetSliceFromPointer(tt.input) + + if result == nil { + t.Errorf("GetSliceFromPointer() = %v, want %v", result, tt.expected) + return + } + + if !reflect.DeepEqual(result, tt.expected) { + t.Errorf("GetSliceFromPointer() = %v, want %v", result, tt.expected) + } + }) + } +} From f3db2df28663f6187661f617977e006499b0b061 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 16:56:31 +0200 Subject: [PATCH 159/422] chore(deps): bump renovatebot/github-action from 43.0.14 to 43.0.15 (#1013) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 43.0.14 to 43.0.15. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v43.0.14...v43.0.15) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 43.0.15 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index f05ae9118..a3cfc0047 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.14 + uses: renovatebot/github-action@v43.0.15 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 6da7c6d706bd95946622f2db96a9cf08f9e9cffd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:57:05 +0200 Subject: [PATCH 160/422] chore(deps): bump renovatebot/github-action from 43.0.15 to 43.0.16 (#1015) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index a3cfc0047..a01117f2a 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.15 + uses: renovatebot/github-action@v43.0.16 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From f533ca87a15c99a3f56535e7460913f4358ab97e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 16:02:59 +0000 Subject: [PATCH 161/422] chore(deps): bump golang.org/x/oauth2 from 0.31.0 to 0.32.0 (#1014) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e95d8cf67..b91fab4bd 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.28.0 - golang.org/x/oauth2 v0.31.0 + golang.org/x/oauth2 v0.32.0 golang.org/x/term v0.35.0 golang.org/x/text v0.29.0 k8s.io/apimachinery v0.34.1 diff --git a/go.sum b/go.sum index 61d5cc4f2..e7b43d4eb 100644 --- a/go.sum +++ b/go.sum @@ -805,8 +805,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.31.0 h1:8Fq0yVZLh4j4YA47vHKFTa9Ew5XIrCP8LC6UeNZnLxo= -golang.org/x/oauth2 v0.31.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +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-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From e808adecd19f9ac6201adfec2920500dbce22a4f Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 9 Oct 2025 09:15:38 +0200 Subject: [PATCH 162/422] fix(deps): update module golang.org/x/text to v0.30.0 (#1020) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b91fab4bd..4fac0671c 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( golang.org/x/mod v0.28.0 golang.org/x/oauth2 v0.32.0 golang.org/x/term v0.35.0 - golang.org/x/text v0.29.0 + golang.org/x/text v0.30.0 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 ) diff --git a/go.sum b/go.sum index e7b43d4eb..bf4df58b6 100644 --- a/go.sum +++ b/go.sum @@ -901,8 +901,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 5532b96fc1bfe4b48dce79e8f5a45580db7b7d1c Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 9 Oct 2025 09:24:03 +0200 Subject: [PATCH 163/422] fix(deps): update module golang.org/x/mod to v0.29.0 (#1018) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4fac0671c..a0b8e6145 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.28.0 + golang.org/x/mod v0.29.0 golang.org/x/oauth2 v0.32.0 golang.org/x/term v0.35.0 golang.org/x/text v0.30.0 diff --git a/go.sum b/go.sum index bf4df58b6..6f9d0195b 100644 --- a/go.sum +++ b/go.sum @@ -755,8 +755,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= -golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 09b87c3ee44c7559e80865082fe7b9c1f26a03a1 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 9 Oct 2025 09:47:55 +0200 Subject: [PATCH 164/422] fix(deps): update module golang.org/x/term to v0.36.0 (#1019) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index a0b8e6145..b4802b9b4 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.29.0 golang.org/x/oauth2 v0.32.0 - golang.org/x/term v0.35.0 + golang.org/x/term v0.36.0 golang.org/x/text v0.30.0 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 @@ -251,7 +251,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.36.0 // indirect + golang.org/x/sys v0.37.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index 6f9d0195b..521fe8021 100644 --- a/go.sum +++ b/go.sum @@ -875,8 +875,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -887,8 +887,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From e687b716437db50c39f9cf7d0feaafac55506bc2 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 9 Oct 2025 09:55:23 +0200 Subject: [PATCH 165/422] chore(deps): update module golang.org/x/tools to v0.38.0 (#1017) Co-authored-by: Renovate Bot --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index b4802b9b4..0baf2a99d 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( ) require ( - golang.org/x/net v0.44.0 // indirect + golang.org/x/net v0.46.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -209,8 +209,8 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.17.0 // indirect - golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 // indirect - golang.org/x/tools v0.37.0 // indirect + golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect + golang.org/x/tools v0.38.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/protobuf v1.36.6 // indirect diff --git a/go.sum b/go.sum index 521fe8021..613c93ed9 100644 --- a/go.sum +++ b/go.sum @@ -797,8 +797,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -877,8 +877,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= -golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -966,8 +966,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= -golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= From b42533e01a29f6dfdeb04f69f5bcc4dcf4e5f787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 9 Oct 2025 10:58:38 +0200 Subject: [PATCH 166/422] refactor: use a func to print input model debug output (#1016) --- .github/docs/contribution-guide/cmd.go | 10 +--------- CONTRIBUTION.md | 4 ++-- internal/cmd/affinity-groups/create/create.go | 10 +--------- internal/cmd/affinity-groups/delete/delete.go | 10 +--------- internal/cmd/affinity-groups/describe/describe.go | 10 +--------- internal/cmd/affinity-groups/list/list.go | 10 +--------- .../activate_service_account.go | 10 +--------- .../cmd/auth/get-access-token/get_access_token.go | 10 +--------- internal/cmd/beta/alb/create/create.go | 10 +--------- internal/cmd/beta/alb/delete/delete.go | 10 +--------- internal/cmd/beta/alb/describe/describe.go | 10 +--------- internal/cmd/beta/alb/list/list.go | 10 +--------- .../beta/alb/observability-credentials/add/add.go | 10 +--------- .../alb/observability-credentials/delete/delete.go | 10 +--------- .../observability-credentials/describe/describe.go | 10 +--------- .../alb/observability-credentials/list/list.go | 10 +--------- .../alb/observability-credentials/update/update.go | 10 +--------- internal/cmd/beta/alb/plans/plans.go | 10 +--------- internal/cmd/beta/alb/pool/update/update.go | 10 +--------- internal/cmd/beta/alb/quotas/quotas.go | 10 +--------- internal/cmd/beta/alb/template/template.go | 10 +--------- internal/cmd/beta/alb/update/update.go | 10 +--------- .../beta/sqlserverflex/database/create/create.go | 10 +--------- .../beta/sqlserverflex/database/delete/delete.go | 10 +--------- .../sqlserverflex/database/describe/describe.go | 10 +--------- .../cmd/beta/sqlserverflex/database/list/list.go | 10 +--------- .../beta/sqlserverflex/instance/create/create.go | 10 +--------- .../beta/sqlserverflex/instance/delete/delete.go | 10 +--------- .../sqlserverflex/instance/describe/describe.go | 10 +--------- .../cmd/beta/sqlserverflex/instance/list/list.go | 10 +--------- .../beta/sqlserverflex/instance/update/update.go | 10 +--------- internal/cmd/beta/sqlserverflex/options/options.go | 10 +--------- .../cmd/beta/sqlserverflex/user/create/create.go | 10 +--------- .../cmd/beta/sqlserverflex/user/delete/delete.go | 10 +--------- .../beta/sqlserverflex/user/describe/describe.go | 10 +--------- internal/cmd/beta/sqlserverflex/user/list/list.go | 10 +--------- .../user/reset-password/reset_password.go | 10 +--------- internal/cmd/config/profile/create/create.go | 10 +--------- internal/cmd/config/profile/delete/delete.go | 10 +--------- internal/cmd/config/profile/export/export.go | 10 +--------- internal/cmd/config/profile/import/import.go | 10 +--------- internal/cmd/config/profile/set/set.go | 10 +--------- internal/cmd/config/set/set.go | 10 +--------- internal/cmd/config/unset/unset.go | 10 +--------- internal/cmd/curl/curl.go | 10 +--------- internal/cmd/dns/record-set/create/create.go | 10 +--------- internal/cmd/dns/record-set/delete/delete.go | 10 +--------- internal/cmd/dns/record-set/describe/describe.go | 10 +--------- internal/cmd/dns/record-set/list/list.go | 10 +--------- internal/cmd/dns/record-set/update/update.go | 10 +--------- internal/cmd/dns/zone/clone/clone.go | 10 +--------- internal/cmd/dns/zone/create/create.go | 10 +--------- internal/cmd/dns/zone/delete/delete.go | 10 +--------- internal/cmd/dns/zone/describe/describe.go | 10 +--------- internal/cmd/dns/zone/list/list.go | 10 +--------- internal/cmd/dns/zone/update/update.go | 10 +--------- internal/cmd/git/flavor/list/list.go | 10 +--------- internal/cmd/git/instance/create/create.go | 10 +--------- internal/cmd/git/instance/delete/delete.go | 10 +--------- internal/cmd/git/instance/describe/describe.go | 10 +--------- internal/cmd/git/instance/list/list.go | 10 +--------- internal/cmd/image/create/create.go | 10 +--------- internal/cmd/image/delete/delete.go | 10 +--------- internal/cmd/image/describe/describe.go | 10 +--------- internal/cmd/image/list/list.go | 10 +--------- internal/cmd/image/update/update.go | 10 +--------- internal/cmd/key-pair/create/create.go | 10 +--------- internal/cmd/key-pair/delete/delete.go | 10 +--------- internal/cmd/key-pair/describe/describe.go | 10 +--------- internal/cmd/key-pair/list/list.go | 10 +--------- internal/cmd/key-pair/update/update.go | 10 +--------- internal/cmd/load-balancer/create/create.go | 10 +--------- internal/cmd/load-balancer/delete/delete.go | 10 +--------- internal/cmd/load-balancer/describe/describe.go | 10 +--------- .../generate-payload/generate_payload.go | 10 +--------- internal/cmd/load-balancer/list/list.go | 10 +--------- .../observability-credentials/add/add.go | 10 +--------- .../observability-credentials/cleanup/cleanup.go | 10 +--------- .../observability-credentials/delete/delete.go | 10 +--------- .../observability-credentials/describe/describe.go | 10 +--------- .../observability-credentials/list/list.go | 10 +--------- internal/cmd/load-balancer/quota/quota.go | 10 +--------- .../target-pool/add-target/add_target.go | 10 +--------- .../load-balancer/target-pool/describe/describe.go | 10 +--------- .../target-pool/remove-target/remove_target.go | 10 +--------- internal/cmd/load-balancer/update/update.go | 10 +--------- internal/cmd/logme/credentials/create/create.go | 10 +--------- internal/cmd/logme/credentials/delete/delete.go | 10 +--------- .../cmd/logme/credentials/describe/describe.go | 10 +--------- internal/cmd/logme/credentials/list/list.go | 10 +--------- internal/cmd/logme/instance/create/create.go | 10 +--------- internal/cmd/logme/instance/delete/delete.go | 10 +--------- internal/cmd/logme/instance/describe/describe.go | 10 +--------- internal/cmd/logme/instance/list/list.go | 10 +--------- internal/cmd/logme/instance/update/update.go | 10 +--------- internal/cmd/logme/plans/plans.go | 10 +--------- internal/cmd/mariadb/credentials/create/create.go | 10 +--------- internal/cmd/mariadb/credentials/delete/delete.go | 10 +--------- .../cmd/mariadb/credentials/describe/describe.go | 10 +--------- internal/cmd/mariadb/credentials/list/list.go | 10 +--------- internal/cmd/mariadb/instance/create/create.go | 10 +--------- internal/cmd/mariadb/instance/delete/delete.go | 10 +--------- internal/cmd/mariadb/instance/describe/describe.go | 10 +--------- internal/cmd/mariadb/instance/list/list.go | 10 +--------- internal/cmd/mariadb/instance/update/update.go | 10 +--------- internal/cmd/mariadb/plans/plans.go | 10 +--------- .../cmd/mongodbflex/backup/describe/describe.go | 10 +--------- internal/cmd/mongodbflex/backup/list/list.go | 10 +--------- .../backup/restore-jobs/restore_jobs.go | 10 +--------- internal/cmd/mongodbflex/backup/restore/restore.go | 10 +--------- .../cmd/mongodbflex/backup/schedule/schedule.go | 10 +--------- internal/cmd/mongodbflex/instance/create/create.go | 10 +--------- internal/cmd/mongodbflex/instance/delete/delete.go | 10 +--------- .../cmd/mongodbflex/instance/describe/describe.go | 10 +--------- internal/cmd/mongodbflex/instance/list/list.go | 10 +--------- internal/cmd/mongodbflex/instance/update/update.go | 10 +--------- internal/cmd/mongodbflex/options/options.go | 10 +--------- internal/cmd/mongodbflex/user/create/create.go | 10 +--------- internal/cmd/mongodbflex/user/delete/delete.go | 10 +--------- internal/cmd/mongodbflex/user/describe/describe.go | 10 +--------- internal/cmd/mongodbflex/user/list/list.go | 10 +--------- .../user/reset-password/reset_password.go | 10 +--------- internal/cmd/mongodbflex/user/update/update.go | 10 +--------- internal/cmd/network-area/create/create.go | 10 +--------- internal/cmd/network-area/delete/delete.go | 10 +--------- internal/cmd/network-area/describe/describe.go | 10 +--------- internal/cmd/network-area/list/list.go | 10 +--------- .../network-area/network-range/create/create.go | 10 +--------- .../network-area/network-range/delete/delete.go | 10 +--------- .../network-range/describe/describe.go | 10 +--------- .../cmd/network-area/network-range/list/list.go | 10 +--------- internal/cmd/network-area/route/create/create.go | 10 +--------- internal/cmd/network-area/route/delete/delete.go | 10 +--------- .../cmd/network-area/route/describe/describe.go | 10 +--------- internal/cmd/network-area/route/list/list.go | 10 +--------- internal/cmd/network-area/route/update/update.go | 10 +--------- internal/cmd/network-area/update/update.go | 10 +--------- internal/cmd/network-interface/create/create.go | 10 +--------- internal/cmd/network-interface/delete/delete.go | 10 +--------- .../cmd/network-interface/describe/describe.go | 10 +--------- internal/cmd/network-interface/list/list.go | 10 +--------- internal/cmd/network-interface/update/update.go | 10 +--------- internal/cmd/network/create/create.go | 10 +--------- internal/cmd/network/delete/delete.go | 10 +--------- internal/cmd/network/describe/describe.go | 10 +--------- internal/cmd/network/list/list.go | 10 +--------- internal/cmd/network/update/update.go | 10 +--------- .../cmd/object-storage/bucket/create/create.go | 10 +--------- .../cmd/object-storage/bucket/delete/delete.go | 10 +--------- .../cmd/object-storage/bucket/describe/describe.go | 10 +--------- internal/cmd/object-storage/bucket/list/list.go | 10 +--------- .../credentials-group/create/create.go | 10 +--------- .../credentials-group/delete/delete.go | 10 +--------- .../object-storage/credentials-group/list/list.go | 10 +--------- .../object-storage/credentials/create/create.go | 10 +--------- .../object-storage/credentials/delete/delete.go | 10 +--------- .../cmd/object-storage/credentials/list/list.go | 10 +--------- internal/cmd/object-storage/disable/disable.go | 10 +--------- internal/cmd/object-storage/enable/enable.go | 10 +--------- .../cmd/observability/grafana/describe/describe.go | 10 +--------- .../grafana/public-read-access/disable/disable.go | 10 +--------- .../grafana/public-read-access/enable/enable.go | 10 +--------- .../grafana/single-sign-on/disable/disable.go | 10 +--------- .../grafana/single-sign-on/enable/enable.go | 10 +--------- .../cmd/observability/instance/create/create.go | 10 +--------- .../cmd/observability/instance/delete/delete.go | 10 +--------- .../observability/instance/describe/describe.go | 10 +--------- internal/cmd/observability/instance/list/list.go | 10 +--------- .../cmd/observability/instance/update/update.go | 10 +--------- internal/cmd/observability/plans/plans.go | 10 +--------- .../cmd/opensearch/credentials/create/create.go | 10 +--------- .../cmd/opensearch/credentials/delete/delete.go | 10 +--------- .../opensearch/credentials/describe/describe.go | 10 +--------- internal/cmd/opensearch/credentials/list/list.go | 10 +--------- internal/cmd/opensearch/instance/create/create.go | 10 +--------- internal/cmd/opensearch/instance/delete/delete.go | 10 +--------- .../cmd/opensearch/instance/describe/describe.go | 10 +--------- internal/cmd/opensearch/instance/list/list.go | 10 +--------- internal/cmd/opensearch/instance/update/update.go | 10 +--------- internal/cmd/opensearch/plans/plans.go | 10 +--------- internal/cmd/organization/member/add/add.go | 10 +--------- internal/cmd/organization/member/list/list.go | 10 +--------- internal/cmd/organization/member/remove/remove.go | 10 +--------- internal/cmd/organization/role/list/list.go | 10 +--------- internal/cmd/postgresflex/instance/clone/clone.go | 10 +--------- .../cmd/postgresflex/instance/create/create.go | 10 +--------- .../cmd/postgresflex/instance/delete/delete.go | 10 +--------- .../cmd/postgresflex/instance/describe/describe.go | 10 +--------- internal/cmd/postgresflex/instance/list/list.go | 10 +--------- .../cmd/postgresflex/instance/update/update.go | 10 +--------- internal/cmd/postgresflex/options/options.go | 10 +--------- internal/cmd/postgresflex/user/create/create.go | 10 +--------- internal/cmd/postgresflex/user/delete/delete.go | 10 +--------- .../cmd/postgresflex/user/describe/describe.go | 10 +--------- internal/cmd/postgresflex/user/list/list.go | 10 +--------- .../user/reset-password/reset_password.go | 10 +--------- internal/cmd/postgresflex/user/update/update.go | 10 +--------- internal/cmd/project/create/create.go | 10 +--------- internal/cmd/project/delete/delete.go | 10 +--------- internal/cmd/project/describe/describe.go | 10 +--------- internal/cmd/project/list/list.go | 10 +--------- internal/cmd/project/member/add/add.go | 10 +--------- internal/cmd/project/member/list/list.go | 10 +--------- internal/cmd/project/member/remove/remove.go | 10 +--------- internal/cmd/project/role/list/list.go | 10 +--------- internal/cmd/project/update/update.go | 10 +--------- internal/cmd/public-ip/associate/associate.go | 10 +--------- internal/cmd/public-ip/create/create.go | 10 +--------- internal/cmd/public-ip/delete/delete.go | 10 +--------- internal/cmd/public-ip/describe/describe.go | 10 +--------- .../cmd/public-ip/disassociate/disassociate.go | 10 +--------- internal/cmd/public-ip/list/list.go | 10 +--------- internal/cmd/public-ip/ranges/list/list.go | 10 +--------- internal/cmd/public-ip/update/update.go | 10 +--------- internal/cmd/quota/list/list.go | 10 +--------- internal/cmd/rabbitmq/credentials/create/create.go | 10 +--------- internal/cmd/rabbitmq/credentials/delete/delete.go | 10 +--------- .../cmd/rabbitmq/credentials/describe/describe.go | 10 +--------- internal/cmd/rabbitmq/credentials/list/list.go | 10 +--------- internal/cmd/rabbitmq/instance/create/create.go | 10 +--------- internal/cmd/rabbitmq/instance/delete/delete.go | 10 +--------- .../cmd/rabbitmq/instance/describe/describe.go | 10 +--------- internal/cmd/rabbitmq/instance/list/list.go | 10 +--------- internal/cmd/rabbitmq/instance/update/update.go | 10 +--------- internal/cmd/rabbitmq/plans/plans.go | 10 +--------- internal/cmd/redis/credentials/create/create.go | 10 +--------- internal/cmd/redis/credentials/delete/delete.go | 10 +--------- .../cmd/redis/credentials/describe/describe.go | 10 +--------- internal/cmd/redis/credentials/list/list.go | 10 +--------- internal/cmd/redis/instance/create/create.go | 10 +--------- internal/cmd/redis/instance/delete/delete.go | 10 +--------- internal/cmd/redis/instance/describe/describe.go | 10 +--------- internal/cmd/redis/instance/list/list.go | 10 +--------- internal/cmd/redis/instance/update/update.go | 10 +--------- internal/cmd/redis/plans/plans.go | 10 +--------- .../cmd/secrets-manager/instance/create/create.go | 10 +--------- .../cmd/secrets-manager/instance/delete/delete.go | 10 +--------- .../secrets-manager/instance/describe/describe.go | 10 +--------- internal/cmd/secrets-manager/instance/list/list.go | 10 +--------- .../cmd/secrets-manager/instance/update/update.go | 10 +--------- internal/cmd/secrets-manager/user/create/create.go | 10 +--------- internal/cmd/secrets-manager/user/delete/delete.go | 10 +--------- .../cmd/secrets-manager/user/describe/describe.go | 10 +--------- internal/cmd/secrets-manager/user/list/list.go | 10 +--------- internal/cmd/secrets-manager/user/update/update.go | 10 +--------- internal/cmd/security-group/create/create.go | 10 +--------- internal/cmd/security-group/delete/delete.go | 10 +--------- internal/cmd/security-group/describe/describe.go | 10 +--------- internal/cmd/security-group/list/list.go | 10 +--------- internal/cmd/security-group/rule/create/create.go | 10 +--------- internal/cmd/security-group/rule/delete/delete.go | 10 +--------- .../cmd/security-group/rule/describe/describe.go | 10 +--------- internal/cmd/security-group/rule/list/list.go | 10 +--------- internal/cmd/security-group/update/update.go | 10 +--------- internal/cmd/server/backup/create/create.go | 10 +--------- internal/cmd/server/backup/delete/delete.go | 10 +--------- internal/cmd/server/backup/describe/describe.go | 10 +--------- internal/cmd/server/backup/disable/disable.go | 10 +--------- internal/cmd/server/backup/enable/enable.go | 10 +--------- internal/cmd/server/backup/list/list.go | 10 +--------- internal/cmd/server/backup/restore/restore.go | 10 +--------- .../cmd/server/backup/schedule/create/create.go | 10 +--------- .../cmd/server/backup/schedule/delete/delete.go | 10 +--------- .../server/backup/schedule/describe/describe.go | 10 +--------- internal/cmd/server/backup/schedule/list/list.go | 10 +--------- .../cmd/server/backup/schedule/update/update.go | 10 +--------- .../server/backup/volume-backup/delete/delete.go | 10 +--------- .../server/backup/volume-backup/restore/restore.go | 10 +--------- internal/cmd/server/command/create/create.go | 10 +--------- internal/cmd/server/command/describe/describe.go | 10 +--------- internal/cmd/server/command/list/list.go | 10 +--------- .../server/command/template/describe/describe.go | 10 +--------- internal/cmd/server/command/template/list/list.go | 10 +--------- internal/cmd/server/console/console.go | 10 +--------- internal/cmd/server/create/create.go | 10 +--------- internal/cmd/server/deallocate/deallocate.go | 10 +--------- internal/cmd/server/delete/delete.go | 10 +--------- internal/cmd/server/describe/describe.go | 10 +--------- internal/cmd/server/list/list.go | 10 +--------- internal/cmd/server/log/log.go | 10 +--------- .../cmd/server/machine-type/describe/describe.go | 10 +--------- internal/cmd/server/machine-type/list/list.go | 10 +--------- .../cmd/server/network-interface/attach/attach.go | 10 +--------- .../cmd/server/network-interface/detach/detach.go | 10 +--------- internal/cmd/server/network-interface/list/list.go | 10 +--------- internal/cmd/server/os-update/create/create.go | 10 +--------- internal/cmd/server/os-update/describe/describe.go | 10 +--------- internal/cmd/server/os-update/disable/disable.go | 10 +--------- internal/cmd/server/os-update/enable/enable.go | 10 +--------- internal/cmd/server/os-update/list/list.go | 10 +--------- .../cmd/server/os-update/schedule/create/create.go | 10 +--------- .../cmd/server/os-update/schedule/delete/delete.go | 10 +--------- .../server/os-update/schedule/describe/describe.go | 10 +--------- .../cmd/server/os-update/schedule/list/list.go | 10 +--------- .../cmd/server/os-update/schedule/update/update.go | 10 +--------- internal/cmd/server/public-ip/attach/attach.go | 10 +--------- internal/cmd/server/public-ip/detach/detach.go | 10 +--------- internal/cmd/server/reboot/reboot.go | 10 +--------- internal/cmd/server/rescue/rescue.go | 10 +--------- internal/cmd/server/resize/resize.go | 10 +--------- .../cmd/server/service-account/attach/attach.go | 10 +--------- .../cmd/server/service-account/detach/detach.go | 10 +--------- internal/cmd/server/service-account/list/list.go | 10 +--------- internal/cmd/server/start/start.go | 10 +--------- internal/cmd/server/stop/stop.go | 10 +--------- internal/cmd/server/unrescue/unrescue.go | 10 +--------- internal/cmd/server/update/update.go | 10 +--------- internal/cmd/server/volume/attach/attach.go | 10 +--------- internal/cmd/server/volume/describe/describe.go | 10 +--------- internal/cmd/server/volume/detach/detach.go | 10 +--------- internal/cmd/server/volume/list/list.go | 10 +--------- internal/cmd/server/volume/update/update.go | 10 +--------- internal/cmd/service-account/create/create.go | 10 +--------- internal/cmd/service-account/delete/delete.go | 10 +--------- internal/cmd/service-account/get-jwks/get_jwks.go | 10 +--------- internal/cmd/service-account/key/create/create.go | 10 +--------- internal/cmd/service-account/key/delete/delete.go | 10 +--------- .../cmd/service-account/key/describe/describe.go | 10 +--------- internal/cmd/service-account/key/list/list.go | 10 +--------- internal/cmd/service-account/key/update/update.go | 10 +--------- internal/cmd/service-account/list/list.go | 10 +--------- .../cmd/service-account/token/create/create.go | 10 +--------- internal/cmd/service-account/token/list/list.go | 10 +--------- .../cmd/service-account/token/revoke/revoke.go | 10 +--------- internal/cmd/ske/cluster/create/create.go | 10 +--------- internal/cmd/ske/cluster/delete/delete.go | 10 +--------- internal/cmd/ske/cluster/describe/describe.go | 10 +--------- .../cluster/generate-payload/generate_payload.go | 10 +--------- internal/cmd/ske/cluster/hibernate/hibernate.go | 10 +--------- internal/cmd/ske/cluster/list/list.go | 10 +--------- .../cmd/ske/cluster/maintenance/maintenance.go | 10 +--------- internal/cmd/ske/cluster/reconcile/reconcile.go | 10 +--------- internal/cmd/ske/cluster/update/update.go | 10 +--------- internal/cmd/ske/cluster/wakeup/wakeup.go | 10 +--------- .../complete-rotation/complete_rotation.go | 10 +--------- .../credentials/start-rotation/start_rotation.go | 10 +--------- internal/cmd/ske/describe/describe.go | 10 +--------- internal/cmd/ske/disable/disable.go | 10 +--------- internal/cmd/ske/enable/enable.go | 10 +--------- internal/cmd/ske/kubeconfig/create/create.go | 10 +--------- internal/cmd/ske/options/options.go | 10 +--------- internal/cmd/volume/backup/create/create.go | 10 +--------- internal/cmd/volume/backup/delete/delete.go | 10 +--------- internal/cmd/volume/backup/describe/describe.go | 10 +--------- internal/cmd/volume/backup/list/list.go | 10 +--------- internal/cmd/volume/backup/restore/restore.go | 10 +--------- internal/cmd/volume/backup/update/update.go | 10 +--------- internal/cmd/volume/create/create.go | 10 +--------- internal/cmd/volume/delete/delete.go | 10 +--------- internal/cmd/volume/describe/describe.go | 10 +--------- internal/cmd/volume/list/list.go | 10 +--------- .../volume/performance-class/describe/describe.go | 10 +--------- internal/cmd/volume/performance-class/list/list.go | 10 +--------- internal/cmd/volume/resize/resize.go | 10 +--------- internal/cmd/volume/snapshot/create/create.go | 10 +--------- internal/cmd/volume/snapshot/delete/delete.go | 10 +--------- internal/cmd/volume/snapshot/describe/describe.go | 10 +--------- internal/cmd/volume/snapshot/list/list.go | 10 +--------- internal/cmd/volume/snapshot/update/update.go | 10 +--------- internal/cmd/volume/update/update.go | 10 +--------- internal/pkg/print/debug.go | 4 ++-- internal/pkg/print/debug_test.go | 2 +- internal/pkg/print/print.go | 14 +++++++++++++- 363 files changed, 377 insertions(+), 3237 deletions(-) diff --git a/.github/docs/contribution-guide/cmd.go b/.github/docs/contribution-guide/cmd.go index 175a9a6d3..286d6240d 100644 --- a/.github/docs/contribution-guide/cmd.go +++ b/.github/docs/contribution-guide/cmd.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } // Write the input model to the debug logs - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index 21a668d8c..47d79abda 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -53,7 +53,7 @@ Please remember to run `make generate-docs` after your changes to keep the comma Below is a typical structure of a CLI command: -https://github.com/stackitcloud/stackit-cli/blob/85ce44cd18d11169f2548d8657031b5fc6f94740/.github/docs/contribution-guide/cmd.go#L23-L156 +https://github.com/stackitcloud/stackit-cli/blob/main/.github/docs/contribution-guide/cmd.go Please remember to always add unit tests for `parseInput`, `buildRequest` (in `bar_test.go`), and any other util functions used. @@ -87,7 +87,7 @@ If you want to add a command that uses a STACKIT service `foo` that was not yet 1. This is done in `internal/pkg/services/foo/client/client.go` 2. Below is an example of a typical `client.go` file structure: -https://github.com/stackitcloud/stackit-cli/blob/85ce44cd18d11169f2548d8657031b5fc6f94740/.github/docs/contribution-guide/client.go#L12-L35 +https://github.com/stackitcloud/stackit-cli/blob/main/.github/docs/contribution-guide/client.go ### Local development diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index 60b14fdd1..03a4354f9 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -112,15 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Policy: flags.FlagToStringValue(p, cmd, policyFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index a05c2e7bc..59532f96d 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -101,14 +101,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM AffinityGroupId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 6abd3980c..936db9605 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -84,15 +84,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM AffinityGroupId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 5665a970c..58269d898 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/auth/activate-service-account/activate_service_account.go b/internal/cmd/auth/activate-service-account/activate_service_account.go index 5ddc73f29..1246dcd98 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account.go @@ -121,15 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { OnlyPrintAccessToken: flags.FlagToBoolValue(p, cmd, onlyPrintAccessTokenFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model } diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 39bb3be7d..8db52f60e 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -77,14 +77,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index 2622a3ce4..a9113a5f0 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -118,15 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Configuration: flags.FlagToStringPointer(p, cmd, configurationFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/delete/delete.go b/internal/cmd/beta/alb/delete/delete.go index 25886cd40..d7dfe1c50 100644 --- a/internal/cmd/beta/alb/delete/delete.go +++ b/internal/cmd/beta/alb/delete/delete.go @@ -87,15 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Name: loadbalancerName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/describe/describe.go b/internal/cmd/beta/alb/describe/describe.go index 67a10bf4a..8d61212a3 100644 --- a/internal/cmd/beta/alb/describe/describe.go +++ b/internal/cmd/beta/alb/describe/describe.go @@ -81,15 +81,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Name: loadbalancerName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index a4d1480db..7958a1ad8 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -118,15 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index 86b6ac2b9..7b623ef16 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -96,15 +96,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Password: flags.FlagToStringPointer(p, cmd, passwordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string fo debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete.go b/internal/cmd/beta/alb/observability-credentials/delete/delete.go index ccf998580..8270d4df0 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete.go @@ -82,15 +82,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsRef: credentialRef, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe.go b/internal/cmd/beta/alb/observability-credentials/describe/describe.go index 001e20278..882ac0a02 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe.go @@ -80,15 +80,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialRef: credentialRef, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index 32baa31c6..613ba9c24 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -108,15 +108,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.InfoLevel, modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/observability-credentials/update/update.go b/internal/cmd/beta/alb/observability-credentials/update/update.go index 18b68ccb4..e9ff003e8 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) inputM Password: flags.FlagToStringPointer(p, cmd, passwordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return model } diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index d131422ad..b6698ce2e 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -90,15 +90,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index 2dc8cd3a2..857ae2a44 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { AlbName: flags.FlagToStringPointer(p, cmd, albNameFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index c0ce6948b..3eec45f7d 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -82,15 +82,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/template/template.go b/internal/cmd/beta/alb/template/template.go index c33ca2846..c1dad5350 100644 --- a/internal/cmd/beta/alb/template/template.go +++ b/internal/cmd/beta/alb/template/template.go @@ -112,14 +112,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Type: flags.FlagToStringPointer(p, cmd, typeFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 2dcfddbb1..6040762a5 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Configuration: flags.FlagToStringPointer(p, cmd, configurationFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index f8ae03ccd..d643d8da7 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Owner: flags.FlagToStringValue(p, cmd, ownerFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index 0f2b221f7..bc19533dc 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -104,15 +104,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index 377d90476..7c460f3e5 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -93,15 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index 707922ef9..f8675f0b9 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -120,15 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index b30d7615c..4b31bef84 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -196,15 +196,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { RetentionDays: flags.FlagToInt64Pointer(p, cmd, retentionDaysFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index ab1742879..0fcd25dd5 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go index d8e3a60c3..bed2f269c 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go @@ -82,15 +82,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 945eb5024..3b97b8dcb 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index c857aba35..68e76cf25 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -183,15 +183,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index d5d62c10b..f288fd27d 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -190,15 +190,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 7cd803ec7..92e4a1127 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Roles: flags.FlagToStringSlicePointer(p, cmd, rolesFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete.go b/internal/cmd/beta/sqlserverflex/user/delete/delete.go index 8250b1b01..31869cdda 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe.go b/internal/cmd/beta/sqlserverflex/user/describe/describe.go index 1d94890ac..cd4efd01b 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe.go @@ -102,15 +102,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index c45317bf2..022aade17 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -121,15 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index 35ef24063..027ba4b44 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/config/profile/create/create.go b/internal/cmd/config/profile/create/create.go index 4d93bdd72..608fe85da 100644 --- a/internal/cmd/config/profile/create/create.go +++ b/internal/cmd/config/profile/create/create.go @@ -105,14 +105,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NoSet: flags.FlagToBoolValue(p, cmd, noSetFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/config/profile/delete/delete.go b/internal/cmd/config/profile/delete/delete.go index 02c04e64a..98b7bf2e2 100644 --- a/internal/cmd/config/profile/delete/delete.go +++ b/internal/cmd/config/profile/delete/delete.go @@ -106,14 +106,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Profile: profile, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/config/profile/export/export.go b/internal/cmd/config/profile/export/export.go index 59389b47a..9051ea368 100644 --- a/internal/cmd/config/profile/export/export.go +++ b/internal/cmd/config/profile/export/export.go @@ -85,14 +85,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model.FilePath = filepath.Join(model.FilePath, exportFileName) } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/config/profile/import/import.go b/internal/cmd/config/profile/import/import.go index 84bd9b3aa..82f8229dd 100644 --- a/internal/cmd/config/profile/import/import.go +++ b/internal/cmd/config/profile/import/import.go @@ -94,14 +94,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return model, nil } diff --git a/internal/cmd/config/profile/set/set.go b/internal/cmd/config/profile/set/set.go index 0784d4654..77101092f 100644 --- a/internal/cmd/config/profile/set/set.go +++ b/internal/cmd/config/profile/set/set.go @@ -90,14 +90,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Profile: profile, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index 54f9f527d..841f8e66e 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -246,15 +246,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ProjectIdSet: projectIdSet, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index a288be6a3..e7b6fd6fa 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -294,14 +294,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { TokenCustomEndpoint: flags.FlagToBoolValue(p, cmd, tokenCustomEndpointFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model } diff --git a/internal/cmd/curl/curl.go b/internal/cmd/curl/curl.go index afe797a28..57e823f26 100644 --- a/internal/cmd/curl/curl.go +++ b/internal/cmd/curl/curl.go @@ -154,15 +154,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu OutputFile: flags.FlagToStringPointer(p, cmd, outputFileFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 045f6ce29..c1fae768e 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -157,15 +157,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/record-set/delete/delete.go b/internal/cmd/dns/record-set/delete/delete.go index 015b8019d..4dde11375 100644 --- a/internal/cmd/dns/record-set/delete/delete.go +++ b/internal/cmd/dns/record-set/delete/delete.go @@ -131,15 +131,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu RecordSetId: recordSetId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/record-set/describe/describe.go b/internal/cmd/dns/record-set/describe/describe.go index c7d5e8c52..ceaf1a9d9 100644 --- a/internal/cmd/dns/record-set/describe/describe.go +++ b/internal/cmd/dns/record-set/describe/describe.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu RecordSetId: recordSetId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index a1b59553b..cafaf9921 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -165,15 +165,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { PageSize: pageSize, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/record-set/update/update.go b/internal/cmd/dns/record-set/update/update.go index 74630d455..62f01376f 100644 --- a/internal/cmd/dns/record-set/update/update.go +++ b/internal/cmd/dns/record-set/update/update.go @@ -169,15 +169,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu TTL: ttl, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index 7d81f13f8..c8292c59f 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -137,15 +137,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ZoneId: zoneId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index 081602f18..ebcbc273e 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -175,15 +175,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ContactEmail: flags.FlagToStringPointer(p, cmd, contactEmailFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/zone/delete/delete.go b/internal/cmd/dns/zone/delete/delete.go index 443bbf186..a3c8ce8dc 100644 --- a/internal/cmd/dns/zone/delete/delete.go +++ b/internal/cmd/dns/zone/delete/delete.go @@ -110,15 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ZoneId: zoneId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/zone/describe/describe.go b/internal/cmd/dns/zone/describe/describe.go index d68bbb177..0caf4ab55 100644 --- a/internal/cmd/dns/zone/describe/describe.go +++ b/internal/cmd/dns/zone/describe/describe.go @@ -82,15 +82,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ZoneId: zoneId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index c3de2d640..c61e58e3f 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -156,15 +156,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { PageSize: pageSize, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/dns/zone/update/update.go b/internal/cmd/dns/zone/update/update.go index d7575c609..161b0e338 100644 --- a/internal/cmd/dns/zone/update/update.go +++ b/internal/cmd/dns/zone/update/update.go @@ -176,15 +176,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ContactEmail: contactEmail, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index aec140d80..c562a6b67 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -104,15 +104,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index 761c2be61..15a46c1fc 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -130,15 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Acl: acl, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/git/instance/delete/delete.go b/internal/cmd/git/instance/delete/delete.go index c16a6b09e..01f6f3f19 100644 --- a/internal/cmd/git/instance/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -116,15 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM InstanceId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/git/instance/describe/describe.go b/internal/cmd/git/instance/describe/describe.go index 8e2f266e1..08d9611ae 100644 --- a/internal/cmd/git/instance/describe/describe.go +++ b/internal/cmd/git/instance/describe/describe.go @@ -79,15 +79,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM InstanceId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index 0057342ff..f0dd2d07b 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -105,15 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 3ffe26a68..fbfe766aa 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -329,15 +329,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Protected: flags.FlagToBoolPointer(p, cmd, protectedFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index 10a49e46d..80f7f2dc8 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -93,15 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM ImageId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index 9a5e5e918..0a8af40bb 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -84,15 +84,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM ImageId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index 57280b383..cb19bd651 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index e434f1238..434fc0ea8 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -233,15 +233,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM model.Config = nil } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index a95ee34ec..64c0a63b9 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { PublicKey: flags.FlagToStringPointer(p, cmd, publicKeyFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string fo debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/key-pair/delete/delete.go b/internal/cmd/key-pair/delete/delete.go index 376d21174..5d6c5cdb7 100644 --- a/internal/cmd/key-pair/delete/delete.go +++ b/internal/cmd/key-pair/delete/delete.go @@ -82,15 +82,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu KeyPairName: keyPairName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/key-pair/describe/describe.go b/internal/cmd/key-pair/describe/describe.go index 8de535589..36addd3b8 100644 --- a/internal/cmd/key-pair/describe/describe.go +++ b/internal/cmd/key-pair/describe/describe.go @@ -98,15 +98,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicKey: flags.FlagToBoolValue(p, cmd, publicKeyFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/key-pair/list/list.go b/internal/cmd/key-pair/list/list.go index b614cf5c1..e185d6767 100644 --- a/internal/cmd/key-pair/list/list.go +++ b/internal/cmd/key-pair/list/list.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.InfoLevel, modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index b8b7ffbbd..2da8a409c 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -103,15 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) inputM KeyPairName: utils.Ptr(keyPairName), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return model } diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index f59683a47..edc927496 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -143,15 +143,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Payload: payload, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index 84146f875..e2cd2b37c 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -100,15 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu LoadBalancerName: loadBalancerName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/describe/describe.go b/internal/cmd/load-balancer/describe/describe.go index 2b5ff659d..df1403a14 100644 --- a/internal/cmd/load-balancer/describe/describe.go +++ b/internal/cmd/load-balancer/describe/describe.go @@ -82,15 +82,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu LoadBalancerName: loadBalancerName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 42cbb4a59..a3bffa93e 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -196,15 +196,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { FilePath: flags.FlagToStringPointer(p, cmd, filePathFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index 02a1f30ed..511bee335 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index 533a222f4..7a2cd20ae 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -121,15 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Password: flags.FlagToStringPointer(p, cmd, passwordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index 3bcf0190a..718884c9c 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -118,15 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete.go b/internal/cmd/load-balancer/observability-credentials/delete/delete.go index bef2362b9..a26da465f 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete.go @@ -98,15 +98,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsRef: credentialsRef, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe.go b/internal/cmd/load-balancer/observability-credentials/describe/describe.go index 85c32ba7f..b9559e90a 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe.go @@ -79,15 +79,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsRef: credentialsRef, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 714364c47..138003fdd 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -150,15 +150,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Unused: flags.FlagToBoolValue(p, cmd, unusedFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index 2925d7f52..76b363838 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -69,15 +69,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 46faf8bb9..1612628fd 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -112,15 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu IP: ip, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index ea0f6dace..ed8eddc51 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -103,15 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu LBName: cmd.Flag(lbNameFlag).Value.String(), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index 3ca65c79b..923521b40 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -112,15 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu IP: ip, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/load-balancer/update/update.go b/internal/cmd/load-balancer/update/update.go index db183702d..47c4e5d80 100644 --- a/internal/cmd/load-balancer/update/update.go +++ b/internal/cmd/load-balancer/update/update.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Payload: payload, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index c1e44ccff..de6cab21f 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ShowPassword: flags.FlagToBoolValue(p, cmd, showPasswordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/credentials/delete/delete.go b/internal/cmd/logme/credentials/delete/delete.go index fabd2b838..0766f8e5a 100644 --- a/internal/cmd/logme/credentials/delete/delete.go +++ b/internal/cmd/logme/credentials/delete/delete.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/credentials/describe/describe.go b/internal/cmd/logme/credentials/describe/describe.go index 240df0f81..1af434056 100644 --- a/internal/cmd/logme/credentials/describe/describe.go +++ b/internal/cmd/logme/credentials/describe/describe.go @@ -95,15 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index 218dff2d1..d9f572e2f 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index ca00f4cdc..5004c8dfb 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -186,15 +186,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/instance/delete/delete.go b/internal/cmd/logme/instance/delete/delete.go index 905c51bed..f606a2cee 100644 --- a/internal/cmd/logme/instance/delete/delete.go +++ b/internal/cmd/logme/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/instance/describe/describe.go b/internal/cmd/logme/instance/describe/describe.go index bf7892373..9acac7ce7 100644 --- a/internal/cmd/logme/instance/describe/describe.go +++ b/internal/cmd/logme/instance/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index e325aee95..def82f0e0 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/instance/update/update.go b/internal/cmd/logme/instance/update/update.go index a7e3ec443..97e016723 100644 --- a/internal/cmd/logme/instance/update/update.go +++ b/internal/cmd/logme/instance/update/update.go @@ -196,15 +196,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index 8c339a1ee..c8b28f0ba 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index cf42e1ca2..80077c4ce 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -107,15 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ShowPassword: flags.FlagToBoolValue(p, cmd, showPasswordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/credentials/delete/delete.go b/internal/cmd/mariadb/credentials/delete/delete.go index cbce0078d..8b8934e36 100644 --- a/internal/cmd/mariadb/credentials/delete/delete.go +++ b/internal/cmd/mariadb/credentials/delete/delete.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/credentials/describe/describe.go b/internal/cmd/mariadb/credentials/describe/describe.go index 7a03a4377..32d547403 100644 --- a/internal/cmd/mariadb/credentials/describe/describe.go +++ b/internal/cmd/mariadb/credentials/describe/describe.go @@ -95,15 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index f9a3f43d7..a113fd11e 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -118,15 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index b84368fa2..e90e6c0d8 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -186,15 +186,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/instance/delete/delete.go b/internal/cmd/mariadb/instance/delete/delete.go index eaca7989a..2f192e7c3 100644 --- a/internal/cmd/mariadb/instance/delete/delete.go +++ b/internal/cmd/mariadb/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/instance/describe/describe.go b/internal/cmd/mariadb/instance/describe/describe.go index 58f07db66..7775584e3 100644 --- a/internal/cmd/mariadb/instance/describe/describe.go +++ b/internal/cmd/mariadb/instance/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 7e5b8e0d6..e648f7baa 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/instance/update/update.go b/internal/cmd/mariadb/instance/update/update.go index 26059ff6f..bf16d188d 100644 --- a/internal/cmd/mariadb/instance/update/update.go +++ b/internal/cmd/mariadb/instance/update/update.go @@ -194,15 +194,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index c54703a1e..c8b89e937 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index a1ca3aeaf..e36e875ed 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupId: backupId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index 64187cf64..c15bb538b 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -128,15 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 7f529891e..36e3a7ab7 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index 5c64f6aef..1d547a486 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -171,15 +171,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Timestamp: flags.FlagToStringValue(p, cmd, timestampFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 9117e83d9..b75275f49 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -87,15 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { InstanceId: *flags.FlagToStringPointer(p, cmd, instanceIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 28a65e394..fae577334 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -195,15 +195,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Type: utils.Ptr(flags.FlagWithDefaultToStringValue(p, cmd, typeFlag)), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index b63d61d63..5ae1da16a 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index 0a5c11e54..7c2c296a0 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index fa30c47ca..a901516bf 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index 5c11a7ee6..3240c7f8e 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -187,15 +187,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Type: instanceType, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 53499547e..513dad9a9 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { FlavorId: flags.FlagToStringPointer(p, cmd, flavorIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index 2ddf76d34..e1e7a00cf 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -128,15 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Roles: flags.FlagWithDefaultToStringSlicePointer(p, cmd, roleFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/user/delete/delete.go b/internal/cmd/mongodbflex/user/delete/delete.go index 05e72686b..b945f5ad3 100644 --- a/internal/cmd/mongodbflex/user/delete/delete.go +++ b/internal/cmd/mongodbflex/user/delete/delete.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/user/describe/describe.go b/internal/cmd/mongodbflex/user/describe/describe.go index 410896fc9..876b63022 100644 --- a/internal/cmd/mongodbflex/user/describe/describe.go +++ b/internal/cmd/mongodbflex/user/describe/describe.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index d9e947e9c..ef184883f 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index c58dfd020..ba0b169c2 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index 5f192f377..df408025e 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -130,15 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Roles: roles, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 870e6a439..e6be49171 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -150,15 +150,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index b545fca4b..d16a9e656 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -121,15 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu AreaId: areaId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index e086f3dd9..49c28d7ce 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ShowAttachedProjects: flags.FlagToBoolValue(p, cmd, showAttachedProjectsFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index aef31e48b..94c0ffd8f 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -137,15 +137,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index cdc54b800..9dbd2878d 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { NetworkRange: flags.FlagToStringPointer(p, cmd, networkRangeFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index feec26e6b..12126917e 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NetworkRangeId: networkRangeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index d594ebb64..a16098a9c 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NetworkRangeId: networkRangeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index e4531121f..cb33cccbe 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { NetworkAreaId: flags.FlagToStringPointer(p, cmd, networkAreaIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index bc0eaf5c3..82e8e9ae4 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -130,15 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index 114a5d11d..254e7fb7a 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -105,15 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu RouteId: routeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index e58a3a2d5..89d743d91 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu RouteId: routeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index 2ea248551..989de2618 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -124,15 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { NetworkAreaId: flags.FlagToStringPointer(p, cmd, networkAreaIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index f644da320..1903833df 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 0cc0e2e1e..0df8d0880 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -138,15 +138,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index f96687591..bd4b71de2 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -192,15 +192,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { model.AllowedAddresses = utils.Ptr(allowedAddressesInner) } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index 8450f5abc..043e41217 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -94,15 +94,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NicId: nicId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index b221a0b1b..0dcb12171 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -100,15 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NicId: nicId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index eeb3c9be6..b40a7fa2e 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -133,15 +133,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 92b3e02ab..5a85d593a 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -184,15 +184,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model.AllowedAddresses = utils.Ptr(allowedAddressesInner) } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index ce5871590..6b4461924 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -185,15 +185,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index 005c3e312..473edf34b 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NetworkId: networkId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index b4c12a317..91be6d04e 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -85,15 +85,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu NetworkId: networkId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index 2584d7fd7..c9689f845 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -127,15 +127,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 712342cfc..8527a901f 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -163,15 +163,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index fd899a4d2..b1da202f6 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -110,15 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BucketName: bucketName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index fa4e68e99..eb47d1bd7 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BucketName: bucketName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index 4112c0674..e5728d549 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -81,15 +81,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BucketName: bucketName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index 8060094c1..d2ec16c9c 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index dac9c248c..a531e49fd 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -93,15 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { CredentialsGroupName: flags.FlagToStringValue(p, cmd, credentialsGroupNameFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/credentials-group/delete/delete.go b/internal/cmd/object-storage/credentials-group/delete/delete.go index ff880c0f7..6a328b875 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsGroupId: credentialsGroupId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index ccea6fc84..166e0b91a 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -105,15 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index 5a809c8d1..b713331c6 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { CredentialsGroupId: flags.FlagToStringValue(p, cmd, credentialsGroupIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index dea8797b0..5cab91f49 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -108,15 +108,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index 211ac8d77..eaf04b011 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index f6b8ee848..f5cec2175 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -87,15 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index 6a064bb3c..fe9fa549e 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -87,15 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 2ad9103e6..1b425fc20 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -103,15 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ShowPassword: flags.FlagToBoolValue(p, cmd, showPasswordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index 5696bf623..bfb42108c 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index 7cd00b9e2..b868c0535 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index bf6de05a4..a26977645 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go index 84b2bc0c4..f95812d80 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 37f3a8114..bf1a3de39 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -149,15 +149,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { PlanName: planName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index ff0d1bd62..165c74f05 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index 506bdcbc1..cd65f868a 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/instance/describe/describe.go @@ -81,15 +81,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index 011842a4e..a234f18cc 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index b314a6ecc..d4ae51392 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -158,15 +158,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceName: instanceName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index 7fe3feabf..3473e645b 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index fdc2760f7..8af402191 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ShowPassword: flags.FlagToBoolValue(p, cmd, showPasswordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/credentials/delete/delete.go b/internal/cmd/opensearch/credentials/delete/delete.go index faccd169e..c513cb55e 100644 --- a/internal/cmd/opensearch/credentials/delete/delete.go +++ b/internal/cmd/opensearch/credentials/delete/delete.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/credentials/describe/describe.go b/internal/cmd/opensearch/credentials/describe/describe.go index 92bdf6350..531a9d9cb 100644 --- a/internal/cmd/opensearch/credentials/describe/describe.go +++ b/internal/cmd/opensearch/credentials/describe/describe.go @@ -95,15 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index 0efb58d37..b3a0cbdfc 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index bc41bfbed..6476f8cc3 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -190,15 +190,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/instance/delete/delete.go b/internal/cmd/opensearch/instance/delete/delete.go index e0ed0db20..7d5996c6b 100644 --- a/internal/cmd/opensearch/instance/delete/delete.go +++ b/internal/cmd/opensearch/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/instance/describe/describe.go b/internal/cmd/opensearch/instance/describe/describe.go index da181a5a4..ef746f2c3 100644 --- a/internal/cmd/opensearch/instance/describe/describe.go +++ b/internal/cmd/opensearch/instance/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index e32b425e5..3d27f7c0b 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/instance/update/update.go b/internal/cmd/opensearch/instance/update/update.go index 254a9a41b..3b1114780 100644 --- a/internal/cmd/opensearch/instance/update/update.go +++ b/internal/cmd/opensearch/instance/update/update.go @@ -200,15 +200,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index c096fb230..a4f0b06fb 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/organization/member/add/add.go b/internal/cmd/organization/member/add/add.go index d3dd1f81b..297e64c33 100644 --- a/internal/cmd/organization/member/add/add.go +++ b/internal/cmd/organization/member/add/add.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Role: flags.FlagToStringPointer(p, cmd, roleFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index 6e414d257..b46f7705f 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -124,15 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { SortBy: flags.FlagWithDefaultToStringValue(p, cmd, sortByFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/organization/member/remove/remove.go b/internal/cmd/organization/member/remove/remove.go index 6281b4214..f79075bdb 100644 --- a/internal/cmd/organization/member/remove/remove.go +++ b/internal/cmd/organization/member/remove/remove.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Force: flags.FlagToBoolValue(p, cmd, forceFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index c16d145c2..710738559 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index 2967fdbb3..2b43420ce 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -150,15 +150,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu RecoveryDate: utils.Ptr(recoveryTimestampString), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index 7def7878c..d6664835f 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -196,15 +196,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Type: utils.Ptr(flags.FlagWithDefaultToStringValue(p, cmd, typeFlag)), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/instance/delete/delete.go b/internal/cmd/postgresflex/instance/delete/delete.go index 1c892657d..5b8cbbd91 100644 --- a/internal/cmd/postgresflex/instance/delete/delete.go +++ b/internal/cmd/postgresflex/instance/delete/delete.go @@ -159,15 +159,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ForceDelete: flags.FlagToBoolValue(p, cmd, forceDeleteFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/instance/describe/describe.go b/internal/cmd/postgresflex/instance/describe/describe.go index 9d58c781b..78898aa7d 100644 --- a/internal/cmd/postgresflex/instance/describe/describe.go +++ b/internal/cmd/postgresflex/instance/describe/describe.go @@ -84,15 +84,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index 2431afa89..90a9a1a40 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 3a50f8dfa..4448ffd00 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -187,15 +187,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Type: instanceType, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index c327e030b..9e988dd6e 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -129,15 +129,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { FlavorId: flags.FlagToStringPointer(p, cmd, flavorIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index 00e214089..88d377391 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Roles: flags.FlagWithDefaultToStringSlicePointer(p, cmd, roleFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/user/delete/delete.go b/internal/cmd/postgresflex/user/delete/delete.go index 925453632..38b20dbfe 100644 --- a/internal/cmd/postgresflex/user/delete/delete.go +++ b/internal/cmd/postgresflex/user/delete/delete.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/user/describe/describe.go b/internal/cmd/postgresflex/user/describe/describe.go index fb18ff889..30c96e40f 100644 --- a/internal/cmd/postgresflex/user/describe/describe.go +++ b/internal/cmd/postgresflex/user/describe/describe.go @@ -100,15 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index a493855e2..eb476e916 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -121,15 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index 45255b988..27c955b19 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -116,15 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/postgresflex/user/update/update.go b/internal/cmd/postgresflex/user/update/update.go index 4149a3b78..c8b24f1d3 100644 --- a/internal/cmd/postgresflex/user/update/update.go +++ b/internal/cmd/postgresflex/user/update/update.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Roles: roles, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index 17e9e950e..bbb22d2e3 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -145,15 +145,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { NetworkAreaId: flags.FlagToStringPointer(p, cmd, networkAreaIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/delete/delete.go b/internal/cmd/project/delete/delete.go index 4e83d9324..ce572bfc5 100644 --- a/internal/cmd/project/delete/delete.go +++ b/internal/cmd/project/delete/delete.go @@ -90,15 +90,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/describe/describe.go b/internal/cmd/project/describe/describe.go index edd17d483..59366914c 100644 --- a/internal/cmd/project/describe/describe.go +++ b/internal/cmd/project/describe/describe.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu IncludeParents: flags.FlagToBoolValue(p, cmd, includeParentsFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index 364458a7c..9c8118c2f 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -140,15 +140,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { PageSize: pageSize, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/member/add/add.go b/internal/cmd/project/member/add/add.go index 1d40c0ec5..f8491a6de 100644 --- a/internal/cmd/project/member/add/add.go +++ b/internal/cmd/project/member/add/add.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Role: flags.FlagToStringPointer(p, cmd, roleFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index 673b4f755..a40ffae49 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -126,15 +126,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { SortBy: flags.FlagWithDefaultToStringValue(p, cmd, sortByFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/member/remove/remove.go b/internal/cmd/project/member/remove/remove.go index b4030199f..20bf7ee3c 100644 --- a/internal/cmd/project/member/remove/remove.go +++ b/internal/cmd/project/member/remove/remove.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Force: flags.FlagToBoolValue(p, cmd, forceFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index 2f49ba18b..30c1b054b 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/project/update/update.go b/internal/cmd/project/update/update.go index b46641ec4..d8ad38c71 100644 --- a/internal/cmd/project/update/update.go +++ b/internal/cmd/project/update/update.go @@ -143,15 +143,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index 82de08fcb..e2398fe08 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -108,15 +108,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicIpId: publicIpId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 9d29b78d2..77564b941 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index 9cb01d38e..525318184 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicIpId: publicIpId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index db2ac5050..f180c7533 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -86,15 +86,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicIpId: publicIpId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index 7630ce7c5..7af16991d 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -95,15 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicIpId: publicIpId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index 37756c8c2..71c94a776 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -127,15 +127,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/ranges/list/list.go b/internal/cmd/public-ip/ranges/list/list.go index 54168b448..6b83d5863 100644 --- a/internal/cmd/public-ip/ranges/list/list.go +++ b/internal/cmd/public-ip/ranges/list/list.go @@ -102,15 +102,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index 78ae5d13e..0f4fc3400 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index 81397affc..5fb48b92b 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -90,15 +90,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 6195ec768..71d432868 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ShowPassword: flags.FlagToBoolValue(p, cmd, showPasswordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/credentials/delete/delete.go b/internal/cmd/rabbitmq/credentials/delete/delete.go index 9421e898e..20f868ddc 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/credentials/describe/describe.go b/internal/cmd/rabbitmq/credentials/describe/describe.go index e04eb1c2e..13f631733 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe.go @@ -95,15 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index d31efe256..1d9e5f3a3 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -118,15 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index a5ea1b7af..7bf8a1704 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -190,15 +190,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index 852fa0d2e..69f955ed5 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/instance/describe/describe.go b/internal/cmd/rabbitmq/instance/describe/describe.go index 734bd97ce..be909e8ab 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe.go +++ b/internal/cmd/rabbitmq/instance/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 4556f201f..841ac94eb 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index b86b9f969..792e82681 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -200,15 +200,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index 996cea081..70518152e 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index 3e6d2d961..93b2284ee 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -107,15 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ShowPassword: flags.FlagToBoolValue(p, cmd, showPasswordFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/credentials/delete/delete.go b/internal/cmd/redis/credentials/delete/delete.go index 4d438bfba..34d0a12ac 100644 --- a/internal/cmd/redis/credentials/delete/delete.go +++ b/internal/cmd/redis/credentials/delete/delete.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/credentials/describe/describe.go b/internal/cmd/redis/credentials/describe/describe.go index 028554868..65973cc0a 100644 --- a/internal/cmd/redis/credentials/describe/describe.go +++ b/internal/cmd/redis/credentials/describe/describe.go @@ -95,15 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CredentialsId: credentialsId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index e6b4d8c7e..5aa2515d0 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -118,15 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index bece1146e..db8700842 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -186,15 +186,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/instance/delete/delete.go b/internal/cmd/redis/instance/delete/delete.go index 01fa78218..c6d3f271b 100644 --- a/internal/cmd/redis/instance/delete/delete.go +++ b/internal/cmd/redis/instance/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/instance/describe/describe.go b/internal/cmd/redis/instance/describe/describe.go index 22e9e4805..cf9d9adc7 100644 --- a/internal/cmd/redis/instance/describe/describe.go +++ b/internal/cmd/redis/instance/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index 1c073147b..db44022ba 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -112,15 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/instance/update/update.go b/internal/cmd/redis/instance/update/update.go index 6d2e919f7..5b254072e 100644 --- a/internal/cmd/redis/instance/update/update.go +++ b/internal/cmd/redis/instance/update/update.go @@ -194,15 +194,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Version: version, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index 7e663c8c3..66b18fb47 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index cd0cfd175..1d17fbefb 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Acls: flags.FlagToStringSlicePointer(p, cmd, aclFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/instance/delete/delete.go b/internal/cmd/secrets-manager/instance/delete/delete.go index 121d5427d..2432c5a5e 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete.go +++ b/internal/cmd/secrets-manager/instance/delete/delete.go @@ -91,15 +91,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/instance/describe/describe.go b/internal/cmd/secrets-manager/instance/describe/describe.go index 3aed94fd5..ad9bb5de5 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe.go +++ b/internal/cmd/secrets-manager/instance/describe/describe.go @@ -89,15 +89,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu InstanceId: instanceId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index 4098a7d76..142beefe4 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/instance/update/update.go b/internal/cmd/secrets-manager/instance/update/update.go index b460360e2..d3caca348 100644 --- a/internal/cmd/secrets-manager/instance/update/update.go +++ b/internal/cmd/secrets-manager/instance/update/update.go @@ -110,15 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Acls: acls, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index 5e8e3e25f..6ddfc5e2c 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Write: utils.Ptr(flags.FlagToBoolValue(p, cmd, writeFlag)), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/user/delete/delete.go b/internal/cmd/secrets-manager/user/delete/delete.go index 571ef6130..fb1972dbf 100644 --- a/internal/cmd/secrets-manager/user/delete/delete.go +++ b/internal/cmd/secrets-manager/user/delete/delete.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/user/describe/describe.go b/internal/cmd/secrets-manager/user/describe/describe.go index b11949417..1ebd58e49 100644 --- a/internal/cmd/secrets-manager/user/describe/describe.go +++ b/internal/cmd/secrets-manager/user/describe/describe.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index 7040d69a6..5828940fc 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -121,15 +121,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/secrets-manager/user/update/update.go b/internal/cmd/secrets-manager/user/update/update.go index 07e9b6edd..c41c59b35 100644 --- a/internal/cmd/secrets-manager/user/update/update.go +++ b/internal/cmd/secrets-manager/user/update/update.go @@ -137,15 +137,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UserId: userId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 1e17b9002..3a352f624 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -112,15 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Stateful: flags.FlagToBoolPointer(p, cmd, statefulFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 329e4b026..376435432 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -93,15 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM SecurityGroupId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/describe/describe.go b/internal/cmd/security-group/describe/describe.go index 1ea5bf64d..83186e060 100644 --- a/internal/cmd/security-group/describe/describe.go +++ b/internal/cmd/security-group/describe/describe.go @@ -85,15 +85,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM SecurityGroupId: cliArgs[0], } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index 1459a3c11..b80b8647b 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -99,15 +99,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index d0e7bb008..6e6250faf 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -165,15 +165,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ProtocolName: flags.FlagToStringPointer(p, cmd, protocolNameFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index 6acae57c7..9248663cf 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu SecurityGroupId: flags.FlagToStringPointer(p, cmd, securityGroupIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index 47cd0e554..5cce9ff97 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu SecurityGroupId: flags.FlagToStringPointer(p, cmd, securityGroupIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index c0bec27c6..8a4bc3758 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -132,15 +132,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { SecurityGroupId: flags.FlagToStringPointer(p, cmd, securityGroupIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index 487dca9e0..d0aae546e 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM return nil, fmt.Errorf("no flags have been passed") } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index ccabadb65..a7400a73d 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -129,15 +129,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { BackupVolumeIds: flags.FlagToStringSliceValue(p, cmd, backupVolumeIdsFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/delete/delete.go b/internal/cmd/server/backup/delete/delete.go index 5fed34276..f89a451b1 100644 --- a/internal/cmd/server/backup/delete/delete.go +++ b/internal/cmd/server/backup/delete/delete.go @@ -97,15 +97,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/describe/describe.go b/internal/cmd/server/backup/describe/describe.go index b44ec3fbe..0b5c6a23b 100644 --- a/internal/cmd/server/backup/describe/describe.go +++ b/internal/cmd/server/backup/describe/describe.go @@ -94,15 +94,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupId: backupId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index f456647ba..0bc6f6a1c 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index c4a4402b6..4cb0f3667 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -107,15 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index 775f88198..aac8a3010 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/restore/restore.go b/internal/cmd/server/backup/restore/restore.go index db9a48bac..ffca1ca53 100644 --- a/internal/cmd/server/backup/restore/restore.go +++ b/internal/cmd/server/backup/restore/restore.go @@ -110,15 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu StartServerAfterRestore: flags.FlagToBoolValue(p, cmd, startServerAfterRestoreFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index c400e4e06..a7af18187 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -143,15 +143,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { BackupVolumeIds: flags.FlagToStringSliceValue(p, cmd, backupVolumeIdsFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/schedule/delete/delete.go b/internal/cmd/server/backup/schedule/delete/delete.go index fbf35a733..3dd8632f4 100644 --- a/internal/cmd/server/backup/schedule/delete/delete.go +++ b/internal/cmd/server/backup/schedule/delete/delete.go @@ -109,15 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/schedule/describe/describe.go b/internal/cmd/server/backup/schedule/describe/describe.go index 49c5fd5ee..f3f827844 100644 --- a/internal/cmd/server/backup/schedule/describe/describe.go +++ b/internal/cmd/server/backup/schedule/describe/describe.go @@ -93,15 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupScheduleId: backupScheduleId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index edb0c4411..f9cecde2f 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/schedule/update/update.go b/internal/cmd/server/backup/schedule/update/update.go index bdb3d8040..a3471e41b 100644 --- a/internal/cmd/server/backup/schedule/update/update.go +++ b/internal/cmd/server/backup/schedule/update/update.go @@ -142,15 +142,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupVolumeIds: flags.FlagToStringSliceValue(p, cmd, backupVolumeIdsFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/volume-backup/delete/delete.go b/internal/cmd/server/backup/volume-backup/delete/delete.go index d6e040d56..fc3cbced4 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/backup/volume-backup/restore/restore.go b/internal/cmd/server/backup/volume-backup/restore/restore.go index 4d3dd8bc9..d29b21681 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore.go @@ -105,15 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu RestoreVolumeId: flags.FlagToStringValue(p, cmd, restoreVolumeIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 1a766ef46..a94cbca58 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -131,15 +131,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } model.Params = &parsedParams - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/command/describe/describe.go b/internal/cmd/server/command/describe/describe.go index ba09d2575..f229335fb 100644 --- a/internal/cmd/server/command/describe/describe.go +++ b/internal/cmd/server/command/describe/describe.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CommandId: commandId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index a05d1a034..2d5dfd683 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index 7a83bf609..ec23859b4 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu CommandTemplateName: commandTemplateName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index a085c3210..8b03a589a 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -102,15 +102,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index 1462a97ac..261f68b3c 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -93,15 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 882c971cb..934123a6f 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -267,15 +267,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Volumes: flags.FlagToStringSlicePointer(p, cmd, volumesFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index b614ba471..7d1d4e37d 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index c5aae8216..f2f5e80db 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/describe/describe.go b/internal/cmd/server/describe/describe.go index ee6e32ea6..760444d26 100644 --- a/internal/cmd/server/describe/describe.go +++ b/internal/cmd/server/describe/describe.go @@ -85,15 +85,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index 8c1596cbb..13a4be08f 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index 11bbfe006..1448a3281 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Length: utils.Ptr(length), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index 522d13bd3..12d3a8a7b 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -85,15 +85,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu MachineType: machineType, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 5ec90d0c4..55a08109a 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 6f2a64163..739a9169e 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -152,15 +152,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Create: create, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index 58024dc3e..7d72df379 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -154,15 +154,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Delete: deleteValue, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index c3d9769c3..071781da4 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 76d97cc01..2cfd7a544 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { MaintenanceWindow: flags.FlagWithDefaultToInt64Value(p, cmd, maintenanceWindowFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/describe/describe.go b/internal/cmd/server/os-update/describe/describe.go index 3c8de58ee..2aa7c1283 100644 --- a/internal/cmd/server/os-update/describe/describe.go +++ b/internal/cmd/server/os-update/describe/describe.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu UpdateId: updateId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index 510411798..dabf2bacf 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -104,15 +104,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index e796767c6..2697de207 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -107,15 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index 4092be38a..6ec47314e 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index cae0f7377..bd3784c49 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -134,15 +134,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Enabled: flags.FlagToBoolValue(p, cmd, enabledFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/schedule/delete/delete.go b/internal/cmd/server/os-update/schedule/delete/delete.go index 0d2762d65..f97ee0ec6 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete.go +++ b/internal/cmd/server/os-update/schedule/delete/delete.go @@ -96,15 +96,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/schedule/describe/describe.go b/internal/cmd/server/os-update/schedule/describe/describe.go index 89aaba7b0..d46eea1bb 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/server/os-update/schedule/describe/describe.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ScheduleId: scheduleId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index 3f8eeb6cb..201922d21 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index 3394ba5ba..e9ce126f0 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -130,15 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Enabled: flags.FlagToBoolPointer(p, cmd, enabledFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 843c030e7..763583606 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicIpId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index 3c1aa6687..6294187d8 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu PublicIpId: publicIpId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index dbdc10ef1..445321295 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu HardReboot: flags.FlagToBoolValue(p, cmd, hardRebootFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index 5c4efea4f..65dc2633d 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -126,15 +126,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ImageId: flags.FlagToStringPointer(p, cmd, imageIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index 57e6ebe1b..f23826188 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -126,15 +126,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu MachineType: flags.FlagToStringPointer(p, cmd, machineTypeFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index 89232fa88..b80c93df0 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServiceAccMail: serviceAccMail, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index 69bc5e4fe..909de016d 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServiceAccMail: serviceAccMail, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index 19bfc8fa0..372e6c975 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index 5a6f9d02a..9ebabdf70 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -105,15 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index aa510ef01..d91c1931c 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index 44bf3ace1..47b6cf018 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ServerId: serverId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index bc6f821a1..e69289375 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -114,15 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index 00217c513..2ba304db3 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index be160a2ca..6aa391a4c 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index ebd4fb70d..e081295d6 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -112,15 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index 1fab049e4..3e69701df 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 3e2e4ae6b..1371e587c 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index c998de0f8..6387773ad 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -100,15 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Name: flags.FlagToStringPointer(p, cmd, nameFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/delete/delete.go b/internal/cmd/service-account/delete/delete.go index a92acdb4f..ad0a9dc45 100644 --- a/internal/cmd/service-account/delete/delete.go +++ b/internal/cmd/service-account/delete/delete.go @@ -87,15 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Email: email, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/get-jwks/get_jwks.go b/internal/cmd/service-account/get-jwks/get_jwks.go index 441851bac..a99655c1c 100644 --- a/internal/cmd/service-account/get-jwks/get_jwks.go +++ b/internal/cmd/service-account/get-jwks/get_jwks.go @@ -73,15 +73,7 @@ func parseInput(p *print.Printer, _ *cobra.Command, inputArgs []string) (*inputM Email: email, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/key/create/create.go b/internal/cmd/service-account/key/create/create.go index 1b58d12b8..e25d3fbbc 100644 --- a/internal/cmd/service-account/key/create/create.go +++ b/internal/cmd/service-account/key/create/create.go @@ -140,15 +140,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { PublicKey: flags.FlagToStringPointer(p, cmd, publicKeyFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/key/delete/delete.go b/internal/cmd/service-account/key/delete/delete.go index e780ddd33..61c551652 100644 --- a/internal/cmd/service-account/key/delete/delete.go +++ b/internal/cmd/service-account/key/delete/delete.go @@ -108,15 +108,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu KeyId: keyId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/key/describe/describe.go b/internal/cmd/service-account/key/describe/describe.go index ecf541f3f..8fdc2d7c1 100644 --- a/internal/cmd/service-account/key/describe/describe.go +++ b/internal/cmd/service-account/key/describe/describe.go @@ -98,15 +98,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu KeyId: keyId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index a39782f56..cb10ba912 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/key/update/update.go b/internal/cmd/service-account/key/update/update.go index 62183d56f..ff3387965 100644 --- a/internal/cmd/service-account/key/update/update.go +++ b/internal/cmd/service-account/key/update/update.go @@ -149,15 +149,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Deactivate: deactivate, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index 121b5216d..5806feda7 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -107,15 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index 5b74fdae7..e3e009b51 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { TTLDays: &ttlDays, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/token/list/list.go b/internal/cmd/service-account/token/list/list.go index 956b79908..e3a20d9ed 100644 --- a/internal/cmd/service-account/token/list/list.go +++ b/internal/cmd/service-account/token/list/list.go @@ -128,15 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: limit, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/service-account/token/revoke/revoke.go b/internal/cmd/service-account/token/revoke/revoke.go index 0ac624a89..a3bd60f3a 100644 --- a/internal/cmd/service-account/token/revoke/revoke.go +++ b/internal/cmd/service-account/token/revoke/revoke.go @@ -111,15 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu TokenId: tokenId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index af9ba2336..3c51310cd 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -179,15 +179,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Payload: payload, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index 12068d9e3..d0ebb34fe 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index a983f442e..69d357f44 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -81,15 +81,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 566e51f33..b03f0d42c 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -117,15 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { FilePath: flags.FlagToStringPointer(p, cmd, filePathFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go index 4c0be63ab..1ee7aff06 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index 8c357924a..75fc2e125 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -130,15 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go index 3396ad7c3..bad6c37f4 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/reconcile/reconcile.go b/internal/cmd/ske/cluster/reconcile/reconcile.go index 54c98dae0..719ebeb44 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 8c32f8d95..512b2f615 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -141,15 +141,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Payload: payload, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/cluster/wakeup/wakeup.go b/internal/cmd/ske/cluster/wakeup/wakeup.go index e7b9b6534..950dbf3b1 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup.go @@ -92,15 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index 982e9267d..f4a1fcc5b 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index a8314ad83..ea65650ea 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -122,15 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu ClusterName: clusterName, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index da717570e..a8abfb2b6 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -70,15 +70,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index ea355ada1..33647becf 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 91431b5e3..0567a9cab 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -101,15 +101,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { GlobalFlagModel: globalFlags, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index f420009f0..86b282cfa 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -215,15 +215,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Overwrite: flags.FlagToBoolValue(p, cmd, overwriteFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 91564ceea..e9eeba070 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -119,15 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { VolumeTypes: volumeTypes, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index 447a3ea16..5749a1d01 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -166,15 +166,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: *labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go index b40d93ea7..de63990bd 100644 --- a/internal/cmd/volume/backup/delete/delete.go +++ b/internal/cmd/volume/backup/delete/delete.go @@ -107,15 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupId: backupId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go index d3322f6d0..48ee2ae2a 100644 --- a/internal/cmd/volume/backup/describe/describe.go +++ b/internal/cmd/volume/backup/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupId: backupId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index f3d7062c7..f3fa7b257 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -123,15 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: labelSelector, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go index 3249f0560..04301a51d 100644 --- a/internal/cmd/volume/backup/restore/restore.go +++ b/internal/cmd/volume/backup/restore/restore.go @@ -120,15 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu BackupId: backupId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go index f23bb5108..e53e332a0 100644 --- a/internal/cmd/volume/backup/update/update.go +++ b/internal/cmd/volume/backup/update/update.go @@ -115,15 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: *labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 5519bd5d8..068a06cce 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -155,15 +155,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { SourceType: flags.FlagToStringPointer(p, cmd, sourceTypeFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index 117c17032..1c94e3dc2 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -113,15 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index 9d4c06538..8a0db5659 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -86,15 +86,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index aac08c50b..e45536d36 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -124,15 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index dc7b25ad5..cef47d1e6 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -86,15 +86,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumePerformanceClass: volumePerformanceClass, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index a6490e75e..e8904a8f4 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -125,15 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index f86f10546..4d1a0d03a 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -106,15 +106,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu VolumeId: volumeId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index 856b0a929..38e92650f 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -147,15 +147,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { Labels: *labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go index 0a4c17faa..11c4d1f1d 100644 --- a/internal/cmd/volume/snapshot/delete/delete.go +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -110,15 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu SnapshotId: snapshotId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/snapshot/describe/describe.go b/internal/cmd/volume/snapshot/describe/describe.go index 7ae36212e..9b4f45fad 100644 --- a/internal/cmd/volume/snapshot/describe/describe.go +++ b/internal/cmd/volume/snapshot/describe/describe.go @@ -83,15 +83,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu SnapshotId: snapshotId, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go index 83b59987c..d25965c44 100644 --- a/internal/cmd/volume/snapshot/list/list.go +++ b/internal/cmd/volume/snapshot/list/list.go @@ -124,15 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { LabelSelector: labelSelector, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/snapshot/update/update.go b/internal/cmd/volume/snapshot/update/update.go index 543c484d1..889b2cae4 100644 --- a/internal/cmd/volume/snapshot/update/update.go +++ b/internal/cmd/volume/snapshot/update/update.go @@ -120,15 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: *labels, } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 263f333af..34881f40d 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -120,15 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } - if p.IsVerbosityDebug() { - modelStr, err := print.BuildDebugStrFromInputModel(model) - if err != nil { - p.Debug(print.ErrorLevel, "convert model to string for debugging: %v", err) - } else { - p.Debug(print.DebugLevel, "parsed input values: %s", modelStr) - } - } - + p.DebugInputModel(model) return &model, nil } diff --git a/internal/pkg/print/debug.go b/internal/pkg/print/debug.go index 60962ba7b..793c54bd3 100644 --- a/internal/pkg/print/debug.go +++ b/internal/pkg/print/debug.go @@ -16,11 +16,11 @@ import ( var defaultHTTPHeaders = []string{"Accept", "Content-Type", "Content-Length", "User-Agent", "Date", "Referrer-Policy", "Traceparent"} -// BuildDebugStrFromInputModel converts an input model to a user-friendly string representation. +// buildDebugStrFromInputModel converts an input model to a user-friendly string representation. // This function converts the input model to a map, removes empty values, and generates a string representation of the map. // The purpose of this function is to provide a more readable output than the default JSON representation. // It is particularly useful when outputting to the slog logger, as the JSON format with escaped quotes does not look good. -func BuildDebugStrFromInputModel(model any) (string, error) { +func buildDebugStrFromInputModel(model any) (string, error) { // Marshaling and Unmarshaling is the best way to convert the struct to a map modelBytes, err := json.Marshal(model) if err != nil { diff --git a/internal/pkg/print/debug_test.go b/internal/pkg/print/debug_test.go index 45ef90482..abc3dedeb 100644 --- a/internal/pkg/print/debug_test.go +++ b/internal/pkg/print/debug_test.go @@ -171,7 +171,7 @@ func TestBuildDebugStrFromInputModel(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { model := tt.model - actual, err := BuildDebugStrFromInputModel(model) + actual, err := buildDebugStrFromInputModel(model) if err != nil { if !tt.isValid { return diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index 63f48fe89..583e975dc 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -51,7 +51,7 @@ type Printer struct { Verbosity Level } -// Creates a new printer, including setting up the default logger. +// NewPrinter creates a new printer, including setting up the default logger. func NewPrinter() *Printer { w := os.Stderr logger := slog.New( @@ -228,3 +228,15 @@ func (p *Printer) IsVerbosityWarning() bool { func (p *Printer) IsVerbosityError() bool { return p.Verbosity == ErrorLevel } + +// DebugInputModel prints the given input model in case verbosity level is set to Debug, does nothing otherwise +func (p *Printer) DebugInputModel(model any) { + if p.IsVerbosityDebug() { + modelStr, err := buildDebugStrFromInputModel(model) + if err != nil { + p.Debug(ErrorLevel, "convert model to string for debugging: %v", err) + } else { + p.Debug(DebugLevel, "parsed input values: %s", modelStr) + } + } +} From 45b902059be58540d152e733bda55505f9b96331 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 10 Oct 2025 08:09:16 +0200 Subject: [PATCH 167/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/observability to v0.15.0 (#1022) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0baf2a99d..d152751e2 100644 --- a/go.mod +++ b/go.mod @@ -246,7 +246,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 613c93ed9..a896800c1 100644 --- a/go.sum +++ b/go.sum @@ -583,8 +583,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/a github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 h1:g3yNDUc3JydAikezUrI9bQ4nuMJpVeAQ35jOFfFmq1U= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0/go.mod h1:foslkEiICdtHR3v0A/i/Rgo6EP9MMula9XNC9luNOgw= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0 h1:oewwaYjABWbNqDkmSwIXmjDBK4a46+tnznyZSXh3Xk0= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.14.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 h1:MA5i1ScjXLWe5CYeFCLHeZzNS1AH4mbx1kUyiVbxKjI= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= From 570f53d680a290f8902bf614ae8e48b366bd6249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:00:18 +0200 Subject: [PATCH 168/422] feat(distribution): provide rpm packages via rpm repository (#1012) --- .github/workflows/release.yaml | 59 ++++++++++++++++- .goreleaser.yaml | 15 ++--- INSTALLATION.md | 50 ++++++++++++-- scripts/publish-apt-packages.sh | 2 +- scripts/publish-rpm-packages.sh | 112 ++++++++++++++++++++++++++++++++ 5 files changed, 218 insertions(+), 20 deletions(-) create mode 100755 scripts/publish-rpm-packages.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0760269ed..9e453b7fa 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -41,6 +41,15 @@ jobs: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} passphrase: ${{ secrets.GPG_PASSPHRASE }} + # nfpm-rpm signing needs gpg provided as filepath + # https://goreleaser.com/customization/nfpm/ + - name: Create GPG key file + run: | + KEY_PATH="$RUNNER_TEMP/gpg-private-key.asc" + printf '%s' "${{ secrets.GPG_PRIVATE_KEY }}" > "$KEY_PATH" + chmod 600 "$KEY_PATH" + echo "GPG_KEY_PATH=$KEY_PATH" >> "$GITHUB_ENV" + - name: Set up keychain run: | echo -n $SIGNING_CERTIFICATE_BASE64 | base64 -d -o ./ApplicationID.p12 @@ -71,15 +80,22 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.CLI_RELEASE }} GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }} + GPG_KEY_PATH: ${{ env.GPG_KEY_PATH }} + # nfpm-rpm signing needs this env to be set. + NFPM_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - # artifacts need to be passed to the "publish-apt" job somehow + - name: Clean up GPG key file + if: always() + run: | + rm -f "$GPG_KEY_PATH" + - name: Upload artifacts to workflow uses: actions/upload-artifact@v4 with: name: goreleaser-dist-temp path: dist retention-days: 1 - + publish-apt: name: Publish APT runs-on: macOS-latest @@ -115,3 +131,42 @@ jobs: GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} GPG_PRIVATE_KEY_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }} run: ./scripts/publish-apt-packages.sh + + publish-rpm: + name: Publish RPM + runs-on: ubuntu-latest + needs: [goreleaser] + env: + # Needed to publish new packages to our S3-hosted RPM repo + AWS_ACCESS_KEY_ID: ${{ secrets.OBJECT_STORAGE_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SECRET_ACCESS_KEY }} + AWS_DEFAULT_REGION: eu01 + AWS_ENDPOINT_URL: https://object.storage.eu01.onstackit.cloud + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Download artifacts from workflow + uses: actions/download-artifact@v5 + with: + name: goreleaser-dist-temp + path: dist + + - name: Install RPM tools + run: | + sudo apt-get update + sudo apt-get install -y createrepo-c + + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v6 + id: import_gpg + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} + + - name: Publish RPM packages + if: contains(github.ref_name, '-') == false + env: + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + GPG_PRIVATE_KEY_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }} + run: ./scripts/publish-rpm-packages.sh \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 37412c183..b86115c5f 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -99,17 +99,10 @@ nfpms: - deb - rpm -signs: - - artifacts: package - args: - [ - "-u", - "{{ .Env.GPG_FINGERPRINT }}", - "--output", - "${signature}", - "--detach-sign", - "${artifact}", - ] + rpm: + # The package is signed if a key_file is set + signature: + key_file: "{{ .Env.GPG_KEY_PATH }}" homebrew_casks: - name: stackit diff --git a/INSTALLATION.md b/INSTALLATION.md index 3a5045149..c2e7bf751 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -130,16 +130,54 @@ asset_filters=["stackit-cli_", "_linux_amd64.tar.gz"] eget stackitcloud/stackit-cli ``` -#### RPM package via dnf, yum and zypper +#### RHEL/Fedora/Rocky/Alma/openSUSE/... (`DNF/YUM/Zypper`) -The STACKIT CLI is available as [RPM Package](https://github.com/stackitcloud/stackit-cli/releases) and can be installed via dnf, yum and zypper package manager. +The STACKIT CLI can be installed through the [`DNF/YUM`](https://docs.fedoraproject.org/en-US/fedora/f40/system-administrators-guide/package-management/DNF/) / [`Zypper`](https://de.opensuse.org/Zypper) package managers. -Just download the rpm package from the [release page](https://github.com/stackitcloud/stackit-cli/releases) and run the install command like the following: +> Requires rpm version 4.15 or newer to support Ed25519 signatures. + +> `$basearch` is supported by modern distributions. On older systems that don't expand `$basearch`, replace it in the `baseurl` with your architecture explicitly (for example, `.../rpm/cli/x86_64` or `.../rpm/cli/aarch64`). + +##### Installation via DNF/YUM + +1. Add the repository: + +```shell +sudo tee /etc/yum.repos.d/stackit.repo > /dev/null << 'EOF' +[stackit] +name=STACKIT CLI +baseurl=https://packages.stackit.cloud/rpm/cli/$basearch +enabled=1 +gpgcheck=1 +gpgkey=https://packages.stackit.cloud/keys/key.gpg +EOF +``` + +2. Install the CLI: + +```shell +sudo dnf install stackit +``` + +##### Installation via Zypper + +1. Add the repository: + +```shell +sudo tee /etc/zypp/repos.d/stackit.repo > /dev/null << 'EOF' +[stackit] +name=STACKIT CLI +baseurl=https://packages.stackit.cloud/rpm/cli/$basearch +enabled=1 +gpgcheck=1 +gpgkey=https://packages.stackit.cloud/keys/key.gpg +EOF +``` + +2. Install the CLI: ```shell -dnf install stackitcli.rpm -yum install stackitcli.rpm -zypper install stackitcli.rpm +sudo zypper install stackit ``` #### Any distribution diff --git a/scripts/publish-apt-packages.sh b/scripts/publish-apt-packages.sh index 9d122d80b..81aa53cb4 100755 --- a/scripts/publish-apt-packages.sh +++ b/scripts/publish-apt-packages.sh @@ -49,4 +49,4 @@ aptly snapshot pull -no-remove -architectures="amd64,i386,arm64" current-snapsho # Publish the new snapshot to the remote repo printf "\n>>> Publishing updated snapshot \n" -aptly publish snapshot -keyring="${CUSTOM_KEYRING_FILE}" -gpg-key="${GPG_PRIVATE_KEY_FINGERPRINT}" -passphrase "${GPG_PASSPHRASE}" -config "${APTLY_CONFIG_FILE_PATH}" updated-snapshot "s3:${APT_BUCKET_NAME}:${APT_REPO_PATH}" +aptly publish snapshot -keyring="${CUSTOM_KEYRING_FILE}" -gpg-key="${GPG_PRIVATE_KEY_FINGERPRINT}" -passphrase "${GPG_PASSPHRASE}" -config "${APTLY_CONFIG_FILE_PATH}" updated-snapshot "s3:${APT_BUCKET_NAME}:${APT_REPO_PATH}" \ No newline at end of file diff --git a/scripts/publish-rpm-packages.sh b/scripts/publish-rpm-packages.sh new file mode 100755 index 000000000..d657d1e0d --- /dev/null +++ b/scripts/publish-rpm-packages.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash + +# This script is used to publish new RPM packages to the CLI RPM repository +# Usage: ./publish-rpm-packages.sh +set -eo pipefail + +PACKAGES_BUCKET_URL="https://packages.stackit.cloud" +PUBLIC_KEY_FILE_PATH="keys/key.gpg" +RPM_REPO_PATH="rpm/cli" +RPM_BUCKET_NAME="distribution" +GORELEASER_PACKAGES_FOLDER="dist/" + +# We need to disable the key database daemon (keyboxd) +# This can be done by removing "use-keyboxd" from ~/.gnupg/common.conf (see https://github.com/gpg/gnupg/blob/master/README) +echo -n >~/.gnupg/common.conf + +# Create RPM repository directory structure +printf ">>> Creating RPM repository structure \n" +mkdir -p rpm-repo/x86_64 +mkdir -p rpm-repo/i386 +mkdir -p rpm-repo/aarch64 + +# Copy RPM packages to appropriate architecture directories +printf "\n>>> Copying RPM packages to architecture directories \n" + +# Copy x86_64 packages (amd64) +for rpm_file in "${GORELEASER_PACKAGES_FOLDER}"*_amd64.rpm; do + if [ -f "$rpm_file" ]; then + cp "$rpm_file" rpm-repo/x86_64/ + printf "Copied %s to x86_64/\n" "$(basename "$rpm_file")" + fi +done + +# Copy i386 packages +for rpm_file in "${GORELEASER_PACKAGES_FOLDER}"*_386.rpm; do + if [ -f "$rpm_file" ]; then + cp "$rpm_file" rpm-repo/i386/ + printf "Copied %s to i386/\n" "$(basename "$rpm_file")" + fi +done + +# Copy aarch64 packages (arm64) +for rpm_file in "${GORELEASER_PACKAGES_FOLDER}"*_arm64.rpm; do + if [ -f "$rpm_file" ]; then + cp "$rpm_file" rpm-repo/aarch64/ + printf "Copied %s to aarch64/\n" "$(basename "$rpm_file")" + fi +done + +# Download existing repository content (RPMs and metadata) if it exists +printf "\n>>> Downloading existing repository content \n" +aws s3 sync s3://${RPM_BUCKET_NAME}/${RPM_REPO_PATH}/ rpm-repo/ --endpoint-url "${AWS_ENDPOINT_URL}" --exclude "*.asc" || echo "No existing repository found, creating new one" + +# Create repository metadata for each architecture +printf "\n>>> Creating repository metadata \n" +for arch in x86_64 i386 aarch64; do + if [ -d "rpm-repo/${arch}" ] && [ -n "$(find "rpm-repo/${arch}" -mindepth 1 -maxdepth 1 -print -quit)" ]; then + printf "Creating metadata for %s...\n" "$arch" + + # List what we're working with + file_list=$(find "rpm-repo/${arch}" -maxdepth 1 -type f -exec basename {} \; | tr '\n' ' ') + printf "Files in %s: %s\n" "$arch" "${file_list% }" + + # Create repository metadata + createrepo_c --update rpm-repo/${arch} + + # Sign the repository metadata + printf "Signing repository metadata for %s...\n" "$arch" + # Remove existing signature file if it exists + rm -f rpm-repo/${arch}/repodata/repomd.xml.asc + gpg --batch --pinentry-mode loopback --detach-sign --armor \ + --local-user "${GPG_PRIVATE_KEY_FINGERPRINT}" \ + --passphrase "${GPG_PASSPHRASE}" \ + rpm-repo/${arch}/repodata/repomd.xml + + # Verify the signature was created + if [ -f "rpm-repo/${arch}/repodata/repomd.xml.asc" ]; then + printf "Repository metadata signed successfully for %s\n" "$arch" + else + printf "WARNING: Repository metadata signature not created for %s\n" "$arch" + fi + else + printf "No packages found for %s, skipping...\n" "$arch" + fi +done + +# Upload the updated repository to S3 in two phases (repodata pointers last) +# clients reading the repo won't see a state where repomd.xml points to files not uploaded yet. +printf "\n>>> Uploading repository to S3 (phase 1: all except repomd*) \n" +aws s3 sync rpm-repo/ s3://${RPM_BUCKET_NAME}/${RPM_REPO_PATH}/ \ + --endpoint-url "${AWS_ENDPOINT_URL}" \ + --delete \ + --exclude "*/repodata/repomd.xml" \ + --exclude "*/repodata/repomd.xml.asc" + +printf "\n>>> Uploading repository to S3 (phase 2: repomd* only) \n" +aws s3 sync rpm-repo/ s3://${RPM_BUCKET_NAME}/${RPM_REPO_PATH}/ \ + --endpoint-url "${AWS_ENDPOINT_URL}" \ + --exclude "*" \ + --include "*/repodata/repomd.xml" \ + --include "*/repodata/repomd.xml.asc" + +# Upload the public key +# Also uploaded in APT publish; intentionally redundant +# Safe to overwrite and ensures updates if APT fails or key changes. +printf "\n>>> Uploading public key \n" +gpg --armor --export "${GPG_PRIVATE_KEY_FINGERPRINT}" > public-key.asc +aws s3 cp public-key.asc s3://${RPM_BUCKET_NAME}/${PUBLIC_KEY_FILE_PATH} --endpoint-url "${AWS_ENDPOINT_URL}" + +printf "\n>>> RPM repository published successfully! \n" +printf "Repository URL: %s/%s/ \n" "$PACKAGES_BUCKET_URL" "$RPM_REPO_PATH" +printf "Public key URL: %s/%s \n" "$PACKAGES_BUCKET_URL" "$PUBLIC_KEY_FILE_PATH" From 85f5d792687442d95ce598c27c542407e68a3154 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 14 Oct 2025 11:35:05 +0200 Subject: [PATCH 169/422] chore(deps): update renovatebot/github-action action to v43.0.17 (#1025) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index a01117f2a..211759137 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.16 + uses: renovatebot/github-action@v43.0.17 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 1b5d0b2b50808f699c51ab07a635cbe9207f26bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 15 Oct 2025 11:59:32 +0200 Subject: [PATCH 170/422] fix(ske): make generate cluster payload work for eu02 (#1008) relates to STACKITCLI-258 / #997 --- internal/pkg/services/ske/utils/utils.go | 33 +++++++++----- internal/pkg/services/ske/utils/utils_test.go | 45 ++++++++++++++++++- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/internal/pkg/services/ske/utils/utils.go b/internal/pkg/services/ske/utils/utils.go index 605ca4158..904ff97a1 100644 --- a/internal/pkg/services/ske/utils/utils.go +++ b/internal/pkg/services/ske/utils/utils.go @@ -6,6 +6,7 @@ import ( "maps" "os" "path/filepath" + "regexp" "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -16,13 +17,9 @@ import ( ) const ( - defaultNodepoolAvailabilityZone = "eu01-3" defaultNodepoolCRI = ske.CRINAME_CONTAINERD - defaultNodepoolMachineType = "b1.2" defaultNodepoolMachineImageName = "flatcar" - defaultNodepoolMaxSurge = 1 defaultNodepoolMaxUnavailable = 0 - defaultNodepoolMaximum = 2 defaultNodepoolMinimum = 1 defaultNodepoolName = "pool-default" defaultNodepoolVolumeType = "storage_premium_perf2" @@ -110,22 +107,38 @@ func getDefaultPayloadKubernetes(resp *ske.ProviderOptions) (*ske.Kubernetes, er } func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) { + if resp.AvailabilityZones == nil || len(*resp.AvailabilityZones) == 0 { + return nil, fmt.Errorf("no availability zones found") + } + var availabilityZones []string + for i := range *resp.AvailabilityZones { + azName := (*resp.AvailabilityZones)[i].GetName() + // don't include availability zones like eu01-m, eu02-m, not all flavors are available there + if !regexp.MustCompile(`\w{2}\d{2}-m`).MatchString(azName) { + availabilityZones = append(availabilityZones, azName) + } + } + + if resp.MachineTypes == nil || len(*resp.MachineTypes) == 0 { + return nil, fmt.Errorf("no machine types found") + } + machineType := (*resp.MachineTypes)[0].GetName() + output := &ske.Nodepool{ - AvailabilityZones: &[]string{ - defaultNodepoolAvailabilityZone, - }, + AvailabilityZones: &availabilityZones, Cri: &ske.CRI{ Name: utils.Ptr(defaultNodepoolCRI), }, Machine: &ske.Machine{ - Type: utils.Ptr(defaultNodepoolMachineType), + Type: &machineType, Image: &ske.Image{ Name: utils.Ptr(defaultNodepoolMachineImageName), }, }, - MaxSurge: utils.Ptr(int64(defaultNodepoolMaxSurge)), + // there must be as many nodes as availability zones are given + MaxSurge: utils.Ptr(int64(len(availabilityZones))), MaxUnavailable: utils.Ptr(int64(defaultNodepoolMaxUnavailable)), - Maximum: utils.Ptr(int64(defaultNodepoolMaximum)), + Maximum: utils.Ptr(int64(len(availabilityZones))), Minimum: utils.Ptr(int64(defaultNodepoolMinimum)), Name: utils.Ptr(defaultNodepoolName), Volume: &ske.Volume{ diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index 917d590ae..b150509ec 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -146,6 +146,17 @@ func TestClusterExists(t *testing.T) { func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOptions { providerOptions := &ske.ProviderOptions{ + AvailabilityZones: &[]ske.AvailabilityZone{ + {Name: utils.Ptr("eu01-m")}, + {Name: utils.Ptr("eu01-1")}, + {Name: utils.Ptr("eu01-2")}, + {Name: utils.Ptr("eu01-3")}, + }, + MachineTypes: &[]ske.MachineType{ + { + Name: utils.Ptr("b1.2"), + }, + }, KubernetesVersions: &[]ske.KubernetesVersion{ { State: utils.Ptr("supported"), @@ -263,6 +274,8 @@ func fixtureGetDefaultPayload(mods ...func(*ske.CreateOrUpdateClusterPayload)) * Nodepools: &[]ske.Nodepool{ { AvailabilityZones: &[]string{ + "eu01-1", + "eu01-2", "eu01-3", }, Cri: &ske.CRI{ @@ -275,9 +288,9 @@ func fixtureGetDefaultPayload(mods ...func(*ske.CreateOrUpdateClusterPayload)) * Name: utils.Ptr("flatcar"), }, }, - MaxSurge: utils.Ptr(int64(1)), + MaxSurge: utils.Ptr(int64(3)), MaxUnavailable: utils.Ptr(int64(0)), - Maximum: utils.Ptr(int64(2)), + Maximum: utils.Ptr(int64(3)), Minimum: utils.Ptr(int64(1)), Name: utils.Ptr("pool-default"), Volume: &ske.Volume{ @@ -312,6 +325,34 @@ func TestGetDefaultPayload(t *testing.T) { listProviderOptionsFails: true, isValid: false, }, + { + description: "availability zones nil", + listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { + po.AvailabilityZones = nil + }), + isValid: false, + }, + { + description: "no availability zones", + listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { + po.AvailabilityZones = &[]ske.AvailabilityZone{} + }), + isValid: false, + }, + { + description: "machine types nil", + listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { + po.MachineTypes = nil + }), + isValid: false, + }, + { + description: "no machine types", + listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { + po.MachineTypes = &[]ske.MachineType{} + }), + isValid: false, + }, { description: "no Kubernetes versions 1", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { From cfd42a05e19069bbb067e2a9ce1cce0679e9a603 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Fri, 17 Oct 2025 14:47:56 +0200 Subject: [PATCH 171/422] feat: Print auth login during `stackit auth login` (#1027) * feat: Print auth login during Successfully logged into STACKIT CLI. Signed-off-by: Jorge Turrado * update message Signed-off-by: Jorge Turrado * update message Signed-off-by: Jorge Turrado --------- Signed-off-by: Jorge Turrado --- internal/pkg/auth/user_login.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index 8ac94743e..2ec2040dd 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -244,6 +244,10 @@ func AuthorizeUser(p *print.Printer, isReauthentication bool) error { return fmt.Errorf("open browser to URL %s: %w", authorizationURL, err) } + // Print the link + p.Outputln("Your browser has been opened to visit:\n") + p.Outputf("%s\n\n", authorizationURL) + // Start the blocking web server loop // It will exit when the handlers get fired and call server.Close() p.Debug(print.DebugLevel, "listening for response from authentication server on %s", redirectURL) From 7b0c48d5c0b06051cb8e9b02e3f87b245de66cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 17 Oct 2025 17:19:14 +0200 Subject: [PATCH 172/422] refactor: implement a new output result func to handle json/yaml output in a central place (#1030) --- .github/docs/contribution-guide/cmd.go | 22 +-- internal/cmd/affinity-groups/create/create.go | 22 +-- .../cmd/affinity-groups/describe/describe.go | 22 +-- internal/cmd/affinity-groups/list/list.go | 23 +-- internal/cmd/beta/alb/create/create.go | 21 +-- internal/cmd/beta/alb/describe/describe.go | 55 ++----- internal/cmd/beta/alb/list/list.go | 23 +-- .../alb/observability-credentials/add/add.go | 25 +--- .../describe/describe.go | 28 +--- .../observability-credentials/list/list.go | 22 +-- .../update/update.go | 24 +--- internal/cmd/beta/alb/plans/plans.go | 23 +-- internal/cmd/beta/alb/pool/update/update.go | 21 +-- internal/cmd/beta/alb/quotas/quotas.go | 23 +-- internal/cmd/beta/alb/update/update.go | 21 +-- .../sqlserverflex/database/create/create.go | 22 +-- .../database/describe/describe.go | 22 +-- .../beta/sqlserverflex/database/list/list.go | 23 +-- .../sqlserverflex/instance/create/create.go | 23 +-- .../instance/describe/describe.go | 22 +-- .../beta/sqlserverflex/instance/list/list.go | 23 +-- .../sqlserverflex/instance/update/update.go | 23 +-- .../cmd/beta/sqlserverflex/options/options.go | 70 ++++----- .../beta/sqlserverflex/user/create/create.go | 23 +-- .../sqlserverflex/user/describe/describe.go | 22 +-- .../cmd/beta/sqlserverflex/user/list/list.go | 23 +-- .../user/reset-password/reset_password.go | 22 +-- internal/cmd/config/profile/list/list.go | 22 +-- internal/cmd/dns/record-set/create/create.go | 23 +-- .../cmd/dns/record-set/describe/describe.go | 22 +-- internal/cmd/dns/record-set/list/list.go | 23 +-- internal/cmd/dns/zone/clone/clone.go | 23 +-- internal/cmd/dns/zone/create/create.go | 23 +-- internal/cmd/dns/zone/describe/describe.go | 22 +-- internal/cmd/dns/zone/list/list.go | 24 +--- internal/cmd/git/flavor/list/list.go | 23 +-- internal/cmd/git/instance/create/create.go | 22 +-- .../cmd/git/instance/describe/describe.go | 22 +-- internal/cmd/git/instance/list/list.go | 23 +-- internal/cmd/image/create/create.go | 22 +-- internal/cmd/image/describe/describe.go | 22 +-- internal/cmd/image/list/list.go | 23 +-- internal/cmd/key-pair/create/create.go | 21 +-- internal/cmd/key-pair/list/list.go | 23 +-- internal/cmd/key-pair/update/update.go | 22 +-- .../cmd/load-balancer/describe/describe.go | 50 ++----- internal/cmd/load-balancer/list/list.go | 23 +-- .../observability-credentials/add/add.go | 23 +-- .../describe/describe.go | 23 +-- .../observability-credentials/list/list.go | 23 +-- internal/cmd/load-balancer/quota/quota.go | 24 +--- .../target-pool/describe/describe.go | 135 ++++++++---------- .../cmd/logme/credentials/create/create.go | 22 +-- .../logme/credentials/describe/describe.go | 23 +-- internal/cmd/logme/credentials/list/list.go | 23 +-- internal/cmd/logme/instance/create/create.go | 23 +-- .../cmd/logme/instance/describe/describe.go | 23 +-- internal/cmd/logme/instance/list/list.go | 23 +-- internal/cmd/logme/plans/plans.go | 23 +-- .../cmd/mariadb/credentials/create/create.go | 22 +-- .../mariadb/credentials/describe/describe.go | 23 +-- internal/cmd/mariadb/credentials/list/list.go | 23 +-- .../cmd/mariadb/instance/create/create.go | 23 +-- .../cmd/mariadb/instance/describe/describe.go | 23 +-- internal/cmd/mariadb/instance/list/list.go | 23 +-- internal/cmd/mariadb/plans/plans.go | 23 +-- .../mongodbflex/backup/describe/describe.go | 23 +-- internal/cmd/mongodbflex/backup/list/list.go | 23 +-- .../backup/restore-jobs/restore_jobs.go | 23 +-- .../mongodbflex/backup/schedule/schedule.go | 23 +-- .../cmd/mongodbflex/instance/create/create.go | 23 +-- .../mongodbflex/instance/describe/describe.go | 23 +-- .../cmd/mongodbflex/instance/list/list.go | 23 +-- .../cmd/mongodbflex/instance/update/update.go | 23 +-- internal/cmd/mongodbflex/options/options.go | 22 +-- .../cmd/mongodbflex/user/create/create.go | 23 +-- .../cmd/mongodbflex/user/describe/describe.go | 23 +-- internal/cmd/mongodbflex/user/list/list.go | 23 +-- .../user/reset-password/reset_password.go | 23 +-- internal/cmd/network-area/create/create.go | 23 +-- .../cmd/network-area/describe/describe.go | 22 +-- internal/cmd/network-area/list/list.go | 23 +-- .../network-range/create/create.go | 23 +-- .../network-range/describe/describe.go | 22 +-- .../network-area/network-range/list/list.go | 23 +-- .../cmd/network-area/route/create/create.go | 23 +-- .../network-area/route/describe/describe.go | 23 +-- internal/cmd/network-area/route/list/list.go | 23 +-- .../cmd/network-area/route/update/update.go | 23 +-- internal/cmd/network-area/update/update.go | 23 +-- .../cmd/network-interface/create/create.go | 23 +-- .../network-interface/describe/describe.go | 23 +-- internal/cmd/network-interface/list/list.go | 23 +-- .../cmd/network-interface/update/update.go | 23 +-- internal/cmd/network/create/create.go | 23 +-- internal/cmd/network/describe/describe.go | 23 +-- internal/cmd/network/list/list.go | 23 +-- .../object-storage/bucket/create/create.go | 23 +-- .../bucket/describe/describe.go | 23 +-- .../cmd/object-storage/bucket/list/list.go | 23 +-- .../credentials-group/create/create.go | 23 +-- .../credentials-group/list/list.go | 23 +-- .../credentials/create/create.go | 23 +-- .../object-storage/credentials/list/list.go | 23 +-- .../credentials/create/create.go | 23 +-- .../observability/credentials/list/list.go | 23 +-- .../grafana/describe/describe.go | 23 +-- .../observability/instance/create/create.go | 23 +-- .../instance/describe/describe.go | 23 +-- .../cmd/observability/instance/list/list.go | 23 +-- internal/cmd/observability/plans/plans.go | 23 +-- .../scrape-config/describe/describe.go | 23 +-- .../observability/scrape-config/list/list.go | 23 +-- .../opensearch/credentials/create/create.go | 22 +-- .../credentials/describe/describe.go | 23 +-- .../cmd/opensearch/credentials/list/list.go | 23 +-- .../cmd/opensearch/instance/create/create.go | 23 +-- .../opensearch/instance/describe/describe.go | 23 +-- internal/cmd/opensearch/instance/list/list.go | 23 +-- internal/cmd/opensearch/plans/plans.go | 23 +-- internal/cmd/organization/member/list/list.go | 24 +--- internal/cmd/organization/role/list/list.go | 24 +--- .../postgresflex/backup/describe/describe.go | 23 +-- internal/cmd/postgresflex/backup/list/list.go | 23 +-- .../cmd/postgresflex/instance/clone/clone.go | 22 +-- .../postgresflex/instance/create/create.go | 23 +-- .../instance/describe/describe.go | 23 +-- .../cmd/postgresflex/instance/list/list.go | 23 +-- .../postgresflex/instance/update/update.go | 23 +-- internal/cmd/postgresflex/options/options.go | 50 ++----- .../cmd/postgresflex/user/create/create.go | 22 +-- .../postgresflex/user/describe/describe.go | 23 +-- internal/cmd/postgresflex/user/list/list.go | 23 +-- .../user/reset-password/reset_password.go | 23 +-- internal/cmd/project/create/create.go | 23 +-- internal/cmd/project/describe/describe.go | 22 +-- internal/cmd/project/list/list.go | 23 +-- internal/cmd/project/member/list/list.go | 24 +--- internal/cmd/project/role/list/list.go | 24 +--- internal/cmd/public-ip/create/create.go | 23 +-- internal/cmd/public-ip/describe/describe.go | 24 +--- internal/cmd/public-ip/list/list.go | 23 +-- internal/cmd/public-ip/ranges/list/list.go | 23 +-- internal/cmd/public-ip/update/update.go | 24 +--- internal/cmd/quota/list/list.go | 24 +--- .../cmd/rabbitmq/credentials/create/create.go | 22 +-- .../rabbitmq/credentials/describe/describe.go | 22 +-- .../cmd/rabbitmq/credentials/list/list.go | 23 +-- .../cmd/rabbitmq/instance/create/create.go | 23 +-- .../rabbitmq/instance/describe/describe.go | 22 +-- internal/cmd/rabbitmq/instance/list/list.go | 23 +-- internal/cmd/rabbitmq/plans/plans.go | 23 +-- .../cmd/redis/credentials/create/create.go | 23 +-- .../redis/credentials/describe/describe.go | 22 +-- internal/cmd/redis/credentials/list/list.go | 23 +-- internal/cmd/redis/instance/create/create.go | 22 +-- .../cmd/redis/instance/describe/describe.go | 22 +-- internal/cmd/redis/instance/list/list.go | 23 +-- internal/cmd/redis/plans/plans.go | 23 +-- .../secrets-manager/instance/create/create.go | 23 +-- .../instance/describe/describe.go | 23 +-- .../cmd/secrets-manager/instance/list/list.go | 23 +-- .../cmd/secrets-manager/user/create/create.go | 23 +-- .../secrets-manager/user/describe/describe.go | 23 +-- .../cmd/secrets-manager/user/list/list.go | 23 +-- internal/cmd/security-group/create/create.go | 23 +-- .../cmd/security-group/describe/describe.go | 23 +-- internal/cmd/security-group/list/list.go | 23 +-- .../cmd/security-group/rule/create/create.go | 23 +-- .../security-group/rule/describe/describe.go | 23 +-- internal/cmd/security-group/rule/list/list.go | 23 +-- internal/cmd/server/backup/create/create.go | 23 +-- .../cmd/server/backup/describe/describe.go | 23 +-- internal/cmd/server/backup/list/list.go | 23 +-- .../server/backup/schedule/create/create.go | 23 +-- .../backup/schedule/describe/describe.go | 23 +-- .../cmd/server/backup/schedule/list/list.go | 23 +-- .../server/backup/schedule/update/update.go | 23 +-- internal/cmd/server/command/create/create.go | 23 +-- .../cmd/server/command/describe/describe.go | 23 +-- internal/cmd/server/command/list/list.go | 23 +-- .../command/template/describe/describe.go | 23 +-- .../cmd/server/command/template/list/list.go | 23 +-- internal/cmd/server/console/console.go | 23 +-- internal/cmd/server/create/create.go | 23 +-- internal/cmd/server/log/log.go | 23 +-- .../server/machine-type/describe/describe.go | 24 +--- internal/cmd/server/machine-type/list/list.go | 23 +-- .../cmd/server/network-interface/list/list.go | 23 +-- .../cmd/server/os-update/create/create.go | 23 +-- .../cmd/server/os-update/describe/describe.go | 23 +-- internal/cmd/server/os-update/list/list.go | 23 +-- .../os-update/schedule/create/create.go | 23 +-- .../os-update/schedule/describe/describe.go | 23 +-- .../server/os-update/schedule/list/list.go | 23 +-- .../os-update/schedule/update/update.go | 23 +-- .../server/service-account/attach/attach.go | 23 +-- .../server/service-account/detach/detach.go | 23 +-- .../cmd/server/service-account/list/list.go | 23 +-- internal/cmd/server/update/update.go | 24 +--- internal/cmd/server/volume/attach/attach.go | 23 +-- .../cmd/server/volume/describe/describe.go | 23 +-- internal/cmd/server/volume/list/list.go | 23 +-- internal/cmd/server/volume/update/update.go | 23 +-- internal/cmd/service-account/create/create.go | 23 +-- internal/cmd/service-account/key/list/list.go | 23 +-- internal/cmd/service-account/list/list.go | 22 +-- .../service-account/token/create/create.go | 23 +-- .../cmd/service-account/token/list/list.go | 23 +-- internal/cmd/ske/cluster/create/create.go | 22 +-- internal/cmd/ske/cluster/describe/describe.go | 23 +-- internal/cmd/ske/cluster/list/list.go | 23 +-- internal/cmd/ske/cluster/update/update.go | 22 +-- internal/cmd/ske/describe/describe.go | 23 +-- internal/cmd/ske/options/options.go | 21 +-- internal/cmd/volume/backup/create/create.go | 23 +-- .../cmd/volume/backup/describe/describe.go | 23 +-- internal/cmd/volume/backup/list/list.go | 23 +-- internal/cmd/volume/backup/update/update.go | 23 +-- internal/cmd/volume/create/create.go | 23 +-- internal/cmd/volume/describe/describe.go | 24 +--- internal/cmd/volume/list/list.go | 23 +-- .../performance-class/describe/describe.go | 24 +--- .../cmd/volume/performance-class/list/list.go | 23 +-- .../cmd/volume/snapshot/describe/describe.go | 23 +-- internal/cmd/volume/snapshot/list/list.go | 23 +-- internal/cmd/volume/update/update.go | 24 +--- internal/pkg/print/print.go | 26 ++++ internal/pkg/print/print_test.go | 76 ++++++++++ 229 files changed, 686 insertions(+), 4859 deletions(-) diff --git a/.github/docs/contribution-guide/cmd.go b/.github/docs/contribution-guide/cmd.go index 286d6240d..1373ebbb0 100644 --- a/.github/docs/contribution-guide/cmd.go +++ b/.github/docs/contribution-guide/cmd.go @@ -2,7 +2,6 @@ package bar import ( "context" - "encoding/json" "fmt" "github.com/spf13/cobra" @@ -17,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "gopkg.in/yaml.v2" // (...) ) @@ -118,22 +116,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *foo.APIClie // Output result based on the configured output format func outputResult(p *print.Printer, cmd *cobra.Command, outputFormat string, resources []foo.Resource) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resources, "", " ") - if err != nil { - return fmt.Errorf("marshal resource list: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.Marshal(resources) - if err != nil { - return fmt.Errorf("marshal resource list: %w", err) - } - p.Outputln(string(details)) - return nil - default: + // the output result handles JSON/YAML output, you can pass your own callback func for pretty (default) output format + return p.OutputResult(outputFormat, resources, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATE") for i := range resources { @@ -145,5 +129,5 @@ func outputResult(p *print.Printer, cmd *cobra.Command, outputFormat string, res return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index 03a4354f9..30daf9339 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -121,21 +119,9 @@ func outputResult(p *print.Printer, model inputModel, resp iaas.AffinityGroup) e if model.GlobalFlagModel != nil { outputFormat = model.GlobalFlagModel.OutputFormat } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal affinity group: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal affinity group: %w", err) - } - p.Outputln(string(details)) - default: + + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created affinity group %q with id %s\n", model.Name, utils.PtrString(resp.Id)) - } - return nil + return nil + }) } diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 936db9605..7af292d74 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -93,20 +91,8 @@ func outputResult(p *print.Printer, model inputModel, resp iaas.AffinityGroup) e if model.GlobalFlagModel != nil { outputFormat = model.GlobalFlagModel.OutputFormat } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal affinity group: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal affinity group: %w", err) - } - p.Outputln(string(details)) - default: + + return p.OutputResult(outputFormat, resp, func() error { table := tables.NewTable() if resp.HasId() { @@ -129,6 +115,6 @@ func outputResult(p *print.Printer, model inputModel, resp iaas.AffinityGroup) e if err := table.Display(p); err != nil { return fmt.Errorf("render table: %w", err) } - } - return nil + return nil + }) } diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 58269d898..36ae4f28c 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -115,20 +113,8 @@ func outputResult(p *print.Printer, model inputModel, items []iaas.AffinityGroup if model.GlobalFlagModel != nil { outputFormat = model.GlobalFlagModel.OutputFormat } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(items, "", " ") - if err != nil { - return fmt.Errorf("marshal affinity groups: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(items, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal affinity groups: %w", err) - } - p.Outputln(string(details)) - default: + + return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "POLICY") for _, item := range items { @@ -143,6 +129,7 @@ func outputResult(p *print.Printer, model inputModel, items []iaas.AffinityGroup if err := table.Display(p); err != nil { return fmt.Errorf("render table: %w", err) } - } - return nil + + return nil + }) } diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index a9113a5f0..64d3c2871 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -162,29 +162,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if resp == nil { return fmt.Errorf("create loadbalancer response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal loadbalancer: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal loadbalancer: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s application loadbalancer for %q. Name: %s\n", operationState, projectLabel, utils.PtrString(resp.Name)) return nil - } + }) } diff --git a/internal/cmd/beta/alb/describe/describe.go b/internal/cmd/beta/alb/describe/describe.go index 8d61212a3..bccca2ace 100644 --- a/internal/cmd/beta/alb/describe/describe.go +++ b/internal/cmd/beta/alb/describe/describe.go @@ -2,7 +2,6 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" @@ -16,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -89,54 +87,27 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie return apiClient.GetLoadBalancer(ctx, model.ProjectId, model.Region, model.Name) } -func outputResult(p *print.Printer, outputFormat string, response *alb.LoadBalancer) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(response, "", " ") +func outputResult(p *print.Printer, outputFormat string, loadbalancer *alb.LoadBalancer) error { + return p.OutputResult(outputFormat, loadbalancer, func() error { + content := []tables.Table{} - if err != nil { - return fmt.Errorf("marshal loadbalancer: %w", err) + content = append(content, buildLoadBalancerTable(loadbalancer)) + + if loadbalancer.Listeners != nil { + content = append(content, buildListenersTable(*loadbalancer.Listeners)) } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(response, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if loadbalancer.TargetPools != nil { + content = append(content, buildTargetPoolsTable(*loadbalancer.TargetPools)) + } + err := tables.DisplayTables(p, content) if err != nil { - return fmt.Errorf("marshal loadbalancer: %w", err) + return fmt.Errorf("display output: %w", err) } - p.Outputln(string(details)) return nil - default: - if err := outputResultAsTable(p, response); err != nil { - return err - } - } - - return nil -} - -func outputResultAsTable(p *print.Printer, loadbalancer *alb.LoadBalancer) error { - content := []tables.Table{} - - content = append(content, buildLoadBalancerTable(loadbalancer)) - - if loadbalancer.Listeners != nil { - content = append(content, buildListenersTable(*loadbalancer.Listeners)) - } - - if loadbalancer.TargetPools != nil { - content = append(content, buildTargetPoolsTable(*loadbalancer.TargetPools)) - } - - err := tables.DisplayTables(p, content) - if err != nil { - return fmt.Errorf("display output: %w", err) - } - - return nil + }) } func buildLoadBalancerTable(loadbalancer *alb.LoadBalancer) tables.Table { diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index 7958a1ad8..a16443730 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -128,24 +126,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie return request } func outputResult(p *print.Printer, outputFormat string, items []alb.LoadBalancer) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(items, "", " ") - if err != nil { - return fmt.Errorf("marshal loadbalancer list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(items, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal loadbalancer list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() table.SetHeader("NAME", "EXTERNAL ADDRESS", "REGION", "STATUS", "VERSION", "ERRORS") for i := range items { @@ -169,5 +150,5 @@ func outputResult(p *print.Printer, outputFormat string, items []alb.LoadBalance } return nil - } + }) } diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index 7b623ef16..8fd15d81d 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -2,7 +2,6 @@ package add import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -13,7 +12,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -115,25 +113,10 @@ func outputResult(p *print.Printer, outputFormat string, item *alb.CreateCredent return fmt.Errorf("no credential found") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(item, "", " ") - if err != nil { - return fmt.Errorf("marshal credential: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(item, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal credential: %w", err) - } - p.Outputln(string(details)) - default: + return p.OutputResult(outputFormat, item, func() error { if item.Credential != nil { - p.Outputf("Created credential %s\n", - utils.PtrString(item.Credential.CredentialsRef), - ) + p.Outputf("Created credential %s\n", utils.PtrString(item.Credential.CredentialsRef)) } - } - return nil + return nil + }) } diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe.go b/internal/cmd/beta/alb/observability-credentials/describe/describe.go index 882ac0a02..2ebf96e4a 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe.go @@ -2,7 +2,6 @@ package describe import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,7 +14,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -89,26 +87,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie } func outputResult(p *print.Printer, outputFormat string, response alb.CredentialsResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(response, "", " ") - - if err != nil { - return fmt.Errorf("marshal credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(response, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - - if err != nil { - return fmt.Errorf("marshal credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, response, func() error { table := tables.NewTable() table.AddRow("CREDENTIAL REF", utils.PtrString(response.CredentialsRef)) table.AddSeparator() @@ -120,7 +99,6 @@ func outputResult(p *print.Printer, outputFormat string, response alb.Credential table.AddSeparator() p.Outputln(table.Render()) - } - - return nil + return nil + }) } diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index 613ba9c24..dace68982 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -2,7 +2,6 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -17,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -122,22 +120,8 @@ func outputResult(p *print.Printer, outputFormat string, items []alb.Credentials p.Outputln("no credentials found") return nil } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(items, "", " ") - if err != nil { - return fmt.Errorf("marshal credentials: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(items, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal credentials: %w", err) - } - p.Outputln(string(details)) - default: + return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() table.SetHeader("CREDENTIAL REF", "DISPLAYNAME", "USERNAME", "REGION") @@ -151,6 +135,6 @@ func outputResult(p *print.Printer, outputFormat string, items []alb.Credentials } p.Outputln(table.Render()) - } - return nil + return nil + }) } diff --git a/internal/cmd/beta/alb/observability-credentials/update/update.go b/internal/cmd/beta/alb/observability-credentials/update/update.go index e9ff003e8..703fe12a7 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update.go @@ -2,7 +2,6 @@ package update import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,7 +14,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -132,23 +130,11 @@ func outputResult(p *print.Printer, model inputModel, response *alb.UpdateCreden outputFormat = model.GlobalFlagModel.OutputFormat } if response == nil { - return fmt.Errorf("no response passewd") + return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(response.Credential, "", " ") - if err != nil { - return fmt.Errorf("marshal credential: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(response.Credential, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal credential: %w", err) - } - p.Outputln(string(details)) - default: + + return p.OutputResult(outputFormat, response.Credential, func() error { p.Outputf("Updated credential %q\n", utils.PtrString(model.CredentialsRef)) - } - return nil + return nil + }) } diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index b6698ce2e..55c4ab6c5 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -2,10 +2,8 @@ package plans import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -101,24 +99,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie } func outputResult(p *print.Printer, outputFormat string, items []alb.PlanDetails) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(items, "", " ") - if err != nil { - return fmt.Errorf("marshal plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(items, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() table.SetHeader("PLAN ID", "NAME", "FLAVOR", "MAX CONNS", "DESCRIPTION") for _, item := range items { @@ -135,5 +116,5 @@ func outputResult(p *print.Printer, outputFormat string, items []alb.PlanDetails } return nil - } + }) } diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index 857ae2a44..a3a8aa983 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -156,29 +156,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if resp == nil { return fmt.Errorf("update target pool response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal target pool: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal target pool: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Updated" if model.Async { operationState = "Triggered update of" } p.Outputf("%s application target pool for %q. Name: %s\n", operationState, projectLabel, utils.PtrString(resp.Name)) return nil - } + }) } diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index 3eec45f7d..9b2729c29 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -2,10 +2,8 @@ package quotas import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -93,24 +91,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie } func outputResult(p *print.Printer, outputFormat string, response alb.GetQuotaResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(response, "", " ") - if err != nil { - return fmt.Errorf("marshal quotas: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(response, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal quotas: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, response, func() error { table := tables.NewTable() table.AddRow("REGION", utils.PtrString(response.Region)) table.AddSeparator() @@ -121,5 +102,5 @@ func outputResult(p *print.Printer, outputFormat string, response alb.GetQuotaRe } return nil - } + }) } diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 6040762a5..a8b32b156 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -192,29 +192,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if resp == nil { return fmt.Errorf("update loadbalancer response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal loadbalancer: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal loadbalancer: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Updated" if model.Async { operationState = "Triggered update of" } p.Outputf("%s application loadbalancer for %q. Name: %s\n", operationState, projectLabel, utils.PtrString(resp.Name)) return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index d643d8da7..8b20bb219 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -129,25 +127,9 @@ func outputResult(p *print.Printer, outputFormat, databaseName string, resp *sql if resp == nil { return fmt.Errorf("sqlserverflex response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex database: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex database: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created database %q\n", databaseName) return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index 7c460f3e5..ef4afa8fc 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -106,24 +104,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *sqlserverflex.Get if resp == nil || resp.Database == nil { return fmt.Errorf("database response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex database: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex database: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { database := resp.Database table := tables.NewTable() table.AddRow("ID", utils.PtrString(database.Id)) @@ -149,5 +131,5 @@ func outputResult(p *print.Printer, outputFormat string, resp *sqlserverflex.Get } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index f8675f0b9..990946dad 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -130,24 +128,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl } func outputResult(p *print.Printer, outputFormat string, databases []sqlserverflex.Database) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(databases, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex database list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(databases, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex database list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, databases, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME") for i := range databases { @@ -160,5 +141,5 @@ func outputResult(p *print.Printer, outputFormat string, databases []sqlserverfl } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 4b31bef84..9acc361b7 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -264,29 +262,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if resp == nil { return fmt.Errorf("sqlserverflex response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServerFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServerFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go index bed2f269c..d978bcf97 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -95,24 +93,8 @@ func outputResult(p *print.Printer, outputFormat string, instance *sqlserverflex if instance == nil { return fmt.Errorf("instance response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex instance: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { var acls string if instance.Acl != nil && instance.Acl.HasItems() { aclsArray := *instance.Acl.Items @@ -150,5 +132,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *sqlserverflex } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 3b97b8dcb..3e8606347 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl } func outputResult(p *print.Printer, outputFormat string, instances []sqlserverflex.InstanceListInstance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS") for i := range instances { @@ -157,5 +138,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []sqlserverfl } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index 68e76cf25..ec06d020a 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -2,11 +2,9 @@ package update import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -248,29 +246,12 @@ func outputResult(p *print.Printer, model *inputModel, instanceLabel string, res if resp == nil { return fmt.Errorf("instance response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal update SQLServerFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal update SQLServerFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Updated" if model.Async { operationState = "Triggered update of" } p.Info("%s instance %q\n", operationState, instanceLabel) return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index f288fd27d..a6c126e8b 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -2,10 +2,8 @@ package options import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -276,55 +274,35 @@ func outputResult(p *print.Printer, model *inputModel, flavors *sqlserverflex.Li } } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(options, "", " ") - if err != nil { - return fmt.Errorf("marshal SQL Server Flex options: %w", err) + return p.OutputResult(model.OutputFormat, options, func() error { + content := []tables.Table{} + if model.Flavors && len(*options.Flavors) != 0 { + content = append(content, buildFlavorsTable(*options.Flavors)) } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(options, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if model.Versions && len(*options.Versions) != 0 { + content = append(content, buildVersionsTable(*options.Versions)) + } + if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) != 0 { + content = append(content, buildStoragesTable(*options.Storages.Storages)) + } + if model.UserRoles && len(options.UserRoles.UserRoles) != 0 { + content = append(content, buildUserRoles(options.UserRoles)) + } + if model.DBCompatibilities && len(options.DBCompatibilities.DBCompatibilities) != 0 { + content = append(content, buildDBCompatibilitiesTable(options.DBCompatibilities.DBCompatibilities)) + } + // Rendered at last because table is very long + if model.DBCollations && len(options.DBCollations.DBCollations) != 0 { + content = append(content, buildDBCollationsTable(options.DBCollations.DBCollations)) + } + + err := tables.DisplayTables(p, content) if err != nil { - return fmt.Errorf("marshal SQL Server Flex options: %w", err) + return fmt.Errorf("display output: %w", err) } - p.Outputln(string(details)) return nil - default: - return outputResultAsTable(p, model, options) - } -} - -func outputResultAsTable(p *print.Printer, model *inputModel, options *options) error { - content := []tables.Table{} - if model.Flavors && len(*options.Flavors) != 0 { - content = append(content, buildFlavorsTable(*options.Flavors)) - } - if model.Versions && len(*options.Versions) != 0 { - content = append(content, buildVersionsTable(*options.Versions)) - } - if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) != 0 { - content = append(content, buildStoragesTable(*options.Storages.Storages)) - } - if model.UserRoles && len(options.UserRoles.UserRoles) != 0 { - content = append(content, buildUserRoles(options.UserRoles)) - } - if model.DBCompatibilities && len(options.DBCompatibilities.DBCompatibilities) != 0 { - content = append(content, buildDBCompatibilitiesTable(options.DBCompatibilities.DBCompatibilities)) - } - // Rendered at last because table is very long - if model.DBCollations && len(options.DBCollations.DBCollations) != 0 { - content = append(content, buildDBCollationsTable(options.DBCollations.DBCollations)) - } - - err := tables.DisplayTables(p, content) - if err != nil { - return fmt.Errorf("display output: %w", err) - } - - return nil + }) } func buildFlavorsTable(flavors []sqlserverflex.InstanceFlavorEntry) tables.Table { diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 92e4a1127..cb159965f 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -140,24 +138,7 @@ func outputResult(p *print.Printer, model *inputModel, instanceLabel string, use if user == nil { return fmt.Errorf("user response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, user, func() error { p.Outputf("Created user for instance %q. User ID: %s\n\n", instanceLabel, utils.PtrString(user.Id)) p.Outputf("Username: %s\n", utils.PtrString(user.Username)) p.Outputf("Password: %s\n", utils.PtrString(user.Password)) @@ -175,5 +156,5 @@ func outputResult(p *print.Printer, model *inputModel, instanceLabel string, use } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe.go b/internal/cmd/beta/sqlserverflex/user/describe/describe.go index cd4efd01b..93d97acc4 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -115,24 +113,8 @@ func outputResult(p *print.Printer, outputFormat string, user *sqlserverflex.Use if user == nil { return fmt.Errorf("user response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex user: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, user, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(user.Id)) table.AddSeparator() @@ -160,5 +142,5 @@ func outputResult(p *print.Printer, outputFormat string, user *sqlserverflex.Use } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index 022aade17..08950270e 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -131,24 +129,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl } func outputResult(p *print.Printer, outputFormat string, users []sqlserverflex.InstanceListUser) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(users, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex user list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(users, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex user list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, users, func() error { table := tables.NewTable() table.SetHeader("ID", "USERNAME") for i := range users { @@ -164,5 +145,5 @@ func outputResult(p *print.Printer, outputFormat string, users []sqlserverflex.I } return nil - } + }) } diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index 027ba4b44..b56538eec 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -2,10 +2,8 @@ package resetpassword import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -130,24 +128,8 @@ func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel strin if user == nil { return fmt.Errorf("single user response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal SQLServer Flex reset password: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SQLServer Flex reset password: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, user, func() error { p.Outputf("Reset password for user %q of instance %q\n\n", userLabel, instanceLabel) p.Outputf("Username: %s\n", utils.PtrString(user.Username)) p.Outputf("New password: %s\n", utils.PtrString(user.Password)) @@ -155,5 +137,5 @@ func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel strin p.Outputf("New URI: %s\n", *user.Uri) } return nil - } + }) } diff --git a/internal/cmd/config/profile/list/list.go b/internal/cmd/config/profile/list/list.go index 86e2f3341..fe90d4619 100644 --- a/internal/cmd/config/profile/list/list.go +++ b/internal/cmd/config/profile/list/list.go @@ -1,11 +1,8 @@ package list import ( - "encoding/json" "fmt" - "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" @@ -93,22 +90,7 @@ func buildOutput(profiles []string, activeProfile string) []profileInfo { } func outputResult(p *print.Printer, outputFormat string, profiles []profileInfo) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(profiles, "", " ") - if err != nil { - return fmt.Errorf("marshal config list: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(profiles, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal config list: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, profiles, func() error { table := tables.NewTable() table.SetHeader("NAME", "ACTIVE", "EMAIL") for _, profile := range profiles { @@ -129,5 +111,5 @@ func outputResult(p *print.Printer, outputFormat string, profiles []profileInfo) return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index c1fae768e..1320248d4 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -182,29 +180,12 @@ func outputResult(p *print.Printer, model *inputModel, zoneLabel string, resp *d if resp == nil { return fmt.Errorf("record set response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS record-set: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS record-set: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s record set for zone %s. Record set ID: %s\n", operationState, zoneLabel, utils.PtrString(resp.Rrset.Id)) return nil - } + }) } diff --git a/internal/cmd/dns/record-set/describe/describe.go b/internal/cmd/dns/record-set/describe/describe.go index ceaf1a9d9..c84e0ab7a 100644 --- a/internal/cmd/dns/record-set/describe/describe.go +++ b/internal/cmd/dns/record-set/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -110,24 +108,8 @@ func outputResult(p *print.Printer, outputFormat string, recordSet *dns.RecordSe if recordSet == nil { return fmt.Errorf("record set response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(recordSet, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS record set: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(recordSet, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS record set: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, recordSet, func() error { recordsData := make([]string, 0, len(*recordSet.Records)) for _, r := range *recordSet.Records { recordsData = append(recordsData, *r.Content) @@ -152,5 +134,5 @@ func outputResult(p *print.Printer, outputFormat string, recordSet *dns.RecordSe } return nil - } + }) } diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index cafaf9921..1d9093de7 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "math" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -242,24 +240,7 @@ func fetchRecordSets(ctx context.Context, model *inputModel, apiClient dnsClient } func outputResult(p *print.Printer, outputFormat string, recordSets []dns.RecordSet) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(recordSets, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS record set list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(recordSets, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS record set list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, recordSets, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS", "TTL", "TYPE", "RECORD DATA") for i := range recordSets { @@ -284,5 +265,5 @@ func outputResult(p *print.Printer, outputFormat string, recordSets []dns.Record } return nil - } + }) } diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index c8292c59f..a50b2fd73 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -2,10 +2,8 @@ package clone import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -156,29 +154,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if resp == nil { return fmt.Errorf("dns zone response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS zone: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS zone: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Cloned" if model.Async { operationState = "Triggered cloning of" } p.Outputf("%s zone for project %q. Zone ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Zone.Id)) return nil - } + }) } diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index ebcbc273e..a28e05622 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -203,29 +201,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp if resp == nil { return fmt.Errorf("dns zone response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS zone: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS zone: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s zone for project %q. Zone ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Zone.Id)) return nil - } + }) } diff --git a/internal/cmd/dns/zone/describe/describe.go b/internal/cmd/dns/zone/describe/describe.go index 0caf4ab55..94ccafde1 100644 --- a/internal/cmd/dns/zone/describe/describe.go +++ b/internal/cmd/dns/zone/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -95,24 +93,8 @@ func outputResult(p *print.Printer, outputFormat string, zone *dns.Zone) error { if zone == nil { return fmt.Errorf("zone response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(zone, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS zone: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(zone, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS zone: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, zone, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(zone.Id)) table.AddSeparator() @@ -149,5 +131,5 @@ func outputResult(p *print.Printer, outputFormat string, zone *dns.Zone) error { } return nil - } + }) } diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index c61e58e3f..d39cea62e 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "math" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -231,25 +229,7 @@ func fetchZones(ctx context.Context, model *inputModel, apiClient dnsClient) ([] } func outputResult(p *print.Printer, outputFormat string, zones []dns.Zone) error { - switch outputFormat { - case print.JSONOutputFormat: - // Show details - details, err := json.MarshalIndent(zones, "", " ") - if err != nil { - return fmt.Errorf("marshal DNS zone list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(zones, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal DNS zone list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, zones, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATE", "TYPE", "DNS NAME", "RECORD COUNT") for i := range zones { @@ -268,5 +248,5 @@ func outputResult(p *print.Printer, outputFormat string, zones []dns.Zone) error } return nil - } + }) } diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index c562a6b67..2b2a5039e 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -113,24 +111,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClie } func outputResult(p *print.Printer, outputFormat string, flavors []git.Flavor) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(flavors, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability flavor list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(flavors, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability flavor list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, flavors, func() error { table := tables.NewTable() table.SetHeader("ID", "DESCRIPTION", "DISPLAY_NAME", "AVAILABLE", "SKU") for i := range flavors { @@ -149,5 +130,5 @@ func outputResult(p *print.Printer, outputFormat string, flavors []git.Flavor) e } return nil - } + }) } diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index 15a46c1fc..d94b99112 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -154,25 +152,9 @@ func outputResult(p *print.Printer, model *inputModel, resp *git.Instance) error if model.GlobalFlagModel != nil { outputFormat = model.OutputFormat } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal instance: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal iminstanceage: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created instance %q with id %s\n", model.Name, utils.PtrString(model.Id)) return nil - } + }) } diff --git a/internal/cmd/git/instance/describe/describe.go b/internal/cmd/git/instance/describe/describe.go index 08d9611ae..57bd8e859 100644 --- a/internal/cmd/git/instance/describe/describe.go +++ b/internal/cmd/git/instance/describe/describe.go @@ -2,12 +2,10 @@ package describe import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -91,24 +89,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *git.Instance) err if resp == nil { return fmt.Errorf("instance not found") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal instance: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { table := tables.NewTable() if id := resp.Id; id != nil { table.AddRow("ID", *id) @@ -140,5 +122,5 @@ func outputResult(p *print.Printer, outputFormat string, resp *git.Instance) err } return nil - } + }) } diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index f0dd2d07b..a31337551 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -114,24 +112,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClie } func outputResult(p *print.Printer, outputFormat string, instances []git.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "URL", "VERSION", "STATE", "CREATED") for i := range instances { @@ -151,5 +132,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []git.Instanc } return nil - } + }) } diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index fbfe766aa..58be504a8 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -3,7 +3,6 @@ package create import ( "bufio" "context" - "encoding/json" goerrors "errors" "fmt" "io" @@ -11,7 +10,6 @@ import ( "os" "time" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -403,25 +401,9 @@ func outputResult(p *print.Printer, model *inputModel, resp *iaas.ImageCreateRes if model.GlobalFlagModel != nil { outputFormat = model.OutputFormat } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal image: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal image: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created image %q with id %s\n", model.Name, utils.PtrString(model.Id)) return nil - } + }) } diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index 0a8af40bb..b6d81e06d 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -92,24 +90,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.Image) error if resp == nil { return fmt.Errorf("image not found") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal image: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal image: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { table := tables.NewTable() if id := resp.Id; id != nil { table.AddRow("ID", *id) @@ -169,5 +151,5 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.Image) error } return nil - } + }) } diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index cb19bd651..bac3f9c97 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -138,24 +136,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return request } func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(items, "", " ") - if err != nil { - return fmt.Errorf("marshal image list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(items, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal image list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "OS", "ARCHITECTURE", "DISTRIBUTION", "VERSION", "LABELS") for i := range items { @@ -194,5 +175,5 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err } return nil - } + }) } diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index 64c0a63b9..acb8a0f29 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -2,7 +2,6 @@ package create import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -13,7 +12,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -130,24 +128,11 @@ func outputResult(p *print.Printer, outputFormat string, item *iaas.Keypair) err return fmt.Errorf("no key pair found") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(item, "", " ") - if err != nil { - return fmt.Errorf("marshal key pair: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(item, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal key pair: %w", err) - } - p.Outputln(string(details)) - default: + return p.OutputResult(outputFormat, item, func() error { p.Outputf("Created key pair %q.\nkey pair Fingerprint: %q\n", utils.PtrString(item.Name), utils.PtrString(item.Fingerprint), ) - } - return nil + return nil + }) } diff --git a/internal/cmd/key-pair/list/list.go b/internal/cmd/key-pair/list/list.go index e185d6767..68134bb02 100644 --- a/internal/cmd/key-pair/list/list.go +++ b/internal/cmd/key-pair/list/list.go @@ -2,7 +2,6 @@ package list import ( "context" - "encoding/json" "fmt" "strings" @@ -18,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -130,22 +128,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, keyPairs []iaas.Keypair) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(keyPairs, "", " ") - if err != nil { - return fmt.Errorf("marshal key pairs: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(keyPairs, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal key pairs: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, keyPairs, func() error { table := tables.NewTable() table.SetHeader("KEY PAIR NAME", "LABELS", "FINGERPRINT", "CREATED AT", "UPDATED AT") @@ -169,6 +152,6 @@ func outputResult(p *print.Printer, outputFormat string, keyPairs []iaas.Keypair } p.Outputln(table.Render()) - } - return nil + return nil + }) } diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index 2da8a409c..10bce6606 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -2,7 +2,6 @@ package update import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -14,7 +13,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -112,21 +110,9 @@ func outputResult(p *print.Printer, model inputModel, keyPair iaas.Keypair) erro if model.GlobalFlagModel != nil { outputFormat = model.GlobalFlagModel.OutputFormat } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(keyPair, "", " ") - if err != nil { - return fmt.Errorf("marshal key pair: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(keyPair, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal key pair: %w", err) - } - p.Outputln(string(details)) - default: + + return p.OutputResult(outputFormat, keyPair, func() error { p.Outputf("Updated labels of key pair %q\n", utils.PtrString(model.KeyPairName)) - } - return nil + return nil + }) } diff --git a/internal/cmd/load-balancer/describe/describe.go b/internal/cmd/load-balancer/describe/describe.go index df1403a14..5879fb8f3 100644 --- a/internal/cmd/load-balancer/describe/describe.go +++ b/internal/cmd/load-balancer/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -95,47 +93,25 @@ func outputResult(p *print.Printer, outputFormat string, loadBalancer *loadbalan if loadBalancer == nil { return fmt.Errorf("loadbalancer response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(loadBalancer, "", " ") - if err != nil { - return fmt.Errorf("marshal load balancer: %w", err) + + return p.OutputResult(outputFormat, loadBalancer, func() error { + content := []tables.Table{} + content = append(content, buildLoadBalancerTable(loadBalancer)) + + if loadBalancer.Listeners != nil { + content = append(content, buildListenersTable(*loadBalancer.Listeners)) + } + if loadBalancer.TargetPools != nil { + content = append(content, buildTargetPoolsTable(*loadBalancer.TargetPools)) } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(loadBalancer, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + err := tables.DisplayTables(p, content) if err != nil { - return fmt.Errorf("marshal load balancer: %w", err) + return fmt.Errorf("display output: %w", err) } - p.Outputln(string(details)) return nil - default: - return outputResultAsTable(p, loadBalancer) - } -} - -func outputResultAsTable(p *print.Printer, loadBalancer *loadbalancer.LoadBalancer) error { - content := []tables.Table{} - - content = append(content, buildLoadBalancerTable(loadBalancer)) - - if loadBalancer.Listeners != nil { - content = append(content, buildListenersTable(*loadBalancer.Listeners)) - } - - if loadBalancer.TargetPools != nil { - content = append(content, buildTargetPoolsTable(*loadBalancer.TargetPools)) - } - - err := tables.DisplayTables(p, content) - if err != nil { - return fmt.Errorf("display output: %w", err) - } - - return nil + }) } func buildLoadBalancerTable(loadBalancer *loadbalancer.LoadBalancer) tables.Table { diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index 511bee335..fa31894eb 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -125,24 +123,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalance } func outputResult(p *print.Printer, outputFormat string, loadBalancers []loadbalancer.LoadBalancer) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(loadBalancers, "", " ") - if err != nil { - return fmt.Errorf("marshal load balancer list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(loadBalancers, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal load balancer list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, loadBalancers, func() error { table := tables.NewTable() table.SetHeader("NAME", "STATE", "IP ADDRESS", "LISTENERS", "TARGET POOLS") for i := range loadBalancers { @@ -170,5 +151,5 @@ func outputResult(p *print.Printer, outputFormat string, loadBalancers []loadbal } return nil - } + }) } diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index 7a2cd20ae..cc2715e82 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -2,10 +2,8 @@ package add import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -142,25 +140,8 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, resp *loa return fmt.Errorf("nil observability credentials response") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Load Balancer observability credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Load Balancer observability credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Added Load Balancer observability credentials on project %q. Credentials reference: %q\n", projectLabel, utils.PtrString(resp.Credential.CredentialsRef)) return nil - } + }) } diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe.go b/internal/cmd/load-balancer/observability-credentials/describe/describe.go index b9559e90a..d0d741a08 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -89,24 +87,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalance } func outputResult(p *print.Printer, outputFormat string, credentials *loadbalancer.GetCredentialsResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal Load Balancer observability credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Load Balancer observability credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { if credentials == nil || credentials.Credential == nil { return fmt.Errorf("credentials response is empty") } @@ -124,5 +105,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials *loadbalanc } return nil - } + }) } diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 138003fdd..88f3d3607 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -160,24 +158,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *loadbalance } func outputResult(p *print.Printer, outputFormat string, credentials []loadbalancer.CredentialsResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal Load Balancer observability credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Load Balancer observability credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("REFERENCE", "DISPLAY NAME", "USERNAME") for i := range credentials { @@ -190,7 +171,7 @@ func outputResult(p *print.Printer, outputFormat string, credentials []loadbalan } return nil - } + }) } func getFilterOp(used, unused bool) (int, error) { diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index 76b363838..1f84ea3ef 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -2,11 +2,9 @@ package quota import ( "context" - "encoding/json" "fmt" "strconv" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -82,9 +80,8 @@ func outputResult(p *print.Printer, outputFormat string, quota *loadbalancer.Get if quota == nil { return fmt.Errorf("quota response is empty") } - switch outputFormat { - case print.PrettyOutputFormat: + return p.OutputResult(outputFormat, quota, func() error { maxLoadBalancers := "Unlimited" if quota.MaxLoadBalancers != nil && *quota.MaxLoadBalancers != -1 { maxLoadBalancers = strconv.FormatInt(*quota.MaxLoadBalancers, 10) @@ -93,22 +90,5 @@ func outputResult(p *print.Printer, outputFormat string, quota *loadbalancer.Get p.Outputf("Maximum number of load balancers allowed: %s\n", maxLoadBalancers) return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(quota, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal quota: %w", err) - } - p.Outputln(string(details)) - - return nil - default: - details, err := json.MarshalIndent(quota, "", " ") - if err != nil { - return fmt.Errorf("marshal quota: %w", err) - } - - p.Outputln(string(details)) - - return nil - } + }) } diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index ed8eddc51..616323663 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -2,12 +2,10 @@ package describe import ( "context" - "encoding/json" "fmt" "strconv" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -124,90 +122,69 @@ func outputResult(p *print.Printer, outputFormat string, targetPool loadbalancer listener, } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(output, "", " ") - if err != nil { - return fmt.Errorf("marshal load balancer: %w", err) + return p.OutputResult(outputFormat, output, func() error { + sessionPersistence := "None" + if targetPool.SessionPersistence != nil && targetPool.SessionPersistence.UseSourceIpAddress != nil && *targetPool.SessionPersistence.UseSourceIpAddress { + sessionPersistence = "Use Source IP" } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(output, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal load balancer: %w", err) + healthCheckInterval := "-" + healthCheckUnhealthyThreshold := "-" + healthCheckHealthyThreshold := "-" + if targetPool.ActiveHealthCheck != nil { + if targetPool.ActiveHealthCheck.Interval != nil { + healthCheckInterval = *targetPool.ActiveHealthCheck.Interval + } + if targetPool.ActiveHealthCheck.UnhealthyThreshold != nil { + healthCheckUnhealthyThreshold = strconv.FormatInt(*targetPool.ActiveHealthCheck.UnhealthyThreshold, 10) + } + if targetPool.ActiveHealthCheck.HealthyThreshold != nil { + healthCheckHealthyThreshold = strconv.FormatInt(*targetPool.ActiveHealthCheck.HealthyThreshold, 10) + } } - p.Outputln(string(details)) - - return nil - default: - return outputResultAsTable(p, targetPool, listener) - } -} - -func outputResultAsTable(p *print.Printer, targetPool loadbalancer.TargetPool, listener *loadbalancer.Listener) error { - sessionPersistence := "None" - if targetPool.SessionPersistence != nil && targetPool.SessionPersistence.UseSourceIpAddress != nil && *targetPool.SessionPersistence.UseSourceIpAddress { - sessionPersistence = "Use Source IP" - } - healthCheckInterval := "-" - healthCheckUnhealthyThreshold := "-" - healthCheckHealthyThreshold := "-" - if targetPool.ActiveHealthCheck != nil { - if targetPool.ActiveHealthCheck.Interval != nil { - healthCheckInterval = *targetPool.ActiveHealthCheck.Interval - } - if targetPool.ActiveHealthCheck.UnhealthyThreshold != nil { - healthCheckUnhealthyThreshold = strconv.FormatInt(*targetPool.ActiveHealthCheck.UnhealthyThreshold, 10) - } - if targetPool.ActiveHealthCheck.HealthyThreshold != nil { - healthCheckHealthyThreshold = strconv.FormatInt(*targetPool.ActiveHealthCheck.HealthyThreshold, 10) + targets := "-" + if targetPool.Targets != nil { + var targetsSlice []string + for _, target := range *targetPool.Targets { + targetStr := fmt.Sprintf("%s (%s)", *target.DisplayName, *target.Ip) + targetsSlice = append(targetsSlice, targetStr) + } + targets = strings.Join(targetsSlice, "\n") } - } - targets := "-" - if targetPool.Targets != nil { - var targetsSlice []string - for _, target := range *targetPool.Targets { - targetStr := fmt.Sprintf("%s (%s)", *target.DisplayName, *target.Ip) - targetsSlice = append(targetsSlice, targetStr) + listenerStr := "-" + if listener != nil { + listenerStr = fmt.Sprintf("%s (Port:%s, Protocol: %s)", + utils.PtrString(listener.Name), + utils.PtrString(listener.Port), + utils.PtrString(listener.Protocol), + ) } - targets = strings.Join(targetsSlice, "\n") - } - listenerStr := "-" - if listener != nil { - listenerStr = fmt.Sprintf("%s (Port:%s, Protocol: %s)", - utils.PtrString(listener.Name), - utils.PtrString(listener.Port), - utils.PtrString(listener.Protocol), - ) - } - - table := tables.NewTable() - table.AddRow("NAME", utils.PtrString(targetPool.Name)) - table.AddSeparator() - table.AddRow("TARGET PORT", utils.PtrString(targetPool.TargetPort)) - table.AddSeparator() - table.AddRow("ATTACHED LISTENER", listenerStr) - table.AddSeparator() - table.AddRow("TARGETS", targets) - table.AddSeparator() - table.AddRow("SESSION PERSISTENCE", sessionPersistence) - table.AddSeparator() - table.AddRow("HEALTH CHECK INTERVAL", healthCheckInterval) - table.AddSeparator() - table.AddRow("HEALTH CHECK DOWN AFTER", healthCheckUnhealthyThreshold) - table.AddSeparator() - table.AddRow("HEALTH CHECK UP AFTER", healthCheckHealthyThreshold) - table.AddSeparator() - - err := p.PagerDisplay(table.Render()) - if err != nil { - return fmt.Errorf("display output: %w", err) - } + table := tables.NewTable() + table.AddRow("NAME", utils.PtrString(targetPool.Name)) + table.AddSeparator() + table.AddRow("TARGET PORT", utils.PtrString(targetPool.TargetPort)) + table.AddSeparator() + table.AddRow("ATTACHED LISTENER", listenerStr) + table.AddSeparator() + table.AddRow("TARGETS", targets) + table.AddSeparator() + table.AddRow("SESSION PERSISTENCE", sessionPersistence) + table.AddSeparator() + table.AddRow("HEALTH CHECK INTERVAL", healthCheckInterval) + table.AddSeparator() + table.AddRow("HEALTH CHECK DOWN AFTER", healthCheckUnhealthyThreshold) + table.AddSeparator() + table.AddRow("HEALTH CHECK UP AFTER", healthCheckHealthyThreshold) + table.AddSeparator() + + err := p.PagerDisplay(table.Render()) + if err != nil { + return fmt.Errorf("display output: %w", err) + } - return nil + return nil + }) } diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index de6cab21f..4808614e9 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,8 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, inst if !showPassword && resp.HasRaw() && resp.Raw.Credentials != nil { resp.Raw.Credentials.Password = utils.Ptr("hidden") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe credentials: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, utils.PtrString(resp.Id)) // The username field cannot be set by the user so we only display it if it's not returned empty if resp.HasRaw() && resp.Raw.Credentials != nil { @@ -157,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, inst } p.Outputf("URI: %s\n", utils.PtrString(resp.Uri)) return nil - } + }) } diff --git a/internal/cmd/logme/credentials/describe/describe.go b/internal/cmd/logme/credentials/describe/describe.go index 1af434056..7ae74bf7d 100644 --- a/internal/cmd/logme/credentials/describe/describe.go +++ b/internal/cmd/logme/credentials/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -109,24 +107,7 @@ func outputResult(p *print.Printer, outputFormat string, credentials *logme.Cred return fmt.Errorf("credentials is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(credentials.Id)) table.AddSeparator() @@ -148,5 +129,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials *logme.Cred } return nil - } + }) } diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index d9f572e2f..7455b78db 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -129,24 +127,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *logme.APICl } func outputResult(p *print.Printer, outputFormat string, credentials []logme.CredentialsListItem) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("ID") for i := range credentials { @@ -159,5 +140,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials []logme.Cre } return nil - } + }) } diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index 5004c8dfb..aa8f8af04 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "errors" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -249,29 +247,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.InstanceId)) return nil - } + }) } diff --git a/internal/cmd/logme/instance/describe/describe.go b/internal/cmd/logme/instance/describe/describe.go index 9acac7ce7..7b73a108c 100644 --- a/internal/cmd/logme/instance/describe/describe.go +++ b/internal/cmd/logme/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *logme.Instanc return fmt.Errorf("instance is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.InstanceId)) table.AddSeparator() @@ -142,5 +123,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *logme.Instanc } return nil - } + }) } diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index def82f0e0..e1a2a6d6f 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *logme.APICl } func outputResult(p *print.Printer, outputFormat string, instances []logme.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { @@ -165,5 +146,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []logme.Insta } return nil - } + }) } diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index c8b28f0ba..6b58ced4a 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -2,10 +2,8 @@ package plans import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *logme.APICl } func outputResult(p *print.Printer, outputFormat string, plans []logme.Offering) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(plans, "", " ") - if err != nil { - return fmt.Errorf("marshal LogMe plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(plans, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal LogMe plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, plans, func() error { table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { @@ -166,5 +147,5 @@ func outputResult(p *print.Printer, outputFormat string, plans []logme.Offering) } return nil - } + }) } diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index 80077c4ce..3a2fda5da 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -124,24 +122,8 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, inst if !showPassword && resp.HasRaw() && resp.Raw.Credentials != nil { resp.Raw.Credentials.Password = utils.Ptr("hidden") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB credentials list: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, utils.PtrString(resp.Id)) // The username field cannot be set by the user, so we only display it if it's not returned empty if resp.HasRaw() && resp.Raw.Credentials != nil { @@ -158,5 +140,5 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, inst } p.Outputf("URI: %s\n", utils.PtrString(resp.Uri)) return nil - } + }) } diff --git a/internal/cmd/mariadb/credentials/describe/describe.go b/internal/cmd/mariadb/credentials/describe/describe.go index 32d547403..121a9228b 100644 --- a/internal/cmd/mariadb/credentials/describe/describe.go +++ b/internal/cmd/mariadb/credentials/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -109,24 +107,7 @@ func outputResult(p *print.Printer, outputFormat string, credentials *mariadb.Cr return fmt.Errorf("credentials is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(credentials.Id)) table.AddSeparator() @@ -146,5 +127,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials *mariadb.Cr } return nil - } + }) } diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index a113fd11e..4495106be 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -128,24 +126,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mariadb.API } func outputResult(p *print.Printer, outputFormat string, credentials []mariadb.CredentialsListItem) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("ID") for i := range credentials { @@ -158,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials []mariadb.C } return nil - } + }) } diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index e90e6c0d8..a7866f6bb 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "errors" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -249,29 +247,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.InstanceId)) return nil - } + }) } diff --git a/internal/cmd/mariadb/instance/describe/describe.go b/internal/cmd/mariadb/instance/describe/describe.go index 7775584e3..d06c7233c 100644 --- a/internal/cmd/mariadb/instance/describe/describe.go +++ b/internal/cmd/mariadb/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *mariadb.Insta return fmt.Errorf("instance is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.InstanceId)) table.AddSeparator() @@ -144,5 +125,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *mariadb.Insta } return nil - } + }) } diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index e648f7baa..43df97970 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mariadb.API } func outputResult(p *print.Printer, outputFormat string, instances []mariadb.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { @@ -165,5 +146,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []mariadb.Ins } return nil - } + }) } diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index c8b89e937..d5ebcde6d 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -2,10 +2,8 @@ package plans import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mariadb.API } func outputResult(p *print.Printer, outputFormat string, plans []mariadb.Offering) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(plans, "", " ") - if err != nil { - return fmt.Errorf("marshal MariaDB plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(plans, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MariaDB plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, plans, func() error { table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { @@ -166,5 +147,5 @@ func outputResult(p *print.Printer, outputFormat string, plans []mariadb.Offerin } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index e36e875ed..9f4ebe522 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -119,24 +117,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat, restoreStatus string, backup mongodbflex.Backup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backup, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex backup: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex backup: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, backup, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(backup.Id)) table.AddSeparator() @@ -155,5 +136,5 @@ func outputResult(p *print.Printer, outputFormat, restoreStatus string, backup m } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index c15bb538b..bd0bb4d22 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -142,24 +140,7 @@ func outputResult(p *print.Printer, outputFormat string, backups []mongodbflex.B return fmt.Errorf("restore jobs is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backups, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex backups list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backups, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex backups list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, backups, func() error { table := tables.NewTable() table.SetHeader("ID", "CREATED AT", "EXPIRES AT", "BACKUP SIZE", "RESTORE STATUS") for i := range backups { @@ -179,5 +160,5 @@ func outputResult(p *print.Printer, outputFormat string, backups []mongodbflex.B } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 36e3a7ab7..6b8ca07ec 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -2,10 +2,8 @@ package restorejobs import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -132,24 +130,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, restoreJobs []mongodbflex.RestoreInstanceStatus) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(restoreJobs, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex restore jobs list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(restoreJobs, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex restore jobs list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, restoreJobs, func() error { table := tables.NewTable() table.SetHeader("ID", "BACKUP ID", "BACKUP INSTANCE ID", "DATE", "STATUS") for i := range restoreJobs { @@ -169,5 +150,5 @@ func outputResult(p *print.Printer, outputFormat string, restoreJobs []mongodbfl } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index b75275f49..954e1f8d9 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -2,10 +2,8 @@ package schedule import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -119,24 +117,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I output.WeeklySnapshotRetentionWeeks = (*instance.Options)["weeklySnapshotRetentionWeeks"] } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(output, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(output, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, output, func() error { table := tables.NewTable() table.AddRow("BACKUP SCHEDULE (UTC)", output.BackupSchedule) table.AddSeparator() @@ -157,5 +138,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index fae577334..440e19fa8 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -270,29 +268,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe return fmt.Errorf("create instance response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDBFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDBFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index 7c2c296a0..7738ec0fd 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I return fmt.Errorf("instance is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { var instanceType string if instance.HasReplicas() { var err error @@ -168,5 +149,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *mongodbflex.I } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index a901516bf..e11dbb065 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -124,24 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, instances []mongodbflex.InstanceListInstance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS") for i := range instances { @@ -158,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []mongodbflex } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index 3240c7f8e..ff1d61c39 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -2,11 +2,9 @@ package update import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -305,29 +303,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, instanceLab return fmt.Errorf("resp is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal update MongoDBFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal update MongoDBFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Updated" if async { operationState = "Triggered update of" } p.Info("%s instance %q\n", operationState, instanceLabel) return nil - } + }) } diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 513dad9a9..f17de9f9c 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -2,12 +2,10 @@ package options import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -182,25 +180,9 @@ func outputResult(p *print.Printer, model *inputModel, flavors *mongodbflex.List } } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(options, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex options: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(options, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex options: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, options, func() error { return outputResultAsTable(p, model, options) - } + }) } func outputResultAsTable(p *print.Printer, model *inputModel, options *options) error { diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index e1e7a00cf..46d11c50b 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -147,24 +145,7 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, user *mo return fmt.Errorf("user is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { p.Outputf("Created user for instance %q. User ID: %s\n\n", instanceLabel, utils.PtrString(user.Id)) p.Outputf("Username: %s\n", utils.PtrString(user.Username)) p.Outputf("Password: %s\n", utils.PtrString(user.Password)) @@ -175,5 +156,5 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, user *mo p.Outputf("URI: %s\n", utils.PtrString(user.Uri)) return nil - } + }) } diff --git a/internal/cmd/mongodbflex/user/describe/describe.go b/internal/cmd/mongodbflex/user/describe/describe.go index 876b63022..5d9a34b3a 100644 --- a/internal/cmd/mongodbflex/user/describe/describe.go +++ b/internal/cmd/mongodbflex/user/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -111,24 +109,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, user mongodbflex.InstanceResponseUser) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(user.Id)) table.AddSeparator() @@ -148,5 +129,5 @@ func outputResult(p *print.Printer, outputFormat string, user mongodbflex.Instan } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index ef184883f..b4d6eaf28 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -132,24 +130,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex } func outputResult(p *print.Printer, outputFormat string, users []mongodbflex.ListUser) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(users, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex user list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(users, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex user list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, users, func() error { table := tables.NewTable() table.SetHeader("ID", "USERNAME") for i := range users { @@ -165,5 +146,5 @@ func outputResult(p *print.Printer, outputFormat string, users []mongodbflex.Lis } return nil - } + }) } diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index ba0b169c2..cc0fb810d 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -2,10 +2,8 @@ package resetpassword import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -131,28 +129,11 @@ func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel strin return fmt.Errorf("user is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal MongoDB Flex reset password: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal MongoDB Flex reset password: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { p.Outputf("Reset password for user %q of instance %q\n\n", userLabel, instanceLabel) p.Outputf("Username: %s\n", utils.PtrString(user.Username)) p.Outputf("New password: %s\n", utils.PtrString(user.Password)) p.Outputf("New URI: %s\n", utils.PtrString(user.Uri)) return nil - } + }) } diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index e6be49171..4aefc6d5b 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -186,25 +184,8 @@ func outputResult(p *print.Printer, outputFormat, orgLabel string, networkArea * if networkArea == nil { return fmt.Errorf("network area is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkArea, "", " ") - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkArea, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, networkArea, func() error { p.Outputf("Created STACKIT Network Area for organization %q.\nNetwork area ID: %s\n", orgLabel, utils.PtrString(networkArea.AreaId)) return nil - } + }) } diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index 49c28d7ce..b6c086a4b 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -2,12 +2,10 @@ package describe import ( "context" - "encoding/json" "errors" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -126,24 +124,8 @@ func outputResult(p *print.Printer, outputFormat string, networkArea *iaas.Netwo if networkArea == nil { return fmt.Errorf("network area is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkArea, "", " ") - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkArea, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, networkArea, func() error { var routes []string var networkRanges []string @@ -219,5 +201,5 @@ func outputResult(p *print.Printer, outputFormat string, networkArea *iaas.Netwo return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index 94c0ffd8f..6dea71c0e 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -150,24 +148,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, networkAreas []iaas.NetworkArea) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkAreas, "", " ") - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkAreas, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal area: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, networkAreas, func() error { table := tables.NewTable() table.SetHeader("ID", "Name", "Status", "Network Ranges", "# Attached Projects") @@ -191,5 +172,5 @@ func outputResult(p *print.Printer, outputFormat string, networkAreas []iaas.Net p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index 9dbd2878d..9f073bc22 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -132,25 +130,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, networkAreaLabel string, networkRange iaas.NetworkRange) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkRange, "", " ") - if err != nil { - return fmt.Errorf("marshal network range: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkRange, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network range: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, networkRange, func() error { p.Outputf("Created network range for SNA %q.\nNetwork range ID: %s\n", networkAreaLabel, utils.PtrString(networkRange.NetworkRangeId)) return nil - } + }) } diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index a16098a9c..dcc695246 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -105,24 +103,8 @@ func outputResult(p *print.Printer, outputFormat string, networkRange *iaas.Netw if networkRange == nil { return fmt.Errorf("network range is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkRange, "", " ") - if err != nil { - return fmt.Errorf("marshal network range: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkRange, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network range: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, networkRange, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(networkRange.NetworkRangeId)) table.AddSeparator() @@ -133,5 +115,5 @@ func outputResult(p *print.Printer, outputFormat string, networkRange *iaas.Netw return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index cb33cccbe..51f3aeeea 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -134,24 +132,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, networkRanges []iaas.NetworkRange) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkRanges, "", " ") - if err != nil { - return fmt.Errorf("marshal network ranges: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkRanges, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network ranges: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, networkRanges, func() error { table := tables.NewTable() table.SetHeader("ID", "Network Range") @@ -161,5 +142,5 @@ func outputResult(p *print.Printer, outputFormat string, networkRanges []iaas.Ne p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 82e8e9ae4..0dbd0e248 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -150,25 +148,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, networkAreaLabel string, route iaas.Route) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(route, "", " ") - if err != nil { - return fmt.Errorf("marshal static route: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(route, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal static route: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, route, func() error { p.Outputf("Created static route for SNA %q.\nStatic route ID: %s\n", networkAreaLabel, utils.PtrString(route.RouteId)) return nil - } + }) } diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index 89d743d91..2e54ac4c8 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -107,24 +105,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, route iaas.Route) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(route, "", " ") - if err != nil { - return fmt.Errorf("marshal static route: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(route, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal static route: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, route, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(route.RouteId)) table.AddSeparator() @@ -145,5 +126,5 @@ func outputResult(p *print.Printer, outputFormat string, route iaas.Route) error return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index 989de2618..cdc6a67ae 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -133,24 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, routes []iaas.Route) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(routes, "", " ") - if err != nil { - return fmt.Errorf("marshal static routes: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(routes, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal static routes: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, routes, func() error { table := tables.NewTable() table.SetHeader("Static Route ID", "Next Hop", "Prefix") @@ -164,5 +145,5 @@ func outputResult(p *print.Printer, outputFormat string, routes []iaas.Route) er p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index 1903833df..23e6391ff 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -2,10 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -129,25 +127,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, networkAreaLabel string, route iaas.Route) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(route, "", " ") - if err != nil { - return fmt.Errorf("marshal static route: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(route, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal static route: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, route, func() error { p.Outputf("Updated static route for SNA %q.\nStatic route ID: %s\n", networkAreaLabel, utils.PtrString(route.RouteId)) return nil - } + }) } diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 0df8d0880..855da9f10 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -2,12 +2,10 @@ package update import ( "context" - "encoding/json" "fmt" rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -162,25 +160,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, projectLabel string, networkArea iaas.NetworkArea) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networkArea, "", " ") - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networkArea, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network area: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, networkArea, func() error { p.Outputf("Updated STACKIT Network Area for project %q.\n", projectLabel) return nil - } + }) } diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index bd4b71de2..c22735b0e 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "fmt" "regexp" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -215,25 +213,8 @@ func outputResult(p *print.Printer, outputFormat, projectId string, nic *iaas.NI if nic == nil { return fmt.Errorf("nic is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(nic, "", " ") - if err != nil { - return fmt.Errorf("marshal network interface: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(nic, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network interface: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, nic, func() error { p.Outputf("Created network interface for project %q.\nNIC ID: %s\n", projectId, utils.PtrString(nic.Id)) return nil - } + }) } diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index 0dcb12171..4c1fc6d7d 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -113,24 +111,7 @@ func outputResult(p *print.Printer, outputFormat string, nic *iaas.NIC) error { if nic == nil { return fmt.Errorf("nic is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(nic, "", " ") - if err != nil { - return fmt.Errorf("marshal network interface: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(nic, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network interface: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, nic, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(nic.Id)) table.AddSeparator() @@ -181,5 +162,5 @@ func outputResult(p *print.Printer, outputFormat string, nic *iaas.NIC) error { return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index b40a7fa2e..2effcf4a8 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -147,24 +145,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, nics []iaas.NIC) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(nics, "", " ") - if err != nil { - return fmt.Errorf("marshal nics: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(nics, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal nics: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, nics, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "NIC SECURITY", "DEVICE ID", "IPv4 ADDRESS", "STATUS", "TYPE") @@ -183,5 +164,5 @@ func outputResult(p *print.Printer, outputFormat string, nics []iaas.NIC) error p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 5a85d593a..190946bd7 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -2,11 +2,9 @@ package update import ( "context" - "encoding/json" "fmt" "regexp" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -205,25 +203,8 @@ func outputResult(p *print.Printer, outputFormat, projectId string, nic *iaas.NI if nic == nil { return fmt.Errorf("nic is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(nic, "", " ") - if err != nil { - return fmt.Errorf("marshal network interface: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(nic, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network interface: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, nic, func() error { p.Outputf("Updated network interface for project %q.\n", projectId) return nil - } + }) } diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 6b4461924..2d49bc965 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -243,29 +241,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe if network == nil { return fmt.Errorf("network cannot be nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(network, "", " ") - if err != nil { - return fmt.Errorf("marshal network: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(network, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, network, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s network for project %q.\nNetwork ID: %s\n", operationState, projectLabel, utils.PtrString(network.NetworkId)) return nil - } + }) } diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index 91be6d04e..e7315519a 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) if network == nil { return fmt.Errorf("network cannot be nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(network, "", " ") - if err != nil { - return fmt.Errorf("marshal network: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(network, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, network, func() error { var ipv4nameservers []string if network.Nameservers != nil { ipv4nameservers = append(ipv4nameservers, *network.Nameservers...) @@ -197,5 +178,5 @@ func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index c9689f845..97d570f75 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -140,24 +138,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, networks []iaas.Network) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(networks, "", " ") - if err != nil { - return fmt.Errorf("marshal network: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(networks, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal network: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, networks, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED") @@ -183,5 +164,5 @@ func outputResult(p *print.Printer, outputFormat string, networks []iaas.Network p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index b1da202f6..8d2c6f942 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -124,29 +122,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, bucketName return fmt.Errorf("create bucket response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage bucket: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage bucket: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s bucket %q\n", operationState, bucketName) return nil - } + }) } diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index e5728d549..99fa3e52d 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -95,24 +93,7 @@ func outputResult(p *print.Printer, outputFormat string, bucket *objectstorage.B return fmt.Errorf("bucket is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(bucket, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage bucket: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(bucket, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage bucket: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, bucket, func() error { table := tables.NewTable() table.AddRow("Name", utils.PtrString(bucket.Name)) table.AddSeparator() @@ -128,5 +109,5 @@ func outputResult(p *print.Printer, outputFormat string, bucket *objectstorage.B } return nil - } + }) } diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index d2ec16c9c..d0ed623cf 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -127,24 +125,7 @@ func outputResult(p *print.Printer, outputFormat string, buckets []objectstorage return fmt.Errorf("buckets is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(buckets, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage bucket list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(buckets, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage bucket list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, buckets, func() error { table := tables.NewTable() table.SetHeader("NAME", "REGION", "URL (PATH STYLE)", "URL (VIRTUAL HOSTED STYLE)") for i := range buckets { @@ -162,5 +143,5 @@ func outputResult(p *print.Printer, outputFormat string, buckets []objectstorage } return nil - } + }) } diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index a531e49fd..c92f24956 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -110,29 +108,12 @@ func outputResult(p *print.Printer, outputFormat string, resp *objectstorage.Cre return fmt.Errorf("create createndials group response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage credentials group: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage credentials group: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created credentials group %q. Credentials group ID: %s\n\n", utils.PtrString(resp.CredentialsGroup.DisplayName), utils.PtrString(resp.CredentialsGroup.CredentialsGroupId), ) p.Outputf("URN: %s\n", utils.PtrString(resp.CredentialsGroup.Urn)) return nil - } + }) } diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index 166e0b91a..adc5531d1 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -115,24 +113,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstora } func outputResult(p *print.Printer, outputFormat string, credentialsGroups []objectstorage.CredentialsGroup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentialsGroups, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage credentials group list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentialsGroups, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage credentials group list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentialsGroups, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "URN") for i := range credentialsGroups { @@ -148,5 +129,5 @@ func outputResult(p *print.Printer, outputFormat string, credentialsGroups []obj return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index b713331c6..41fde917c 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "fmt" "time" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -135,24 +133,7 @@ func outputResult(p *print.Printer, outputFormat, credentialsGroupLabel string, return fmt.Errorf("create access key response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { expireDate := "Never" if resp.Expires != nil && resp.Expires.IsSet() && *resp.Expires.Get() != "" { expireDate = *resp.Expires.Get() @@ -164,5 +145,5 @@ func outputResult(p *print.Printer, outputFormat, credentialsGroupLabel string, p.Outputf("Expire Date: %s\n", expireDate) return nil - } + }) } diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index eaf04b011..3fb8b920d 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -130,24 +128,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstora } func outputResult(p *print.Printer, outputFormat string, credentials []objectstorage.AccessKey) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal Object Storage credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Object Storage credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("CREDENTIALS ID", "ACCESS KEY ID", "EXPIRES AT") for i := range credentials { @@ -161,5 +142,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials []objectsto return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index 139ed39dd..99b185ba2 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -116,24 +114,7 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, resp *ob return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created credentials for instance %q.\n\n", instanceLabel) if resp.Credentials != nil { @@ -146,5 +127,5 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, resp *ob p.Outputf("Password: %s\n", utils.PtrString(resp.Credentials.Password)) } return nil - } + }) } diff --git a/internal/cmd/observability/credentials/list/list.go b/internal/cmd/observability/credentials/list/list.go index d5cc513fe..f0423793e 100644 --- a/internal/cmd/observability/credentials/list/list.go +++ b/internal/cmd/observability/credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -126,24 +124,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputResult(p *print.Printer, outputFormat string, credentials []observability.ServiceKeysList) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("USERNAME") for i := range credentials { @@ -156,5 +137,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials []observabi } return nil - } + }) } diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 1b425fc20..225bc18ef 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -124,24 +122,7 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, graf return fmt.Errorf("grafanaConfigs is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(grafanaConfigs, "", " ") - if err != nil { - return fmt.Errorf("marshal Grafana configs: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(grafanaConfigs, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Grafana configs: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, grafanaConfigs, func() error { initialAdminPassword := utils.PtrString(instance.Instance.GrafanaAdminPassword) if !showPassword { initialAdminPassword = "" @@ -163,5 +144,5 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, graf } return nil - } + }) } diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index bf1a3de39..7bd73e90a 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -198,29 +196,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe return fmt.Errorf("resp is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.InstanceId)) return nil - } + }) } diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index cd65f868a..ad204b74e 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -95,24 +93,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *observability return fmt.Errorf("instance is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.Id)) table.AddSeparator() @@ -144,5 +125,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *observability } return nil - } + }) } diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index a234f18cc..a52ebeb34 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputResult(p *print.Printer, outputFormat string, instances []observability.ProjectInstanceFull) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "PLAN", "STATUS") for i := range instances { @@ -158,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []observabili } return nil - } + }) } diff --git a/internal/cmd/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index 3473e645b..62fc0ac86 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -2,7 +2,6 @@ package plans import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -17,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/observability" ) @@ -124,24 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputResult(p *print.Printer, outputFormat string, plans []observability.Plan) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(plans, "", " ") - if err != nil { - return fmt.Errorf("marshal Observability plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(plans, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Observability plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, plans, func() error { table := tables.NewTable() table.SetHeader("ID", "PLAN NAME", "DESCRIPTION") for i := range plans { @@ -160,5 +141,5 @@ func outputResult(p *print.Printer, outputFormat string, plans []observability.P } return nil - } + }) } diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 0b7eb0eb5..1558edbbc 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -105,24 +103,7 @@ func outputResult(p *print.Printer, outputFormat string, config *observability.J return fmt.Errorf(`config is nil`) } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(config, "", " ") - if err != nil { - return fmt.Errorf("marshal scrape configuration: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(config, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal scrape configuration: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, config, func() error { saml2Enabled := "Enabled" if config.Params != nil { saml2 := (*config.Params)["saml2"] @@ -187,5 +168,5 @@ func outputResult(p *print.Printer, outputFormat string, config *observability.J } return nil - } + }) } diff --git a/internal/cmd/observability/scrape-config/list/list.go b/internal/cmd/observability/scrape-config/list/list.go index 95a9770cc..998613343 100644 --- a/internal/cmd/observability/scrape-config/list/list.go +++ b/internal/cmd/observability/scrape-config/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -129,24 +127,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *observabili } func outputResult(p *print.Printer, outputFormat string, configs []observability.Job) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(configs, "", " ") - if err != nil { - return fmt.Errorf("marshal scrape configurations list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(configs, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal scrape configurations list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, configs, func() error { table := tables.NewTable() table.SetHeader("NAME", "TARGETS", "SCRAPE INTERVAL") for i := range configs { @@ -174,5 +155,5 @@ func outputResult(p *print.Printer, outputFormat string, configs []observability } return nil - } + }) } diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index 8af402191..9600ea189 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,8 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, inst if !showPassword { resp.Raw.Credentials.Password = utils.Ptr("hidden") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch credentials: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, utils.PtrString(resp.Id)) // The username field cannot be set by the user so we only display it if it's not returned empty if resp.HasRaw() && resp.Raw.Credentials != nil { @@ -157,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, inst } p.Outputf("URI: %s\n", *resp.Uri) return nil - } + }) } diff --git a/internal/cmd/opensearch/credentials/describe/describe.go b/internal/cmd/opensearch/credentials/describe/describe.go index 531a9d9cb..2acf9188a 100644 --- a/internal/cmd/opensearch/credentials/describe/describe.go +++ b/internal/cmd/opensearch/credentials/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -109,24 +107,7 @@ func outputResult(p *print.Printer, outputFormat string, credentials *opensearch return fmt.Errorf("credentials is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(credentials.Id)) table.AddSeparator() @@ -146,5 +127,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials *opensearch } return nil - } + }) } diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index b3a0cbdfc..40efab492 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -2,7 +2,6 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -17,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) @@ -129,24 +127,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *opensearch. } func outputResult(p *print.Printer, outputFormat string, credentials []opensearch.CredentialsListItem) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("ID") for i := range credentials { @@ -159,5 +140,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials []opensearc } return nil - } + }) } diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index 6476f8cc3..e9dd330bd 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "errors" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -250,29 +248,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient openSearchCl } func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel, instanceId string, resp *opensearch.CreateInstanceResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, instanceId) return nil - } + }) } diff --git a/internal/cmd/opensearch/instance/describe/describe.go b/internal/cmd/opensearch/instance/describe/describe.go index ef746f2c3..44aa6cb82 100644 --- a/internal/cmd/opensearch/instance/describe/describe.go +++ b/internal/cmd/opensearch/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *opensearch.In return fmt.Errorf("instance is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.InstanceId)) table.AddSeparator() @@ -144,5 +125,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *opensearch.In } return nil - } + }) } diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index 3d27f7c0b..d53244f04 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *opensearch. } func outputResult(p *print.Printer, outputFormat string, instances []opensearch.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { @@ -158,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []opensearch. } return nil - } + }) } diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index a4f0b06fb..e8d8c4983 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -2,10 +2,8 @@ package plans import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *opensearch. } func outputResult(p *print.Printer, outputFormat string, plans []opensearch.Offering) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(plans, "", " ") - if err != nil { - return fmt.Errorf("marshal OpenSearch plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(plans, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal OpenSearch plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, plans, func() error { table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { @@ -166,5 +147,5 @@ func outputResult(p *print.Printer, outputFormat string, plans []opensearch.Offe } return nil - } + }) } diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index b46f7705f..3102c987c 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "sort" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -149,25 +147,7 @@ func outputResult(p *print.Printer, outputFormat, sortBy string, members []autho } sort.SliceStable(members, sortFn) - switch outputFormat { - case print.JSONOutputFormat: - // Show details - details, err := json.MarshalIndent(members, "", " ") - if err != nil { - return fmt.Errorf("marshal members: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(members, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal members: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, members, func() error { table := tables.NewTable() table.SetHeader("SUBJECT", "ROLE") for i := range members { @@ -191,5 +171,5 @@ func outputResult(p *print.Printer, outputFormat, sortBy string, members []autho } return nil - } + }) } diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index 710738559..9f1523543 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -122,25 +120,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *authorizati } func outputRolesResult(p *print.Printer, outputFormat string, roles []authorization.Role) error { - switch outputFormat { - case print.JSONOutputFormat: - // Show details - details, err := json.MarshalIndent(roles, "", " ") - if err != nil { - return fmt.Errorf("marshal roles: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(roles, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal roles: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, roles, func() error { table := tables.NewTable() table.SetHeader("ROLE NAME", "ROLE DESCRIPTION", "PERMISSION NAME", "PERMISSION DESCRIPTION") for i := range roles { @@ -165,5 +145,5 @@ func outputRolesResult(p *print.Printer, outputFormat string, roles []authorizat } return nil - } + }) } diff --git a/internal/cmd/postgresflex/backup/describe/describe.go b/internal/cmd/postgresflex/backup/describe/describe.go index 5e0ecf5c9..930bf334a 100644 --- a/internal/cmd/postgresflex/backup/describe/describe.go +++ b/internal/cmd/postgresflex/backup/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "time" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -117,24 +115,7 @@ func outputResult(p *print.Printer, outputFormat string, backup postgresflex.Bac } backupExpireDate := backupStartTime.AddDate(backupExpireYearOffset, backupExpireMonthOffset, backupExpireDayOffset).Format(time.DateOnly) - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backup, "", " ") - if err != nil { - return fmt.Errorf("marshal backup for PostgreSQL Flex backup: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal backup for PostgreSQL Flex backup: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, backup, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(backup.Id)) table.AddSeparator() @@ -152,5 +133,5 @@ func outputResult(p *print.Printer, outputFormat string, backup postgresflex.Bac } return nil - } + }) } diff --git a/internal/cmd/postgresflex/backup/list/list.go b/internal/cmd/postgresflex/backup/list/list.go index 5527343ad..f365261a9 100644 --- a/internal/cmd/postgresflex/backup/list/list.go +++ b/internal/cmd/postgresflex/backup/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -135,24 +133,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *postgresfle } func outputResult(p *print.Printer, outputFormat string, backups []postgresflex.Backup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backups, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex backup list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backups, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex backup list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, backups, func() error { table := tables.NewTable() table.SetHeader("ID", "CREATED AT", "EXPIRES AT", "BACKUP SIZE") for i := range backups { @@ -178,5 +159,5 @@ func outputResult(p *print.Printer, outputFormat string, backups []postgresflex. } return nil - } + }) } diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index 2b43420ce..10da911bb 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -2,10 +2,8 @@ package clone import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -202,29 +200,13 @@ func outputResult(p *print.Printer, outputFormat string, async bool, instanceLab if resp == nil { return fmt.Errorf("response not set") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgresFlex instance clone: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgresFlex instance clone: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Cloned" if async { operationState = "Triggered cloning of" } p.Info("%s instance from instance %q. New Instance ID: %s\n", operationState, instanceLabel, instanceId) return nil - } + }) } diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index d6664835f..3af623ca5 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -270,29 +268,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe if resp == nil { return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgresFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgresFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, instanceId) return nil - } + }) } diff --git a/internal/cmd/postgresflex/instance/describe/describe.go b/internal/cmd/postgresflex/instance/describe/describe.go index 78898aa7d..a9480e74e 100644 --- a/internal/cmd/postgresflex/instance/describe/describe.go +++ b/internal/cmd/postgresflex/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *postgresflex. if instance == nil { return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { acls := "" if instance.HasAcl() && instance.Acl.HasItems() { acls = utils.JoinStringPtr(instance.Acl.Items, ",") @@ -163,5 +144,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *postgresflex. } return nil - } + }) } diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index 90a9a1a40..f7115f502 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -125,24 +123,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *postgresfle } func outputResult(p *print.Printer, outputFormat string, instances []postgresflex.InstanceListInstance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { caser := cases.Title(language.English) table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS") @@ -160,5 +141,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []postgresfle } return nil - } + }) } diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 4448ffd00..f2784645c 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -2,11 +2,9 @@ package update import ( "context" - "encoding/json" "errors" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -305,29 +303,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, instanceLab return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgresFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgresFlex instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { operationState := "Updated" if async { operationState = "Triggered update of" } p.Info("%s instance %q\n", operationState, instanceLabel) return nil - } + }) } diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index 9e988dd6e..0e0581c3f 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -2,12 +2,10 @@ package options import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -185,45 +183,25 @@ func outputResult(p *print.Printer, model inputModel, flavors *postgresflex.List } } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(options, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex options: %w", err) + return p.OutputResult(model.OutputFormat, options, func() error { + content := []tables.Table{} + if model.Flavors && len(*options.Flavors) != 0 { + content = append(content, buildFlavorsTable(*options.Flavors)) } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(options, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if model.Versions && len(*options.Versions) != 0 { + content = append(content, buildVersionsTable(*options.Versions)) + } + if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) > 0 { + content = append(content, buildStoragesTable(*options.Storages.Storages)) + } + + err := tables.DisplayTables(p, content) if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex options: %w", err) + return fmt.Errorf("display output: %w", err) } - p.Outputln(string(details)) return nil - default: - return outputResultAsTable(p, model, options) - } -} - -func outputResultAsTable(p *print.Printer, model inputModel, options *options) error { - content := []tables.Table{} - if model.Flavors && len(*options.Flavors) != 0 { - content = append(content, buildFlavorsTable(*options.Flavors)) - } - if model.Versions && len(*options.Versions) != 0 { - content = append(content, buildVersionsTable(*options.Versions)) - } - if model.Storages && options.Storages.Storages != nil && len(*options.Storages.Storages.StorageClasses) > 0 { - content = append(content, buildStoragesTable(*options.Storages.Storages)) - } - - err := tables.DisplayTables(p, content) - if err != nil { - return fmt.Errorf("display output: %w", err) - } - - return nil + }) } func buildFlavorsTable(flavors []postgresflex.Flavor) tables.Table { diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index 88d377391..f7cc55a35 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -140,24 +138,8 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, resp *po if resp == nil { return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgresFlex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgresFlex user: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { if user := resp.Item; user != nil { p.Outputf("Created user for instance %q. User ID: %s\n\n", instanceLabel, utils.PtrString(user.Id)) p.Outputf("Username: %s\n", utils.PtrString(user.Username)) @@ -169,5 +151,5 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, resp *po } return nil - } + }) } diff --git a/internal/cmd/postgresflex/user/describe/describe.go b/internal/cmd/postgresflex/user/describe/describe.go index 30c96e40f..c0f3f450d 100644 --- a/internal/cmd/postgresflex/user/describe/describe.go +++ b/internal/cmd/postgresflex/user/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -110,24 +108,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *postgresfle } func outputResult(p *print.Printer, outputFormat string, user postgresflex.UserResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(user.Id)) table.AddSeparator() @@ -145,5 +126,5 @@ func outputResult(p *print.Printer, outputFormat string, user postgresflex.UserR } return nil - } + }) } diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index eb476e916..d62bfd1ed 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -131,24 +129,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *postgresfle } func outputResult(p *print.Printer, outputFormat string, users []postgresflex.ListUsersResponseItem) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(users, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex user list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(users, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex user list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, users, func() error { table := tables.NewTable() table.SetHeader("ID", "USERNAME") for i := range users { @@ -164,5 +145,5 @@ func outputResult(p *print.Printer, outputFormat string, users []postgresflex.Li } return nil - } + }) } diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index 27c955b19..0a69b4c94 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -2,10 +2,8 @@ package resetpassword import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -129,24 +127,7 @@ func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel strin if user == nil { return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgresFlex user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgresFlex user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { p.Outputf("Reset password for user %q of instance %q\n\n", userLabel, instanceLabel) if item := user.Item; item != nil { p.Outputf("Username: %s\n", utils.PtrString(item.Username)) @@ -154,5 +135,5 @@ func outputResult(p *print.Printer, outputFormat, userLabel, instanceLabel strin p.Outputf("New URI: %s\n", utils.PtrString(item.Uri)) } return nil - } + }) } diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index bbb22d2e3..5fcd2bec3 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -2,11 +2,9 @@ package create import ( "context" - "encoding/json" "fmt" "regexp" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" @@ -212,25 +210,8 @@ func outputResult(p *print.Printer, model inputModel, resp *resourcemanager.Proj if model.GlobalFlagModel == nil { return fmt.Errorf("globalflags are empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal project: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal project: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { p.Outputf("Created project under the parent with ID %q. Project ID: %s\n", utils.PtrString(model.ParentId), utils.PtrString(resp.ProjectId)) return nil - } + }) } diff --git a/internal/cmd/project/describe/describe.go b/internal/cmd/project/describe/describe.go index 59366914c..b1db718bf 100644 --- a/internal/cmd/project/describe/describe.go +++ b/internal/cmd/project/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -115,24 +113,8 @@ func outputResult(p *print.Printer, outputFormat string, project *resourcemanage if project == nil { return fmt.Errorf("response not set") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(project, "", " ") - if err != nil { - return fmt.Errorf("marshal project details: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(project, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal project details: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, project, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(project.ProjectId)) table.AddSeparator() @@ -151,5 +133,5 @@ func outputResult(p *print.Printer, outputFormat string, project *resourcemanage } return nil - } + }) } diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index 9c8118c2f..8b459dd4c 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "time" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -213,24 +211,7 @@ func fetchProjects(ctx context.Context, model *inputModel, apiClient resourceMan } func outputResult(p *print.Printer, outputFormat string, projects []resourcemanager.Project) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(projects, "", " ") - if err != nil { - return fmt.Errorf("marshal projects list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(projects, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal projects list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, projects, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATE", "PARENT ID") for i := range projects { @@ -254,5 +235,5 @@ func outputResult(p *print.Printer, outputFormat string, projects []resourcemana } return nil - } + }) } diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index a40ffae49..675ddcd22 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "sort" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -154,25 +152,7 @@ func outputResult(p *print.Printer, model inputModel, members []authorization.Me } sort.SliceStable(members, sortFn) - switch model.OutputFormat { - case print.JSONOutputFormat: - // Show details - details, err := json.MarshalIndent(members, "", " ") - if err != nil { - return fmt.Errorf("marshal members: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(members, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal members: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, members, func() error { table := tables.NewTable() table.SetHeader("SUBJECT", "ROLE") for i := range members { @@ -196,5 +176,5 @@ func outputResult(p *print.Printer, model inputModel, members []authorization.Me } return nil - } + }) } diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index 30c1b054b..e4dadb288 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -124,25 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *authorizati } func outputRolesResult(p *print.Printer, outputFormat string, roles []authorization.Role) error { - switch outputFormat { - case print.JSONOutputFormat: - // Show details - details, err := json.MarshalIndent(roles, "", " ") - if err != nil { - return fmt.Errorf("marshal roles: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(roles, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal roles: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, roles, func() error { table := tables.NewTable() table.SetHeader("ROLE NAME", "ROLE DESCRIPTION", "PERMISSION NAME", "PERMISSION DESCRIPTION") for i := range roles { @@ -165,5 +145,5 @@ func outputRolesResult(p *print.Printer, outputFormat string, roles []authorizat } return nil - } + }) } diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 77564b941..831d6eb46 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -127,25 +125,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, projectLabel string, publicIp iaas.PublicIp) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(publicIp, "", " ") - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(publicIp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, publicIp, func() error { p.Outputf("Created public IP for project %q.\nPublic IP ID: %s\n", projectLabel, utils.PtrString(publicIp.Id)) return nil - } + }) } diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index f180c7533..4ec7836f2 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -2,12 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -95,24 +92,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, publicIp iaas.PublicIp) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(publicIp, "", " ") - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(publicIp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, publicIp, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(publicIp.Id)) table.AddSeparator() @@ -138,5 +118,5 @@ func outputResult(p *print.Printer, outputFormat string, publicIp iaas.PublicIp) return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index 71c94a776..c282f26bb 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -141,24 +139,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, publicIps []iaas.PublicIp) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(publicIps, "", " ") - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(publicIps, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, publicIps, func() error { table := tables.NewTable() table.SetHeader("ID", "IP ADDRESS", "USED BY") @@ -174,5 +155,5 @@ func outputResult(p *print.Printer, outputFormat string, publicIps []iaas.Public p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/public-ip/ranges/list/list.go b/internal/cmd/public-ip/ranges/list/list.go index 6b83d5863..e959d39f4 100644 --- a/internal/cmd/public-ip/ranges/list/list.go +++ b/internal/cmd/public-ip/ranges/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -107,24 +105,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { } func outputResult(p *print.Printer, outputFormat string, publicIpRanges []iaas.PublicNetwork) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(publicIpRanges, "", " ") - if err != nil { - return fmt.Errorf("marshal public IP ranges: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(publicIpRanges, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal public IP ranges: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, publicIpRanges, func() error { if len(publicIpRanges) == 0 { p.Outputln("No public IP ranges found") return nil @@ -137,5 +118,5 @@ func outputResult(p *print.Printer, outputFormat string, publicIpRanges []iaas.P } return nil - } + }) } diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index 0f4fc3400..4146fb6ee 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -2,11 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -130,25 +127,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, model *inputModel, publicIpLabel string, publicIp *iaas.PublicIp) error { - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(publicIp, "", " ") - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(publicIp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal public IP: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, publicIp, func() error { p.Outputf("Updated public IP %q.\n", publicIpLabel) return nil - } + }) } diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index 5fb48b92b..89cb8b90c 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "strconv" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -104,25 +102,7 @@ func outputResult(p *print.Printer, outputFormat string, quotas *iaas.QuotaList) if quotas == nil { return fmt.Errorf("quotas is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(quotas, "", " ") - if err != nil { - return fmt.Errorf("marshal quota list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(quotas, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal quota list: %w", err) - } - p.Outputln(string(details)) - - return nil - - default: + return p.OutputResult(outputFormat, quotas, func() error { table := tables.NewTable() table.SetHeader("NAME", "LIMIT", "CURRENT USAGE", "PERCENT") if val := quotas.BackupGigabytes; val != nil { @@ -167,7 +147,7 @@ func outputResult(p *print.Printer, outputFormat string, quotas *iaas.QuotaList) } return nil - } + }) } func conv(n *int64) string { diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 71d432868..f4d4830e0 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -131,24 +129,8 @@ func outputResult(p *print.Printer, model inputModel, instanceLabel string, resp } resp.Raw.Credentials.Password = utils.Ptr("hidden") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ credentials: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, utils.PtrString(resp.Id)) // The username field cannot be set by the user so we only display it if it's not returned empty if resp.HasRaw() && resp.Raw.Credentials != nil { @@ -165,5 +147,5 @@ func outputResult(p *print.Printer, model inputModel, instanceLabel string, resp } p.Outputf("URI: %s\n", utils.PtrString(resp.Uri)) return nil - } + }) } diff --git a/internal/cmd/rabbitmq/credentials/describe/describe.go b/internal/cmd/rabbitmq/credentials/describe/describe.go index 13f631733..fb8d5ea6a 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -108,24 +106,8 @@ func outputResult(p *print.Printer, outputFormat string, credentials *rabbitmq.C if credentials == nil { return fmt.Errorf("no response passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ credentials: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(credentials.Id)) table.AddSeparator() @@ -145,5 +127,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials *rabbitmq.C } return nil - } + }) } diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index 1d9e5f3a3..4b638c13c 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -128,24 +126,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.AP } func outputResult(p *print.Printer, outputFormat string, credentials []rabbitmq.CredentialsListItem) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.SetHeader("ID") for i := range credentials { @@ -158,5 +139,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials []rabbitmq. } return nil - } + }) } diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index 7bf8a1704..b20674c33 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "errors" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -260,29 +258,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel, instanceId return fmt.Errorf("no response passed") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, instanceId) return nil - } + }) } diff --git a/internal/cmd/rabbitmq/instance/describe/describe.go b/internal/cmd/rabbitmq/instance/describe/describe.go index be909e8ab..60ca0bad3 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe.go +++ b/internal/cmd/rabbitmq/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -96,24 +94,8 @@ func outputResult(p *print.Printer, outputFormat string, instance *rabbitmq.Inst if instance == nil { return fmt.Errorf("no instance passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ instance: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.InstanceId)) table.AddSeparator() @@ -143,5 +125,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *rabbitmq.Inst } return nil - } + }) } diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 841ac94eb..53a62a067 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.AP } func outputResult(p *print.Printer, outputFormat string, instances []rabbitmq.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { @@ -167,5 +148,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []rabbitmq.In } return nil - } + }) } diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index 70518152e..1114a9fc1 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -2,10 +2,8 @@ package plans import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -124,24 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.AP } func outputResult(p *print.Printer, outputFormat string, plans []rabbitmq.Offering) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(plans, "", " ") - if err != nil { - return fmt.Errorf("marshal RabbitMQ plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(plans, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal RabbitMQ plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, plans, func() error { table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { @@ -167,5 +148,5 @@ func outputResult(p *print.Printer, outputFormat string, plans []rabbitmq.Offeri } return nil - } + }) } diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index 93b2284ee..5b2d313b4 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -133,24 +131,7 @@ func outputResult(p *print.Printer, model inputModel, instanceLabel string, resp resp.Raw.Credentials.Password = utils.Ptr("hidden") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { p.Outputf("Created credentials for instance %q. Credentials ID: %s\n\n", instanceLabel, utils.PtrString(resp.Id)) // The username field cannot be set by the user, so we only display it if it's not returned empty if resp.HasRaw() && resp.Raw.Credentials != nil { @@ -167,5 +148,5 @@ func outputResult(p *print.Printer, model inputModel, instanceLabel string, resp } p.Outputf("URI: %s\n", utils.PtrString(resp.Uri)) return nil - } + }) } diff --git a/internal/cmd/redis/credentials/describe/describe.go b/internal/cmd/redis/credentials/describe/describe.go index 65973cc0a..36ada5448 100644 --- a/internal/cmd/redis/credentials/describe/describe.go +++ b/internal/cmd/redis/credentials/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -108,24 +106,8 @@ func outputResult(p *print.Printer, outputFormat string, credentials *redis.Cred if credentials == nil { return fmt.Errorf("no credentials passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis credentials: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis credentials: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(credentials.Id)) table.AddSeparator() @@ -145,5 +127,5 @@ func outputResult(p *print.Printer, outputFormat string, credentials *redis.Cred } return nil - } + }) } diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index 5aa2515d0..08f4bf88b 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -128,24 +126,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *redis.APICl } func outputResult(p *print.Printer, outputFormat, instanceLabel string, credentials []redis.CredentialsListItem) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(credentials, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(credentials, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis credentials list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, credentials, func() error { if len(credentials) == 0 { p.Outputf("No credentials found for instance %q\n", instanceLabel) return nil @@ -163,5 +144,5 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, credenti } return nil - } + }) } diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index db8700842..6e694b135 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "errors" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -254,29 +252,13 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel, instanceId if resp == nil { return fmt.Errorf("no response defined") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis instance: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, instanceId) return nil - } + }) } diff --git a/internal/cmd/redis/instance/describe/describe.go b/internal/cmd/redis/instance/describe/describe.go index cf9d9adc7..36e6d7b76 100644 --- a/internal/cmd/redis/instance/describe/describe.go +++ b/internal/cmd/redis/instance/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -96,24 +94,8 @@ func outputResult(p *print.Printer, outputFormat string, instance *redis.Instanc if instance == nil { return fmt.Errorf("no instance passed") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis instance: %w", err) - } - p.Outputln(string(details)) - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.InstanceId)) table.AddSeparator() @@ -143,5 +125,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *redis.Instanc } return nil - } + }) } diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index db44022ba..6f98a00f1 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -122,24 +120,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *redis.APICl } func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []redis.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { if len(instances) == 0 { p.Outputf("No instances found for project %q\n", projectLabel) return nil @@ -168,5 +149,5 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, instances } return nil - } + }) } diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index 66b18fb47..1fda160e4 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -2,10 +2,8 @@ package plans import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *redis.APICl } func outputResult(p *print.Printer, outputFormat string, plans []redis.Offering) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(plans, "", " ") - if err != nil { - return fmt.Errorf("marshal Redis plans: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(plans, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Redis plans: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, plans, func() error { table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { @@ -166,5 +147,5 @@ func outputResult(p *print.Printer, outputFormat string, plans []redis.Offering) } return nil - } + }) } diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index 1d17fbefb..d22f30292 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -155,25 +153,8 @@ func outputResult(p *print.Printer, outputFormat, projectLabel, instanceId strin return fmt.Errorf("instance is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instance, "", " ") - if err != nil { - return fmt.Errorf("marshal Secrets Manager instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instance, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Secrets Manager instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instance, func() error { p.Outputf("Created instance for project %q. Instance ID: %s\n", projectLabel, instanceId) return nil - } + }) } diff --git a/internal/cmd/secrets-manager/instance/describe/describe.go b/internal/cmd/secrets-manager/instance/describe/describe.go index ad9bb5de5..ed12cb1b0 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe.go +++ b/internal/cmd/secrets-manager/instance/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -115,24 +113,7 @@ func outputResult(p *print.Printer, outputFormat string, instance *secretsmanage *secretsmanager.ListACLsResponse }{instance, aclList} - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(output, "", " ") - if err != nil { - return fmt.Errorf("marshal Secrets Manager instance: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(output, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Secrets Manager instance: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, output, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(instance.Id)) table.AddSeparator() @@ -162,5 +143,5 @@ func outputResult(p *print.Printer, outputFormat string, instance *secretsmanage } return nil - } + }) } diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index 142beefe4..82576c398 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -124,24 +122,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *secretsmana } func outputResult(p *print.Printer, outputFormat string, instances []secretsmanager.Instance) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(instances, "", " ") - if err != nil { - return fmt.Errorf("marshal Secrets Manager instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(instances, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Secrets Manager instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, instances, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATE", "SECRETS") for i := range instances { @@ -159,5 +140,5 @@ func outputResult(p *print.Printer, outputFormat string, instances []secretsmana } return nil - } + }) } diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index 6ddfc5e2c..7d9f6d3f7 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -135,24 +133,7 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, user *se return fmt.Errorf("user is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal Secrets Manager user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Secrets Manager user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { p.Outputf("Created user for instance %q. User ID: %s\n\n", instanceLabel, utils.PtrString(user.Id)) p.Outputf("Username: %s\n", utils.PtrString(user.Username)) p.Outputf("Password: %s\n", utils.PtrString(user.Password)) @@ -160,5 +141,5 @@ func outputResult(p *print.Printer, outputFormat, instanceLabel string, user *se p.Outputf("Write Access: %s\n", utils.PtrString(user.Write)) return nil - } + }) } diff --git a/internal/cmd/secrets-manager/user/describe/describe.go b/internal/cmd/secrets-manager/user/describe/describe.go index 1ebd58e49..9a2a30280 100644 --- a/internal/cmd/secrets-manager/user/describe/describe.go +++ b/internal/cmd/secrets-manager/user/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -107,24 +105,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *secretsmana } func outputResult(p *print.Printer, outputFormat string, user secretsmanager.User) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(user, "", " ") - if err != nil { - return fmt.Errorf("marshal Secrets Manager user: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(user, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Secrets Manager user: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, user, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(user.Id)) table.AddSeparator() @@ -146,5 +127,5 @@ func outputResult(p *print.Printer, outputFormat string, user secretsmanager.Use } return nil - } + }) } diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index 5828940fc..1c76d15fc 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -131,24 +129,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *secretsmana } func outputResult(p *print.Printer, outputFormat string, users []secretsmanager.User) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(users, "", " ") - if err != nil { - return fmt.Errorf("marshal Secrets Manager user list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(users, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Secrets Manager user list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, users, func() error { table := tables.NewTable() table.SetHeader("ID", "USERNAME", "DESCRIPTION", "WRITE ACCESS") for i := range users { @@ -166,5 +147,5 @@ func outputResult(p *print.Printer, outputFormat string, users []secretsmanager. } return nil - } + }) } diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 3a352f624..d54b797f3 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -130,25 +128,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, name string, resp iaas.SecurityGroup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal security group: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal security group: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created security group %q.\nSecurity Group ID %s\n", name, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/security-group/describe/describe.go b/internal/cmd/security-group/describe/describe.go index 83186e060..80fd5cb0c 100644 --- a/internal/cmd/security-group/describe/describe.go +++ b/internal/cmd/security-group/describe/describe.go @@ -2,7 +2,6 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" @@ -16,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -93,24 +91,7 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.SecurityGrou if resp == nil { return fmt.Errorf("security group response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal security group: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal security group: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { var content []tables.Table table := tables.NewTable() @@ -209,5 +190,5 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.SecurityGrou } return nil - } + }) } diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index b80b8647b..9fe33d546 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -112,24 +110,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return request } func outputResult(p *print.Printer, outputFormat string, items []iaas.SecurityGroup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(items, "", " ") - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(items, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal PostgreSQL Flex instance list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "STATEFUL", "DESCRIPTION", "LABELS") for _, item := range items { @@ -156,5 +137,5 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.SecurityGr } return nil - } + }) } diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index 6e6250faf..ede4e39a5 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -215,29 +213,12 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel, securityGro if securityGroupRule == nil { return fmt.Errorf("security group rule is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(securityGroupRule, "", " ") - if err != nil { - return fmt.Errorf("marshal security group rule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(securityGroupRule, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal security group rule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, securityGroupRule, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s security group rule for security group %q in project %q.\nSecurity group rule ID: %s\n", operationState, securityGroupName, projectLabel, utils.PtrString(securityGroupRule.Id)) return nil - } + }) } diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index 5cce9ff97..23407466d 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -109,24 +107,7 @@ func outputResult(p *print.Printer, outputFormat string, securityGroupRule *iaas if securityGroupRule == nil { return fmt.Errorf("security group rule is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(securityGroupRule, "", " ") - if err != nil { - return fmt.Errorf("marshal security group rule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(securityGroupRule, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal security group rule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, securityGroupRule, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(securityGroupRule.Id)) table.AddSeparator() @@ -178,5 +159,5 @@ func outputResult(p *print.Printer, outputFormat string, securityGroupRule *iaas return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index 8a4bc3758..9098a19ff 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -2,7 +2,6 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -18,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -141,24 +139,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, securityGroupRules []iaas.SecurityGroupRule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(securityGroupRules, "", " ") - if err != nil { - return fmt.Errorf("marshal security group rules: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(securityGroupRules, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal security group rules: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, securityGroupRules, func() error { table := tables.NewTable() table.SetHeader("ID", "ETHER TYPE", "DIRECTION", "PROTOCOL", "REMOTE SECURITY GROUP ID") @@ -184,5 +165,5 @@ func outputResult(p *print.Printer, outputFormat string, securityGroupRules []ia p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index a7400a73d..441568839 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -148,25 +146,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverbackup.BackupJob) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal server backup: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server backup: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Triggered creation of server backup for server %s. Backup ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/backup/describe/describe.go b/internal/cmd/server/backup/describe/describe.go index 0b5c6a23b..5289a31d4 100644 --- a/internal/cmd/server/backup/describe/describe.go +++ b/internal/cmd/server/backup/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strconv" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -104,24 +102,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat string, backup serverbackup.Backup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backup, "", " ") - if err != nil { - return fmt.Errorf("marshal server backup: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server backup: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, backup, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(backup.Id)) table.AddSeparator() @@ -152,5 +133,5 @@ func outputResult(p *print.Printer, outputFormat string, backup serverbackup.Bac } return nil - } + }) } diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index aac8a3010..453185e56 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -132,24 +130,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat string, backups []serverbackup.Backup) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backups, "", " ") - if err != nil { - return fmt.Errorf("marshal Server Backup list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backups, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Server Backup list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, backups, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "SIZE (GB)", "STATUS", "CREATED AT", "EXPIRES AT", "LAST RESTORED AT", "VOLUME BACKUPS") for i := range backups { @@ -176,5 +157,5 @@ func outputResult(p *print.Printer, outputFormat string, backups []serverbackup. return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index a7af18187..301bc279c 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -167,25 +165,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverbackup.BackupSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal server backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created server backup schedule for server %s. Backup Schedule ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/backup/schedule/describe/describe.go b/internal/cmd/server/backup/schedule/describe/describe.go index f3f827844..4b5b7079f 100644 --- a/internal/cmd/server/backup/schedule/describe/describe.go +++ b/internal/cmd/server/backup/schedule/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -103,24 +101,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat string, schedule serverbackup.BackupSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(schedule, "", " ") - if err != nil { - return fmt.Errorf("marshal server backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(schedule, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, schedule, func() error { table := tables.NewTable() table.AddRow("SCHEDULE ID", utils.PtrString(schedule.Id)) table.AddSeparator() @@ -144,5 +125,5 @@ func outputResult(p *print.Printer, outputFormat string, schedule serverbackup.B } return nil - } + }) } diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index f9cecde2f..b3a93e3fa 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -133,24 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat string, schedules []serverbackup.BackupSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(schedules, "", " ") - if err != nil { - return fmt.Errorf("marshal Server Backup Schedules list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(schedules, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Server Backup Schedules list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, schedules, func() error { table := tables.NewTable() table.SetHeader("SCHEDULE ID", "SCHEDULE NAME", "ENABLED", "RRULE", "BACKUP NAME", "BACKUP RETENTION DAYS", "BACKUP VOLUME IDS") for i := range schedules { @@ -180,5 +161,5 @@ func outputResult(p *print.Printer, outputFormat string, schedules []serverbacku return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/backup/schedule/update/update.go b/internal/cmd/server/backup/schedule/update/update.go index a3471e41b..6d9d2aa69 100644 --- a/internal/cmd/server/backup/schedule/update/update.go +++ b/internal/cmd/server/backup/schedule/update/update.go @@ -2,10 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -178,25 +176,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverbacku } func outputResult(p *print.Printer, outputFormat string, resp serverbackup.BackupSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal update server backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal update server backup schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Info("Updated server backup schedule %s\n", utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index a94cbca58..7e1817b50 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -145,25 +143,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. } func outputResult(p *print.Printer, outputFormat, serverLabel string, resp runcommand.NewCommandResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal server command: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server command: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created server command for server %s. Command ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/command/describe/describe.go b/internal/cmd/server/command/describe/describe.go index f229335fb..c734cd137 100644 --- a/internal/cmd/server/command/describe/describe.go +++ b/internal/cmd/server/command/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -102,24 +100,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. } func outputResult(p *print.Printer, outputFormat string, command runcommand.CommandDetails) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(command, "", " ") - if err != nil { - return fmt.Errorf("marshal server command: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(command, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server command: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, command, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(command.Id)) table.AddSeparator() @@ -145,5 +126,5 @@ func outputResult(p *print.Printer, outputFormat string, command runcommand.Comm } return nil - } + }) } diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index 2d5dfd683..c3a875043 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -132,24 +130,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. } func outputResult(p *print.Printer, outputFormat string, commands []runcommand.Commands) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(commands, "", " ") - if err != nil { - return fmt.Errorf("marshal server command list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(commands, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server command list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, commands, func() error { table := tables.NewTable() table.SetHeader("ID", "TEMPLATE NAME", "TEMPLATE TITLE", "STATUS", "STARTED_AT", "FINISHED_AT") for i := range commands { @@ -168,5 +149,5 @@ func outputResult(p *print.Printer, outputFormat string, commands []runcommand.C return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index ec23859b4..120040660 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -102,24 +100,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *runcommand. } func outputResult(p *print.Printer, outputFormat string, commandTemplate runcommand.CommandTemplateSchema) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(commandTemplate, "", " ") - if err != nil { - return fmt.Errorf("marshal server command template: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(commandTemplate, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server command template: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, commandTemplate, func() error { table := tables.NewTable() table.AddRow("NAME", utils.PtrString(commandTemplate.Name)) table.AddSeparator() @@ -143,5 +124,5 @@ func outputResult(p *print.Printer, outputFormat string, commandTemplate runcomm } return nil - } + }) } diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index 8b03a589a..54ff4fd98 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -112,24 +110,7 @@ func buildRequest(ctx context.Context, _ *inputModel, apiClient *runcommand.APIC } func outputResult(p *print.Printer, outputFormat string, templates []runcommand.CommandTemplate) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(templates, "", " ") - if err != nil { - return fmt.Errorf("marshal server command template list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(templates, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server command template list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, templates, func() error { table := tables.NewTable() table.SetHeader("NAME", "OS TYPE", "TITLE") for i := range templates { @@ -151,5 +132,5 @@ func outputResult(p *print.Printer, outputFormat string, templates []runcommand. return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index 261f68b3c..45d884cec 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -2,11 +2,9 @@ package console import ( "context" - "encoding/json" "fmt" "net/url" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -102,24 +100,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverLabel string, serverUrl iaas.ServerConsoleUrl) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(serverUrl, "", " ") - if err != nil { - return fmt.Errorf("marshal url: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(serverUrl, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal url: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, serverUrl, func() error { if _, ok := serverUrl.GetUrlOk(); !ok { return fmt.Errorf("server url is nil") } @@ -132,5 +113,5 @@ func outputResult(p *print.Printer, outputFormat, serverLabel string, serverUrl p.Outputf("Remote console URL %q for server %q\n", unescapedURL, serverLabel) return nil - } + }) } diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 934123a6f..b4f012148 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -328,25 +326,8 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, server *i if server == nil { return fmt.Errorf("server response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(server, "", " ") - if err != nil { - return fmt.Errorf("marshal server: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(server, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, server, func() error { p.Outputf("Created server for project %q.\nServer ID: %s\n", projectLabel, utils.PtrString(server.Id)) return nil - } + }) } diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index 1448a3281..f4015c298 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -2,11 +2,9 @@ package log import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -134,25 +132,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverLabel, log string) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(log, "", " ") - if err != nil { - return fmt.Errorf("marshal url: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(log, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal url: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, log, func() error { p.Outputf("Log for server %q\n%s", serverLabel, log) return nil - } + }) } diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index 12d3a8a7b..83544b540 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -2,11 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -97,24 +94,7 @@ func outputResult(p *print.Printer, outputFormat string, machineType *iaas.Machi if machineType == nil { return fmt.Errorf("api response for machine type is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(machineType, "", " ") - if err != nil { - return fmt.Errorf("marshal server machine type: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(machineType, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server machine type: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, machineType, func() error { table := tables.NewTable() table.AddRow("NAME", utils.PtrString(machineType.Name)) table.AddSeparator() @@ -132,5 +112,5 @@ func outputResult(p *print.Printer, outputFormat string, machineType *iaas.Machi return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 55a08109a..7d4f228cd 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -126,24 +124,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, machineTypes iaas.MachineTypeListResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(machineTypes, "", " ") - if err != nil { - return fmt.Errorf("marshal machineTypes: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(machineTypes, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal machineTypes: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, machineTypes, func() error { table := tables.NewTable() table.SetTitle("Machine-Types") @@ -160,5 +141,5 @@ func outputResult(p *print.Printer, outputFormat string, machineTypes iaas.Machi } return nil - } + }) } diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index 071781da4..3e895c4b4 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -134,24 +132,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverId string, serverNics []iaas.NIC) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(serverNics, "", " ") - if err != nil { - return fmt.Errorf("marshal server network interfaces: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(serverNics, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server network interfaces: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, serverNics, func() error { table := tables.NewTable() table.SetHeader("NIC ID", "SERVER ID") @@ -163,5 +144,5 @@ func outputResult(p *print.Printer, outputFormat, serverId string, serverNics [] p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 2cfd7a544..3a2709ded 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -131,25 +129,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverupdate.Update) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal server os-update: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server os-update: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Triggered creation of server os-update for server %s. Update ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/os-update/describe/describe.go b/internal/cmd/server/os-update/describe/describe.go index 2aa7c1283..5686ff5be 100644 --- a/internal/cmd/server/os-update/describe/describe.go +++ b/internal/cmd/server/os-update/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -102,24 +100,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat string, update serverupdate.Update) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(update, "", " ") - if err != nil { - return fmt.Errorf("marshal server update: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(update, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server update: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, update, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(update.Id)) table.AddSeparator() @@ -142,5 +123,5 @@ func outputResult(p *print.Printer, outputFormat string, update serverupdate.Upd } return nil - } + }) } diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index 6ec47314e..fbb5d0fa6 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -2,7 +2,6 @@ package list import ( "context" - "encoding/json" "fmt" "strconv" @@ -19,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) @@ -133,24 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat string, updates []serverupdate.Update) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(updates, "", " ") - if err != nil { - return fmt.Errorf("marshal server os-update list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(updates, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server os-update list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, updates, func() error { table := tables.NewTable() table.SetHeader("ID", "STATUS", "INSTALLED UPDATES", "FAILED UPDATES", "START DATE", "END DATE") for i := range updates { @@ -182,5 +163,5 @@ func outputResult(p *print.Printer, outputFormat string, updates []serverupdate. return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index bd3784c49..63325c4da 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -150,25 +148,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat, serverLabel string, resp serverupdate.UpdateSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal server os-update schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server os-update schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Created server os-update schedule for server %s. os-update Schedule ID: %s\n", serverLabel, utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/os-update/schedule/describe/describe.go b/internal/cmd/server/os-update/schedule/describe/describe.go index d46eea1bb..c7e9a9e93 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/server/os-update/schedule/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -102,24 +100,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat string, schedule serverupdate.UpdateSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(schedule, "", " ") - if err != nil { - return fmt.Errorf("marshal server os-update schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(schedule, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server os-update schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, schedule, func() error { table := tables.NewTable() table.AddRow("SCHEDULE ID", utils.PtrString(schedule.Id)) table.AddSeparator() @@ -138,5 +119,5 @@ func outputResult(p *print.Printer, outputFormat string, schedule serverupdate.U } return nil - } + }) } diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index 201922d21..c1c0ed606 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -132,24 +130,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat string, schedules []serverupdate.UpdateSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(schedules, "", " ") - if err != nil { - return fmt.Errorf("marshal Server os-update Schedules list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(schedules, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal Server os-update Schedules list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, schedules, func() error { table := tables.NewTable() table.SetHeader("SCHEDULE ID", "SCHEDULE NAME", "ENABLED", "RRULE", "MAINTENANCE WINDOW") for i := range schedules { @@ -167,5 +148,5 @@ func outputResult(p *print.Printer, outputFormat string, schedules []serverupdat return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index e9ce126f0..78570839e 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -2,10 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -160,25 +158,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serverupdat } func outputResult(p *print.Printer, outputFormat string, resp serverupdate.UpdateSchedule) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal update server os-update schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal update server os-update schedule: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, resp, func() error { p.Info("Updated server os-update schedule %s\n", utils.PtrString(resp.Id)) return nil - } + }) } diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index b80c93df0..3979e0398 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -2,7 +2,6 @@ package attach import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,7 +14,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -116,25 +114,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serviceAccMail, serverLabel string, serviceAccounts iaas.ServiceAccountMailListResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(serviceAccounts, "", " ") - if err != nil { - return fmt.Errorf("marshal service account: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(serviceAccounts, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal service account: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, serviceAccounts, func() error { p.Outputf("Attached service account %q to server %q\n", serviceAccMail, serverLabel) return nil - } + }) } diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index 909de016d..934ed766d 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -2,7 +2,6 @@ package detach import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,7 +14,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -116,25 +114,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serviceAccMail, serverLabel string, service iaas.ServiceAccountMailListResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(service, "", " ") - if err != nil { - return fmt.Errorf("marshal service account: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(service, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal service account: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, service, func() error { p.Outputf("Detached service account %q from server %q\n", serviceAccMail, serverLabel) return nil - } + }) } diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index 372e6c975..efb454e8c 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -2,7 +2,6 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,7 +14,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -133,24 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverId, serverName string, serviceAccounts []string) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(serviceAccounts, "", " ") - if err != nil { - return fmt.Errorf("marshal service accounts list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(serviceAccounts, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal service accounts list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, serviceAccounts, func() error { table := tables.NewTable() table.SetHeader("SERVER ID", "SERVER NAME", "SERVICE ACCOUNT") for i := range serviceAccounts { @@ -161,5 +142,5 @@ func outputResult(p *print.Printer, outputFormat, serverId, serverName string, s return fmt.Errorf("rednder table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index e69289375..5567be1bf 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -2,11 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -130,25 +127,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverLabel string, server *iaas.Server) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(server, "", " ") - if err != nil { - return fmt.Errorf("marshal server: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(server, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, server, func() error { p.Outputf("Updated server %q.\n", serverLabel) return nil - } + }) } diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index 2ba304db3..ba736f285 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -2,10 +2,8 @@ package attach import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -136,25 +134,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, volumeLabel, serverLabel string, volume iaas.VolumeAttachment) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volume, "", " ") - if err != nil { - return fmt.Errorf("marshal server volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volume, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volume, func() error { p.Outputf("Attached volume %q to server %q\n", volumeLabel, serverLabel) return nil - } + }) } diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 6aa391a4c..2a0a97d24 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverLabel, volumeLabel string, volume iaas.VolumeAttachment) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volume, "", " ") - if err != nil { - return fmt.Errorf("marshal server volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volume, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volume, func() error { table := tables.NewTable() table.AddRow("SERVER ID", utils.PtrString(volume.ServerId)) table.AddSeparator() @@ -161,5 +142,5 @@ func outputResult(p *print.Printer, outputFormat, serverLabel, volumeLabel strin return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index 3e69701df..c48eceb5f 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -123,24 +121,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, serverLabel string, volumeNames []string, volumes []iaas.VolumeAttachment) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volumes, "", " ") - if err != nil { - return fmt.Errorf("marshal server volume list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volumes, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server volume list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volumes, func() error { table := tables.NewTable() table.SetHeader("SERVER ID", "SERVER NAME", "VOLUME ID", "VOLUME NAME") for i := range volumes { @@ -156,5 +137,5 @@ func outputResult(p *print.Printer, outputFormat, serverLabel string, volumeName return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 1371e587c..471dde5c0 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -2,10 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -132,25 +130,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat, volumeLabel, serverLabel string, volume iaas.VolumeAttachment) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volume, "", " ") - if err != nil { - return fmt.Errorf("marshal server volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volume, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal server volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volume, func() error { p.Outputf("Updated attached volume %q of server %q\n", volumeLabel, serverLabel) return nil - } + }) } diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index 6387773ad..98389133c 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -117,25 +115,8 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, serviceAc return fmt.Errorf("service account is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(serviceAccount, "", " ") - if err != nil { - return fmt.Errorf("marshal service account: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(serviceAccount, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal service account: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, serviceAccount, func() error { p.Outputf("Created service account for project %q. Email: %s\n", projectLabel, utils.PtrString(serviceAccount.Email)) return nil - } + }) } diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index cb10ba912..e090de0a4 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -133,24 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serviceacco } func outputResult(p *print.Printer, outputFormat string, keys []serviceaccount.ServiceAccountKeyListResponse) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(keys, "", " ") - if err != nil { - return fmt.Errorf("marshal keys metadata: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(keys, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal keys metadata: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, keys, func() error { table := tables.NewTable() table.SetHeader("ID", "ACTIVE", "CREATED_AT", "VALID_UNTIL") for i := range keys { @@ -172,5 +153,5 @@ func outputResult(p *print.Printer, outputFormat string, keys []serviceaccount.S } return nil - } + }) } diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index 5806feda7..49ea386cc 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -117,20 +115,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serviceacco } func outputResult(p *print.Printer, outputFormat string, serviceAccounts []serviceaccount.ServiceAccount) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(serviceAccounts, "", " ") - if err != nil { - return fmt.Errorf("marshal service accounts list: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(serviceAccounts, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal service accounts list: %w", err) - } - p.Outputln(string(details)) - default: + return p.OutputResult(outputFormat, serviceAccounts, func() error { table := tables.NewTable() table.SetHeader("ID", "EMAIL") for i := range serviceAccounts { @@ -144,7 +129,6 @@ func outputResult(p *print.Printer, outputFormat string, serviceAccounts []servi if err != nil { return fmt.Errorf("render table: %w", err) } - } - - return nil + return nil + }) } diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index e3e009b51..817e1dc27 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -140,27 +138,10 @@ func outputResult(p *print.Printer, outputFormat, serviceAccountEmail string, to return fmt.Errorf("token is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(token, "", " ") - if err != nil { - return fmt.Errorf("marshal service account access token: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(token, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal service account access token: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, token, func() error { p.Outputf("Created access token for service account %s. Token ID: %s\n\n", serviceAccountEmail, utils.PtrString(token.Id)) p.Outputf("Valid until: %s\n", utils.PtrString(token.ValidUntil)) p.Outputf("Token: %s\n", utils.PtrString(token.Token)) return nil - } + }) } diff --git a/internal/cmd/service-account/token/list/list.go b/internal/cmd/service-account/token/list/list.go index e3a20d9ed..c302dec8f 100644 --- a/internal/cmd/service-account/token/list/list.go +++ b/internal/cmd/service-account/token/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -138,24 +136,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *serviceacco } func outputResult(p *print.Printer, outputFormat string, tokensMetadata []serviceaccount.AccessTokenMetadata) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(tokensMetadata, "", " ") - if err != nil { - return fmt.Errorf("marshal tokens metadata: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(tokensMetadata, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal tokens metadata: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, tokensMetadata, func() error { table := tables.NewTable() table.SetHeader("ID", "ACTIVE", "CREATED_AT", "VALID_UNTIL") for i := range tokensMetadata { @@ -173,5 +154,5 @@ func outputResult(p *print.Printer, outputFormat string, tokensMetadata []servic } return nil - } + }) } diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 3c51310cd..f1874fb65 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -195,29 +194,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe return fmt.Errorf("cluster is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(cluster, "", " ") - if err != nil { - return fmt.Errorf("marshal SKE cluster: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(cluster, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SKE cluster: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, cluster, func() error { operationState := "Created" if async { operationState = "Triggered creation of" } p.Outputf("%s cluster for project %q. Cluster name: %s\n", operationState, projectLabel, utils.PtrString(cluster.Name)) return nil - } + }) } diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 69d357f44..7bbf9ac6b 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -95,24 +93,7 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e return fmt.Errorf("cluster is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(cluster, "", " ") - if err != nil { - return fmt.Errorf("marshal SKE cluster: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(cluster, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SKE cluster: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, cluster, func() error { acl := []string{} if cluster.Extensions != nil && cluster.Extensions.Acl != nil { acl = *cluster.Extensions.Acl.AllowedCidrs @@ -140,7 +121,7 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e } return nil - } + }) } func handleClusterErrors(clusterErrs []ske.ClusterError, table *tables.Table) { diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index 75fc2e125..d2a3d4d01 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -140,24 +138,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClie } func outputResult(p *print.Printer, outputFormat, projectLabel string, clusters []ske.Cluster) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(clusters, "", " ") - if err != nil { - return fmt.Errorf("marshal SKE cluster list: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(clusters, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SKE cluster list: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, clusters, func() error { if len(clusters) == 0 { p.Outputf("No clusters found for project %q\n", projectLabel) return nil @@ -196,5 +177,5 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, clusters } return nil - } + }) } diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 512b2f615..81187ccd4 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -157,29 +156,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, clusterName return fmt.Errorf("cluster is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(cluster, "", " ") - if err != nil { - return fmt.Errorf("marshal SKE cluster: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(cluster, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SKE cluster: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, cluster, func() error { operationState := "Updated" if async { operationState = "Triggered update of" } p.Info("%s cluster %q\n", operationState, clusterName) return nil - } + }) } diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index a8abfb2b6..6becf645a 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -2,10 +2,8 @@ package describe import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -84,24 +82,7 @@ func outputResult(p *print.Printer, outputFormat string, project *serviceenablem return fmt.Errorf("project is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(project, "", " ") - if err != nil { - return fmt.Errorf("marshal SKE project details: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(project, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SKE project details: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, project, func() error { table := tables.NewTable() table.AddRow("ID", projectId) table.AddSeparator() @@ -114,5 +95,5 @@ func outputResult(p *print.Printer, outputFormat string, project *serviceenablem } return nil - } + }) } diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index e9eeba070..ed8ed322b 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -7,7 +7,6 @@ import ( "strings" "time" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -156,25 +155,9 @@ func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOpti options.VolumeTypes = nil } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(options, "", " ") - if err != nil { - return fmt.Errorf("marshal SKE options: %w", err) - } - p.Outputln(string(details)) - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(options, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal SKE options: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, options, func() error { return outputResultAsTable(p, options) - } + }) } func outputResultAsTable(p *print.Printer, options *ske.ProviderOptions) error { diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index 5749a1d01..789c16585 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -190,29 +188,12 @@ func outputResult(p *print.Printer, outputFormat string, async bool, sourceLabel return fmt.Errorf("create backup response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal backup: %w", err) - } - p.Outputln(string(details)) - return nil - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal backup: %w", err) - } - p.Outputln(string(details)) - return nil - - default: + return p.OutputResult(outputFormat, resp, func() error { if async { p.Outputf("Triggered backup of %s in %s. Backup ID: %s\n", sourceLabel, projectLabel, utils.PtrString(resp.Id)) } else { p.Outputf("Created backup of %s in %s. Backup ID: %s\n", sourceLabel, projectLabel, utils.PtrString(resp.Id)) } return nil - } + }) } diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go index 48ee2ae2a..f836b32b2 100644 --- a/internal/cmd/volume/backup/describe/describe.go +++ b/internal/cmd/volume/backup/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -97,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, backup *iaas.Backup) er return fmt.Errorf("backup response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backup, "", " ") - if err != nil { - return fmt.Errorf("marshal backup: %w", err) - } - p.Outputln(string(details)) - return nil - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal backup: %w", err) - } - p.Outputln(string(details)) - return nil - - default: + return p.OutputResult(outputFormat, backup, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(backup.Id)) table.AddSeparator() @@ -150,5 +131,5 @@ func outputResult(p *print.Printer, outputFormat string, backup *iaas.Backup) er } return nil - } + }) } diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index f3fa7b257..af7edc33d 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -142,24 +140,7 @@ func outputResult(p *print.Printer, outputFormat string, backups []iaas.Backup) return fmt.Errorf("backups is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backups, "", " ") - if err != nil { - return fmt.Errorf("marshal backup list: %w", err) - } - p.Outputln(string(details)) - return nil - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backups, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal backup list: %w", err) - } - p.Outputln(string(details)) - return nil - - default: + return p.OutputResult(outputFormat, backups, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "SIZE", "STATUS", "SNAPSHOT ID", "VOLUME ID", "AVAILABILITY ZONE", "LABELS", "CREATED AT", "UPDATED AT") @@ -190,5 +171,5 @@ func outputResult(p *print.Printer, outputFormat string, backups []iaas.Backup) p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go index e53e332a0..9ede68fac 100644 --- a/internal/cmd/volume/backup/update/update.go +++ b/internal/cmd/volume/backup/update/update.go @@ -2,10 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -136,25 +134,8 @@ func outputResult(p *print.Printer, outputFormat, backupLabel string, backup *ia return fmt.Errorf("backup response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(backup, "", " ") - if err != nil { - return fmt.Errorf("marshal backup: %w", err) - } - p.Outputln(string(details)) - return nil - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(backup, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal backup: %w", err) - } - p.Outputln(string(details)) - return nil - - default: + return p.OutputResult(outputFormat, backup, func() error { p.Outputf("Updated backup %q\n", backupLabel) return nil - } + }) } diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 068a06cce..df781e7c0 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -2,10 +2,8 @@ package create import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -186,25 +184,8 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, volu if volume == nil { return fmt.Errorf("volume response is empty") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volume, "", " ") - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volume, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(model.OutputFormat, volume, func() error { p.Outputf("Created volume for project %q.\nVolume ID: %s\n", projectLabel, utils.PtrString(volume.Id)) return nil - } + }) } diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index 8a0db5659..19e536d7b 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -2,12 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -98,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, volume *iaas.Volume) er if volume == nil { return fmt.Errorf("volume response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volume, "", " ") - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volume, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volume, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(volume.Id)) table.AddSeparator() @@ -155,5 +135,5 @@ func outputResult(p *print.Printer, outputFormat string, volume *iaas.Volume) er return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index e45536d36..1bf196c95 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -138,24 +136,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, volumes []iaas.Volume) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volumes, "", " ") - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volumes, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volumes, func() error { table := tables.NewTable() table.SetHeader("ID", "Name", "Status", "Server", "Availability Zone", "Size (GB)") @@ -174,5 +155,5 @@ func outputResult(p *print.Printer, outputFormat string, volumes []iaas.Volume) p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index cef47d1e6..24a158239 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -2,12 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -98,24 +95,7 @@ func outputResult(p *print.Printer, outputFormat string, performanceClass *iaas. if performanceClass == nil { return fmt.Errorf("performanceClass response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(performanceClass, "", " ") - if err != nil { - return fmt.Errorf("marshal volume performance class: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(performanceClass, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal volume performance class: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, performanceClass, func() error { table := tables.NewTable() table.AddRow("NAME", utils.PtrString(performanceClass.Name)) table.AddSeparator() @@ -140,5 +120,5 @@ func outputResult(p *print.Printer, outputFormat string, performanceClass *iaas. return fmt.Errorf("render table: %w", err) } return nil - } + }) } diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index e8904a8f4..e32ed2c33 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -2,10 +2,8 @@ package list import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -139,24 +137,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } func outputResult(p *print.Printer, outputFormat string, performanceClasses []iaas.VolumePerformanceClass) error { - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(performanceClasses, "", " ") - if err != nil { - return fmt.Errorf("marshal volume performance class: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(performanceClasses, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal volume performance class: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, performanceClasses, func() error { table := tables.NewTable() table.SetHeader("Name", "Description") @@ -167,5 +148,5 @@ func outputResult(p *print.Printer, outputFormat string, performanceClasses []ia p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/volume/snapshot/describe/describe.go b/internal/cmd/volume/snapshot/describe/describe.go index 9b4f45fad..bf78cb603 100644 --- a/internal/cmd/volume/snapshot/describe/describe.go +++ b/internal/cmd/volume/snapshot/describe/describe.go @@ -2,11 +2,9 @@ package describe import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -96,24 +94,7 @@ func outputResult(p *print.Printer, outputFormat string, snapshot *iaas.Snapshot return fmt.Errorf("get snapshot response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(snapshot, "", " ") - if err != nil { - return fmt.Errorf("marshal snapshot: %w", err) - } - p.Outputln(string(details)) - return nil - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(snapshot, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal snapshot: %w", err) - } - p.Outputln(string(details)) - return nil - - default: + return p.OutputResult(outputFormat, snapshot, func() error { table := tables.NewTable() table.AddRow("ID", utils.PtrString(snapshot.Id)) table.AddSeparator() @@ -145,5 +126,5 @@ func outputResult(p *print.Printer, outputFormat string, snapshot *iaas.Snapshot } return nil - } + }) } diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go index d25965c44..2b38252a5 100644 --- a/internal/cmd/volume/snapshot/list/list.go +++ b/internal/cmd/volume/snapshot/list/list.go @@ -2,11 +2,9 @@ package list import ( "context" - "encoding/json" "fmt" "strings" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -141,24 +139,7 @@ func outputResult(p *print.Printer, outputFormat string, snapshots []iaas.Snapsh return fmt.Errorf("list snapshots response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(snapshots, "", " ") - if err != nil { - return fmt.Errorf("marshal snapshots: %w", err) - } - p.Outputln(string(details)) - return nil - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(snapshots, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal snapshots: %w", err) - } - p.Outputln(string(details)) - return nil - - default: + return p.OutputResult(outputFormat, snapshots, func() error { table := tables.NewTable() table.SetHeader("ID", "NAME", "SIZE", "STATUS", "VOLUME ID", "LABELS", "CREATED AT", "UPDATED AT") @@ -186,5 +167,5 @@ func outputResult(p *print.Printer, outputFormat string, snapshots []iaas.Snapsh p.Outputln(table.Render()) return nil - } + }) } diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 34881f40d..0af92ab77 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -2,11 +2,8 @@ package update import ( "context" - "encoding/json" "fmt" - "github.com/goccy/go-yaml" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -140,25 +137,8 @@ func outputResult(p *print.Printer, outputFormat, volumeLabel string, volume *ia if volume == nil { return fmt.Errorf("volume response is empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(volume, "", " ") - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(volume, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal volume: %w", err) - } - p.Outputln(string(details)) - - return nil - default: + return p.OutputResult(outputFormat, volume, func() error { p.Outputf("Updated volume %q.\n", volumeLabel) return nil - } + }) } diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index 583e975dc..d8e06a25c 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -2,10 +2,13 @@ package print import ( "bufio" + "encoding/json" "errors" "fmt" "syscall" + "github.com/goccy/go-yaml" + "log/slog" "os" "os/exec" @@ -240,3 +243,26 @@ func (p *Printer) DebugInputModel(model any) { } } } + +func (p *Printer) OutputResult(outputFormat string, output any, prettyOutputFunc func() error) error { + switch outputFormat { + case JSONOutputFormat: + details, err := json.MarshalIndent(output, "", " ") + if err != nil { + return fmt.Errorf("marshal json: %w", err) + } + p.Outputln(string(details)) + + return nil + case YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(output, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal yaml: %w", err) + } + p.Outputln(string(details)) + + return nil + default: + return prettyOutputFunc() + } +} diff --git a/internal/pkg/print/print_test.go b/internal/pkg/print/print_test.go index 5c68dc2cf..8cb2e8ee2 100644 --- a/internal/pkg/print/print_test.go +++ b/internal/pkg/print/print_test.go @@ -860,3 +860,79 @@ func TestIsVerbosityError(t *testing.T) { }) } } + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + output any + prettyOutputFunc func() error + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "output format is JSON", + args: args{ + outputFormat: JSONOutputFormat, + output: struct{}{}, + }, + }, + { + name: "output format is JSON and output is nil", + args: args{ + outputFormat: JSONOutputFormat, + output: nil, + }, + }, + { + name: "output format is YAML", + args: args{ + outputFormat: YAMLOutputFormat, + output: struct{}{}, + }, + }, + { + name: "output format is YAML and output is nil", + args: args{ + outputFormat: YAMLOutputFormat, + output: nil, + }, + }, + { + name: "should return error of pretty output func", + args: args{ + outputFormat: PrettyOutputFormat, + output: struct{}{}, + prettyOutputFunc: func() error { + return fmt.Errorf("dummy error") + }, + }, + wantErr: true, + }, + { + name: "success of pretty output func", + args: args{ + outputFormat: PrettyOutputFormat, + output: struct{}{}, + prettyOutputFunc: func() error { + return nil + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmd := &cobra.Command{} + p := &Printer{ + Cmd: cmd, + Verbosity: ErrorLevel, + } + + if err := p.OutputResult(tt.args.outputFormat, tt.args.output, tt.args.prettyOutputFunc); (err != nil) != tt.wantErr { + t.Errorf("OutputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} From 2e98c40ddd79c828337a01eec0706d4dd7c8c7fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 20 Oct 2025 10:52:06 +0200 Subject: [PATCH 173/422] fix(mongodbflex): print valid JSON for list cmds (#1032) relates to STACKITCLI-244 --- internal/cmd/mongodbflex/backup/list/list.go | 15 ++++++------ .../cmd/mongodbflex/backup/list/list_test.go | 9 +++---- .../cmd/mongodbflex/instance/list/list.go | 24 ++++++++++--------- .../mongodbflex/instance/list/list_test.go | 3 ++- internal/cmd/mongodbflex/user/list/list.go | 24 ++++++++++--------- .../cmd/mongodbflex/user/list/list_test.go | 7 +++--- 6 files changed, 45 insertions(+), 37 deletions(-) diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index bd0bb4d22..ab22427bf 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -74,11 +74,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get backups for MongoDB Flex instance %q: %w", instanceLabel, err) } - if resp.Items == nil || len(*resp.Items) == 0 { - cmd.Printf("No backups found for instance %q\n", instanceLabel) - return nil - } - backups := *resp.Items + backups := utils.GetSliceFromPointer(resp.Items) restoreJobs, err := apiClient.ListRestoreJobs(ctx, model.ProjectId, *model.InstanceId, model.Region).Execute() if err != nil { @@ -90,7 +86,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { backups = backups[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, backups, restoreJobs) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, backups, restoreJobs) }, } @@ -135,12 +131,17 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex return req } -func outputResult(p *print.Printer, outputFormat string, backups []mongodbflex.Backup, restoreJobs *mongodbflex.ListRestoreJobsResponse) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, backups []mongodbflex.Backup, restoreJobs *mongodbflex.ListRestoreJobsResponse) error { if restoreJobs == nil { return fmt.Errorf("restore jobs is empty") } return p.OutputResult(outputFormat, backups, func() error { + if len(backups) == 0 { + p.Outputf("No backups found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "CREATED AT", "EXPIRES AT", "BACKUP SIZE", "RESTORE STATUS") for i := range backups { diff --git a/internal/cmd/mongodbflex/backup/list/list_test.go b/internal/cmd/mongodbflex/backup/list/list_test.go index 8b6ce7a25..8b2e9b177 100644 --- a/internal/cmd/mongodbflex/backup/list/list_test.go +++ b/internal/cmd/mongodbflex/backup/list/list_test.go @@ -215,9 +215,10 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - backups []mongodbflex.Backup - restoreJobs *mongodbflex.ListRestoreJobsResponse + outputFormat string + instanceLabel string + backups []mongodbflex.Backup + restoreJobs *mongodbflex.ListRestoreJobsResponse } tests := []struct { name string @@ -256,7 +257,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.backups, tt.args.restoreJobs); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.backups, tt.args.restoreJobs); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index e11dbb065..798bd544c 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -65,23 +65,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get MongoDB Flex instances: %w", err) } - if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil + instances := utils.GetSliceFromPointer(resp.Items) + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } - instances := *resp.Items // Truncate output if model.Limit != nil && len(instances) > int(*model.Limit) { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -121,8 +118,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex return req } -func outputResult(p *print.Printer, outputFormat string, instances []mongodbflex.InstanceListInstance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []mongodbflex.InstanceListInstance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS") for i := range instances { diff --git a/internal/cmd/mongodbflex/instance/list/list_test.go b/internal/cmd/mongodbflex/instance/list/list_test.go index 9c558f205..1f14f2d89 100644 --- a/internal/cmd/mongodbflex/instance/list/list_test.go +++ b/internal/cmd/mongodbflex/instance/list/list_test.go @@ -195,6 +195,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instanceList []mongodbflex.InstanceListInstance } tests := []struct { @@ -226,7 +227,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instanceList); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instanceList); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index b4d6eaf28..b6fb8ad7a 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -68,23 +68,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get MongoDB Flex users: %w", err) } - if resp.Items == nil || len(*resp.Items) == 0 { - instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = *model.InstanceId - } - params.Printer.Info("No users found for instance %q\n", instanceLabel) - return nil + users := utils.GetSliceFromPointer(resp.Items) + + instanceLabel, err := mongodbflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = *model.InstanceId } - users := *resp.Items // Truncate output if model.Limit != nil && len(users) > int(*model.Limit) { users = users[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, users) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, users) }, } @@ -129,8 +126,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mongodbflex return req } -func outputResult(p *print.Printer, outputFormat string, users []mongodbflex.ListUser) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, users []mongodbflex.ListUser) error { return p.OutputResult(outputFormat, users, func() error { + if len(users) == 0 { + p.Outputf("No users found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "USERNAME") for i := range users { diff --git a/internal/cmd/mongodbflex/user/list/list_test.go b/internal/cmd/mongodbflex/user/list/list_test.go index 45d28d41d..3345bae43 100644 --- a/internal/cmd/mongodbflex/user/list/list_test.go +++ b/internal/cmd/mongodbflex/user/list/list_test.go @@ -211,8 +211,9 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - users []mongodbflex.ListUser + outputFormat string + instanceLabel string + users []mongodbflex.ListUser } tests := []struct { name string @@ -243,7 +244,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.users); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.users); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From 4725975b8aedb09a8fce802d7cdea63dafc187a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 20 Oct 2025 12:16:21 +0200 Subject: [PATCH 174/422] refactor: centralize logic for parseInput tests (#1033) --- internal/cmd/affinity-groups/create/create.go | 6 +- .../cmd/affinity-groups/create/create_test.go | 40 +------- internal/cmd/affinity-groups/list/list.go | 6 +- .../cmd/affinity-groups/list/list_test.go | 40 +------- .../activate_service_account.go | 11 ++- .../activate_service_account_test.go | 35 +------ .../auth/get-access-token/get_access_token.go | 6 +- internal/cmd/beta/alb/create/create.go | 6 +- internal/cmd/beta/alb/create/create_test.go | 43 +-------- internal/cmd/beta/alb/delete/delete_test.go | 52 +---------- .../cmd/beta/alb/describe/describe_test.go | 50 +--------- internal/cmd/beta/alb/list/list.go | 6 +- internal/cmd/beta/alb/list/list_test.go | 41 +-------- .../alb/observability-credentials/add/add.go | 6 +- .../observability-credentials/add/add_test.go | 43 +-------- .../describe/describe_test.go | 50 +--------- .../observability-credentials/list/list.go | 6 +- .../list/list_test.go | 43 +-------- .../update/update_test.go | 1 + internal/cmd/beta/alb/plans/plans.go | 6 +- internal/cmd/beta/alb/plans/plans_test.go | 41 +-------- internal/cmd/beta/alb/pool/update/update.go | 6 +- .../cmd/beta/alb/pool/update/update_test.go | 43 +-------- internal/cmd/beta/alb/quotas/quotas.go | 6 +- internal/cmd/beta/alb/quotas/quotas_test.go | 41 +-------- internal/cmd/beta/alb/template/template.go | 6 +- .../cmd/beta/alb/template/template_test.go | 44 +-------- internal/cmd/beta/alb/update/update.go | 6 +- internal/cmd/beta/alb/update/update_test.go | 43 +-------- .../database/create/create_test.go | 50 +--------- .../database/delete/delete_test.go | 52 +---------- .../database/describe/describe_test.go | 50 +--------- .../beta/sqlserverflex/database/list/list.go | 6 +- .../sqlserverflex/database/list/list_test.go | 46 +--------- .../sqlserverflex/instance/create/create.go | 6 +- .../instance/create/create_test.go | 55 +---------- .../instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- .../beta/sqlserverflex/instance/list/list.go | 6 +- .../sqlserverflex/instance/list/list_test.go | 46 +--------- .../cmd/beta/sqlserverflex/options/options.go | 6 +- .../sqlserverflex/options/options_test.go | 44 +-------- .../beta/sqlserverflex/user/create/create.go | 6 +- .../sqlserverflex/user/create/create_test.go | 46 +--------- .../sqlserverflex/user/delete/delete_test.go | 52 +---------- .../user/describe/describe_test.go | 50 +--------- .../cmd/beta/sqlserverflex/user/list/list.go | 6 +- .../beta/sqlserverflex/user/list/list_test.go | 46 +--------- .../reset-password/reset_password_test.go | 50 +--------- .../cmd/config/profile/create/create_test.go | 55 +---------- .../cmd/config/profile/delete/delete_test.go | 55 +---------- .../cmd/config/profile/export/export_test.go | 55 +---------- internal/cmd/config/profile/import/import.go | 6 +- .../cmd/config/profile/import/import_test.go | 46 +--------- internal/cmd/config/profile/set/set_test.go | 55 +---------- internal/cmd/config/set/set.go | 6 +- internal/cmd/config/set/set_test.go | 47 +--------- internal/cmd/dns/record-set/create/create.go | 6 +- .../cmd/dns/record-set/create/create_test.go | 55 +---------- .../cmd/dns/record-set/delete/delete_test.go | 52 +---------- .../dns/record-set/describe/describe_test.go | 50 +--------- internal/cmd/dns/record-set/list/list.go | 6 +- internal/cmd/dns/record-set/list/list_test.go | 43 +-------- internal/cmd/dns/zone/clone/clone_test.go | 50 +--------- internal/cmd/dns/zone/create/create.go | 6 +- internal/cmd/dns/zone/create/create_test.go | 55 +---------- internal/cmd/dns/zone/delete/delete_test.go | 52 +---------- .../cmd/dns/zone/describe/describe_test.go | 50 +--------- internal/cmd/dns/zone/list/list.go | 6 +- internal/cmd/dns/zone/list/list_test.go | 43 +-------- internal/cmd/git/flavor/list/list.go | 6 +- internal/cmd/git/flavor/list/list_test.go | 43 +-------- internal/cmd/git/instance/create/create.go | 6 +- .../cmd/git/instance/create/create_test.go | 48 +--------- .../cmd/git/instance/delete/delete_test.go | 1 + .../git/instance/describe/describe_test.go | 1 + internal/cmd/git/instance/list/list.go | 6 +- internal/cmd/git/instance/list/list_test.go | 43 +-------- internal/cmd/image/create/create.go | 6 +- internal/cmd/image/create/create_test.go | 48 +--------- internal/cmd/image/delete/delete_test.go | 1 + internal/cmd/image/describe/describe_test.go | 1 + internal/cmd/image/list/list.go | 6 +- internal/cmd/image/list/list_test.go | 41 +-------- internal/cmd/image/update/update_test.go | 1 + internal/cmd/key-pair/create/create.go | 6 +- internal/cmd/key-pair/create/create_test.go | 43 +-------- .../cmd/key-pair/describe/describe_test.go | 50 +--------- internal/cmd/key-pair/list/list.go | 6 +- internal/cmd/key-pair/list/list_test.go | 43 +-------- internal/cmd/load-balancer/create/create.go | 6 +- .../cmd/load-balancer/create/create_test.go | 55 +---------- .../cmd/load-balancer/delete/delete_test.go | 52 +---------- .../load-balancer/describe/describe_test.go | 50 +--------- .../generate-payload/generate_payload.go | 6 +- .../generate-payload/generate_payload_test.go | 51 +---------- internal/cmd/load-balancer/list/list.go | 6 +- internal/cmd/load-balancer/list/list_test.go | 43 +-------- .../observability-credentials/add/add.go | 6 +- .../observability-credentials/add/add_test.go | 43 +-------- .../cleanup/cleanup.go | 6 +- .../cleanup/cleanup_test.go | 52 +---------- .../delete/delete_test.go | 52 +---------- .../describe/describe_test.go | 50 +--------- .../observability-credentials/list/list.go | 6 +- .../list/list_test.go | 51 +---------- .../update/update_test.go | 52 +---------- internal/cmd/load-balancer/quota/quota.go | 6 +- .../cmd/load-balancer/quota/quota_test.go | 43 +-------- .../cmd/load-balancer/update/update_test.go | 52 +---------- .../cmd/logme/credentials/create/create.go | 6 +- .../logme/credentials/create/create_test.go | 43 +-------- .../logme/credentials/delete/delete_test.go | 52 +---------- .../credentials/describe/describe_test.go | 50 +--------- internal/cmd/logme/credentials/list/list.go | 6 +- .../cmd/logme/credentials/list/list_test.go | 43 +-------- internal/cmd/logme/instance/create/create.go | 6 +- .../cmd/logme/instance/create/create_test.go | 66 ++------------ .../cmd/logme/instance/delete/delete_test.go | 52 +---------- .../logme/instance/describe/describe_test.go | 50 +--------- internal/cmd/logme/instance/list/list.go | 6 +- internal/cmd/logme/instance/list/list_test.go | 46 +--------- internal/cmd/logme/plans/plans.go | 6 +- internal/cmd/logme/plans/plans_test.go | 46 +--------- .../cmd/mariadb/credentials/create/create.go | 6 +- .../mariadb/credentials/create/create_test.go | 43 +-------- .../mariadb/credentials/delete/delete_test.go | 52 +---------- .../credentials/describe/describe_test.go | 50 +--------- internal/cmd/mariadb/credentials/list/list.go | 6 +- .../cmd/mariadb/credentials/list/list_test.go | 43 +-------- .../cmd/mariadb/instance/create/create.go | 6 +- .../mariadb/instance/create/create_test.go | 66 ++------------ .../mariadb/instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- internal/cmd/mariadb/instance/list/list.go | 6 +- .../cmd/mariadb/instance/list/list_test.go | 46 +--------- internal/cmd/mariadb/plans/plans.go | 6 +- internal/cmd/mariadb/plans/plans_test.go | 46 +--------- .../backup/describe/describe_test.go | 50 +--------- internal/cmd/mongodbflex/backup/list/list.go | 6 +- .../cmd/mongodbflex/backup/list/list_test.go | 43 +-------- .../backup/restore-jobs/restore_jobs.go | 6 +- .../backup/restore-jobs/restore_jobs_test.go | 43 +-------- .../cmd/mongodbflex/backup/restore/restore.go | 6 +- .../backup/restore/restore_test.go | 53 +---------- .../mongodbflex/backup/schedule/schedule.go | 6 +- .../backup/schedule/schedule_test.go | 46 +--------- .../backup/update-schedule/update_schedule.go | 6 +- .../update-schedule/update_schedule_test.go | 42 +-------- .../cmd/mongodbflex/instance/create/create.go | 6 +- .../instance/create/create_test.go | 55 +---------- .../instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- .../cmd/mongodbflex/instance/list/list.go | 6 +- .../mongodbflex/instance/list/list_test.go | 46 +--------- internal/cmd/mongodbflex/options/options.go | 6 +- .../cmd/mongodbflex/options/options_test.go | 44 +-------- .../cmd/mongodbflex/user/create/create.go | 6 +- .../mongodbflex/user/create/create_test.go | 46 +--------- .../mongodbflex/user/delete/delete_test.go | 52 +---------- .../user/describe/describe_test.go | 50 +--------- internal/cmd/mongodbflex/user/list/list.go | 6 +- .../cmd/mongodbflex/user/list/list_test.go | 46 +--------- .../reset-password/reset_password_test.go | 50 +--------- .../mongodbflex/user/update/update_test.go | 52 +---------- internal/cmd/network-area/create/create.go | 6 +- .../cmd/network-area/create/create_test.go | 43 +-------- .../cmd/network-area/delete/delete_test.go | 52 +---------- .../network-area/describe/describe_test.go | 50 +--------- internal/cmd/network-area/list/list.go | 6 +- internal/cmd/network-area/list/list_test.go | 43 +-------- .../network-range/create/create.go | 6 +- .../network-range/create/create_test.go | 43 +-------- .../network-area/network-range/list/list.go | 6 +- .../network-range/list/list_test.go | 43 +-------- .../cmd/network-area/route/create/create.go | 6 +- .../network-area/route/create/create_test.go | 43 +-------- internal/cmd/network-area/route/list/list.go | 6 +- .../cmd/network-area/route/list/list_test.go | 43 +-------- .../cmd/network-interface/create/create.go | 6 +- .../network-interface/create/create_test.go | 43 +-------- internal/cmd/network-interface/list/list.go | 6 +- .../cmd/network-interface/list/list_test.go | 43 +-------- internal/cmd/network/create/create.go | 6 +- internal/cmd/network/create/create_test.go | 43 +-------- internal/cmd/network/delete/delete_test.go | 52 +---------- .../cmd/network/describe/describe_test.go | 50 +--------- internal/cmd/network/list/list.go | 6 +- internal/cmd/network/list/list_test.go | 43 +-------- .../bucket/create/create_test.go | 50 +--------- .../bucket/delete/delete_test.go | 52 +---------- .../bucket/describe/describe_test.go | 50 +--------- .../cmd/object-storage/bucket/list/list.go | 6 +- .../object-storage/bucket/list/list_test.go | 46 +--------- .../credentials-group/create/create.go | 6 +- .../credentials-group/create/create_test.go | 43 +-------- .../credentials-group/delete/delete_test.go | 52 +---------- .../credentials-group/list/list.go | 6 +- .../credentials-group/list/list_test.go | 43 +-------- .../credentials/create/create.go | 6 +- .../credentials/create/create_test.go | 43 +-------- .../credentials/delete/delete_test.go | 52 +---------- .../object-storage/credentials/list/list.go | 6 +- .../credentials/list/list_test.go | 43 +-------- .../cmd/object-storage/disable/disable.go | 6 +- .../object-storage/disable/disable_test.go | 45 +-------- internal/cmd/object-storage/enable/enable.go | 6 +- .../cmd/object-storage/enable/enable_test.go | 45 +-------- .../credentials/create/create.go | 6 +- .../credentials/create/create_test.go | 42 +-------- .../observability/credentials/list/list.go | 6 +- .../credentials/list/list_test.go | 42 +-------- .../disable/disable_test.go | 52 +---------- .../public-read-access/enable/enable_test.go | 52 +---------- .../single-sign-on/disable/disable_test.go | 52 +---------- .../single-sign-on/enable/enable_test.go | 52 +---------- .../observability/instance/create/create.go | 6 +- .../instance/create/create_test.go | 43 +-------- .../instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- .../cmd/observability/instance/list/list.go | 6 +- .../observability/instance/list/list_test.go | 45 +-------- .../instance/update/update_test.go | 52 +---------- internal/cmd/observability/plans/plans.go | 6 +- .../cmd/observability/plans/plans_test.go | 46 +--------- .../scrape-config/create/create.go | 6 +- .../scrape-config/create/create_test.go | 53 +---------- .../generate-payload/generate_payload.go | 6 +- .../generate-payload/generate_payload_test.go | 51 +---------- .../observability/scrape-config/list/list.go | 6 +- .../scrape-config/list/list_test.go | 46 +--------- .../opensearch/credentials/create/create.go | 6 +- .../credentials/create/create_test.go | 43 +-------- .../credentials/delete/delete_test.go | 52 +---------- .../credentials/describe/describe_test.go | 50 +--------- .../cmd/opensearch/credentials/list/list.go | 6 +- .../opensearch/credentials/list/list_test.go | 43 +-------- .../cmd/opensearch/instance/create/create.go | 6 +- .../opensearch/instance/create/create_test.go | 78 ++-------------- .../opensearch/instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- internal/cmd/opensearch/instance/list/list.go | 6 +- .../cmd/opensearch/instance/list/list_test.go | 46 +--------- internal/cmd/opensearch/plans/plans.go | 6 +- internal/cmd/opensearch/plans/plans_test.go | 46 +--------- .../cmd/organization/member/add/add_test.go | 52 +---------- internal/cmd/organization/member/list/list.go | 6 +- .../cmd/organization/member/list/list_test.go | 46 +--------- .../organization/member/remove/remove_test.go | 52 +---------- internal/cmd/organization/role/list/list.go | 6 +- .../cmd/organization/role/list/list_test.go | 46 +--------- internal/cmd/postgresflex/backup/list/list.go | 6 +- .../cmd/postgresflex/backup/list/list_test.go | 43 +-------- .../backup/update-schedule/update_schedule.go | 6 +- .../update-schedule/update_schedule_test.go | 42 +-------- .../postgresflex/instance/clone/clone_test.go | 50 +--------- .../postgresflex/instance/create/create.go | 6 +- .../instance/create/create_test.go | 55 +---------- .../instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- .../cmd/postgresflex/instance/list/list.go | 6 +- .../postgresflex/instance/list/list_test.go | 46 +--------- internal/cmd/postgresflex/options/options.go | 6 +- .../cmd/postgresflex/options/options_test.go | 44 +-------- .../cmd/postgresflex/user/create/create.go | 6 +- .../postgresflex/user/create/create_test.go | 46 +--------- .../postgresflex/user/delete/delete_test.go | 52 +---------- .../user/describe/describe_test.go | 50 +--------- internal/cmd/postgresflex/user/list/list.go | 6 +- .../cmd/postgresflex/user/list/list_test.go | 46 +--------- .../reset-password/reset_password_test.go | 50 +--------- .../postgresflex/user/update/update_test.go | 52 +---------- internal/cmd/project/create/create.go | 6 +- internal/cmd/project/create/create_test.go | 55 +---------- internal/cmd/project/delete/delete.go | 6 +- internal/cmd/project/delete/delete_test.go | 45 +-------- .../cmd/project/describe/describe_test.go | 50 +--------- internal/cmd/project/list/list.go | 6 +- internal/cmd/project/list/list_test.go | 66 ++------------ internal/cmd/project/member/add/add_test.go | 52 +---------- internal/cmd/project/member/list/list.go | 6 +- internal/cmd/project/member/list/list_test.go | 46 +--------- .../cmd/project/member/remove/remove_test.go | 52 +---------- internal/cmd/project/role/list/list.go | 6 +- internal/cmd/project/role/list/list_test.go | 46 +--------- internal/cmd/project/update/update.go | 6 +- internal/cmd/project/update/update_test.go | 57 +----------- internal/cmd/public-ip/create/create.go | 6 +- internal/cmd/public-ip/create/create_test.go | 43 +-------- internal/cmd/public-ip/delete/delete_test.go | 52 +---------- .../cmd/public-ip/describe/describe_test.go | 50 +--------- internal/cmd/public-ip/list/list.go | 6 +- internal/cmd/public-ip/list/list_test.go | 43 +-------- internal/cmd/public-ip/ranges/list/list.go | 6 +- .../cmd/public-ip/ranges/list/list_test.go | 42 +++------ internal/cmd/quota/list/list.go | 6 +- internal/cmd/quota/list/list_test.go | 41 +-------- .../cmd/rabbitmq/credentials/create/create.go | 6 +- .../credentials/create/create_test.go | 43 +-------- .../credentials/delete/delete_test.go | 52 +---------- .../credentials/describe/describe_test.go | 50 +--------- .../cmd/rabbitmq/credentials/list/list.go | 6 +- .../rabbitmq/credentials/list/list_test.go | 43 +-------- .../cmd/rabbitmq/instance/create/create.go | 6 +- .../rabbitmq/instance/create/create_test.go | 78 ++-------------- .../rabbitmq/instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- internal/cmd/rabbitmq/instance/list/list.go | 6 +- .../cmd/rabbitmq/instance/list/list_test.go | 46 +--------- internal/cmd/rabbitmq/plans/plans.go | 6 +- internal/cmd/rabbitmq/plans/plans_test.go | 46 +--------- .../cmd/redis/credentials/create/create.go | 6 +- .../redis/credentials/create/create_test.go | 43 +-------- .../redis/credentials/delete/delete_test.go | 52 +---------- .../credentials/describe/describe_test.go | 50 +--------- internal/cmd/redis/credentials/list/list.go | 6 +- .../cmd/redis/credentials/list/list_test.go | 43 +-------- internal/cmd/redis/instance/create/create.go | 6 +- .../cmd/redis/instance/create/create_test.go | 66 ++------------ .../cmd/redis/instance/delete/delete_test.go | 52 +---------- .../redis/instance/describe/describe_test.go | 50 +--------- internal/cmd/redis/instance/list/list.go | 6 +- internal/cmd/redis/instance/list/list_test.go | 46 +--------- internal/cmd/redis/plans/plans.go | 6 +- internal/cmd/redis/plans/plans_test.go | 46 +--------- .../secrets-manager/instance/create/create.go | 6 +- .../instance/create/create_test.go | 55 +---------- .../instance/delete/delete_test.go | 52 +---------- .../instance/describe/describe_test.go | 50 +--------- .../cmd/secrets-manager/instance/list/list.go | 6 +- .../instance/list/list_test.go | 46 +--------- .../cmd/secrets-manager/user/create/create.go | 6 +- .../user/create/create_test.go | 46 +--------- .../user/delete/delete_test.go | 52 +---------- .../user/describe/describe_test.go | 50 +--------- .../cmd/secrets-manager/user/list/list.go | 6 +- .../secrets-manager/user/list/list_test.go | 46 +--------- internal/cmd/security-group/create/create.go | 6 +- .../cmd/security-group/create/create_test.go | 41 +-------- .../cmd/security-group/delete/delete_test.go | 1 + .../security-group/describe/describe_test.go | 1 + internal/cmd/security-group/list/list.go | 6 +- internal/cmd/security-group/list/list_test.go | 41 +-------- .../cmd/security-group/rule/create/create.go | 6 +- .../security-group/rule/create/create_test.go | 51 +---------- .../rule/describe/describe_test.go | 50 +--------- internal/cmd/security-group/rule/list/list.go | 6 +- .../cmd/security-group/rule/list/list_test.go | 43 +-------- .../cmd/security-group/update/update_test.go | 1 + internal/cmd/server/backup/create/create.go | 6 +- .../cmd/server/backup/create/create_test.go | 43 +-------- .../cmd/server/backup/delete/delete_test.go | 52 +---------- .../server/backup/describe/describe_test.go | 50 +--------- internal/cmd/server/backup/disable/disable.go | 6 +- .../cmd/server/backup/disable/disable_test.go | 61 +++---------- internal/cmd/server/backup/enable/enable.go | 6 +- .../cmd/server/backup/enable/enable_test.go | 61 +++---------- internal/cmd/server/backup/list/list.go | 6 +- internal/cmd/server/backup/list/list_test.go | 43 +-------- .../cmd/server/backup/restore/restore_test.go | 52 +---------- .../server/backup/schedule/create/create.go | 6 +- .../backup/schedule/create/create_test.go | 43 +-------- .../backup/schedule/delete/delete_test.go | 52 +---------- .../backup/schedule/describe/describe_test.go | 50 +--------- .../cmd/server/backup/schedule/list/list.go | 6 +- .../server/backup/schedule/list/list_test.go | 43 +-------- .../volume-backup/delete/delete_test.go | 52 +---------- .../volume-backup/restore/restore_test.go | 52 +---------- internal/cmd/server/command/create/create.go | 6 +- .../cmd/server/command/create/create_test.go | 43 +-------- .../server/command/describe/describe_test.go | 50 +--------- internal/cmd/server/command/list/list.go | 6 +- internal/cmd/server/command/list/list_test.go | 43 +-------- .../template/describe/describe_test.go | 50 +--------- .../cmd/server/command/template/list/list.go | 6 +- .../server/command/template/list/list_test.go | 43 +-------- internal/cmd/server/console/console_test.go | 50 +--------- internal/cmd/server/create/create.go | 6 +- internal/cmd/server/create/create_test.go | 50 ++-------- .../cmd/server/deallocate/deallocate_test.go | 52 +---------- internal/cmd/server/delete/delete_test.go | 52 +---------- internal/cmd/server/describe/describe_test.go | 50 +--------- internal/cmd/server/list/list.go | 6 +- internal/cmd/server/list/list_test.go | 43 +-------- internal/cmd/server/log/log_test.go | 50 +--------- .../machine-type/describe/describe_test.go | 50 +--------- internal/cmd/server/machine-type/list/list.go | 6 +- .../cmd/server/machine-type/list/list_test.go | 43 +-------- .../server/network-interface/attach/attach.go | 6 +- .../network-interface/attach/attach_test.go | 53 +---------- .../server/network-interface/detach/detach.go | 6 +- .../network-interface/detach/detach_test.go | 53 +---------- .../cmd/server/network-interface/list/list.go | 6 +- .../network-interface/list/list_test.go | 43 +-------- .../cmd/server/os-update/create/create.go | 6 +- .../server/os-update/create/create_test.go | 43 +-------- .../os-update/describe/describe_test.go | 50 +--------- .../cmd/server/os-update/disable/disable.go | 6 +- .../server/os-update/disable/disable_test.go | 61 +++---------- .../cmd/server/os-update/enable/enable.go | 6 +- .../server/os-update/enable/enable_test.go | 61 +++---------- internal/cmd/server/os-update/list/list.go | 6 +- .../cmd/server/os-update/list/list_test.go | 43 +-------- .../os-update/schedule/create/create.go | 6 +- .../os-update/schedule/create/create_test.go | 43 +-------- .../os-update/schedule/delete/delete_test.go | 52 +---------- .../schedule/describe/describe_test.go | 50 +--------- .../server/os-update/schedule/list/list.go | 6 +- .../os-update/schedule/list/list_test.go | 43 +-------- internal/cmd/server/reboot/reboot_test.go | 52 +---------- internal/cmd/server/rescue/rescue_test.go | 52 +---------- internal/cmd/server/resize/resize_test.go | 52 +---------- .../cmd/server/service-account/list/list.go | 6 +- .../server/service-account/list/list_test.go | 43 +-------- internal/cmd/server/start/start_test.go | 52 +---------- internal/cmd/server/stop/stop_test.go | 52 +---------- internal/cmd/server/unrescue/unrescue_test.go | 52 +---------- internal/cmd/server/volume/list/list.go | 6 +- internal/cmd/server/volume/list/list_test.go | 43 +-------- internal/cmd/service-account/create/create.go | 6 +- .../cmd/service-account/create/create_test.go | 43 +-------- .../cmd/service-account/delete/delete_test.go | 52 +---------- .../cmd/service-account/key/create/create.go | 6 +- .../service-account/key/create/create_test.go | 45 +-------- .../service-account/key/delete/delete_test.go | 52 +---------- .../key/describe/describe_test.go | 50 +--------- internal/cmd/service-account/key/list/list.go | 6 +- .../cmd/service-account/key/list/list_test.go | 46 +--------- .../service-account/key/update/update_test.go | 52 +---------- internal/cmd/service-account/list/list.go | 6 +- .../cmd/service-account/list/list_test.go | 46 +--------- .../service-account/token/create/create.go | 6 +- .../token/create/create_test.go | 43 +-------- .../cmd/service-account/token/list/list.go | 6 +- .../service-account/token/list/list_test.go | 46 +--------- .../token/revoke/revoke_test.go | 52 +---------- .../cmd/ske/cluster/create/create_test.go | 59 +----------- .../cmd/ske/cluster/delete/delete_test.go | 52 +---------- .../cmd/ske/cluster/describe/describe_test.go | 50 +--------- .../generate-payload/generate_payload.go | 6 +- .../generate-payload/generate_payload_test.go | 51 +---------- internal/cmd/ske/cluster/list/list.go | 6 +- internal/cmd/ske/cluster/list/list_test.go | 46 +--------- .../cmd/ske/cluster/update/update_test.go | 50 +--------- .../complete_rotation_test.go | 52 +---------- .../start-rotation/start_rotation_test.go | 52 +---------- internal/cmd/ske/describe/describe.go | 6 +- internal/cmd/ske/describe/describe_test.go | 44 +-------- internal/cmd/ske/disable/disable.go | 6 +- internal/cmd/ske/disable/disable_test.go | 45 +-------- internal/cmd/ske/enable/enable.go | 6 +- internal/cmd/ske/enable/enable_test.go | 45 +-------- .../cmd/ske/kubeconfig/create/create_test.go | 50 +--------- internal/cmd/ske/options/options.go | 6 +- internal/cmd/ske/options/options_test.go | 43 +-------- internal/cmd/volume/backup/create/create.go | 6 +- .../cmd/volume/backup/create/create_test.go | 43 +-------- .../cmd/volume/backup/delete/delete_test.go | 44 +-------- .../volume/backup/describe/describe_test.go | 42 +-------- internal/cmd/volume/backup/list/list.go | 6 +- internal/cmd/volume/backup/list/list_test.go | 46 +--------- .../cmd/volume/backup/restore/restore_test.go | 44 +-------- .../cmd/volume/backup/update/update_test.go | 44 +-------- internal/cmd/volume/create/create.go | 6 +- internal/cmd/volume/create/create_test.go | 43 +-------- internal/cmd/volume/delete/delete_test.go | 52 +---------- internal/cmd/volume/describe/describe_test.go | 50 +--------- internal/cmd/volume/list/list.go | 6 +- internal/cmd/volume/list/list_test.go | 43 +-------- .../describe/describe_test.go | 51 +---------- .../cmd/volume/performance-class/list/list.go | 6 +- .../performance-class/list/list_test.go | 43 +-------- internal/cmd/volume/snapshot/create/create.go | 6 +- .../cmd/volume/snapshot/create/create_test.go | 45 +-------- .../cmd/volume/snapshot/delete/delete_test.go | 44 +-------- .../volume/snapshot/describe/describe_test.go | 42 +-------- internal/cmd/volume/snapshot/list/list.go | 6 +- .../cmd/volume/snapshot/list/list_test.go | 35 +------ .../cmd/volume/snapshot/update/update_test.go | 44 +-------- internal/pkg/testutils/testutils.go | 91 +++++++++++++++++++ 480 files changed, 1480 insertions(+), 14225 deletions(-) create mode 100644 internal/pkg/testutils/testutils.go diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index 30daf9339..89e7659bb 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -40,9 +40,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit affinity-group create --name AFFINITY_GROUP_NAME --policy soft-affinity", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -98,7 +98,7 @@ func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClie return req } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/affinity-groups/create/create_test.go b/internal/cmd/affinity-groups/create/create_test.go index 0f71d31db..ba70232d0 100644 --- a/internal/cmd/affinity-groups/create/create_test.go +++ b/internal/cmd/affinity-groups/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -80,6 +81,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateAffinityGroupPayload)) iaas func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -120,43 +122,7 @@ func TestParseInput(t *testing.T) { } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - if err := cmd.Flags().Set(flag, value); err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 36ae4f28c..75d0e667e 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -42,9 +42,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit affinity-group list --limit=10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -85,7 +85,7 @@ func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClie return apiClient.ListAffinityGroups(ctx, model.ProjectId) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/affinity-groups/list/list_test.go b/internal/cmd/affinity-groups/list/list_test.go index b44af626c..23c643f1b 100644 --- a/internal/cmd/affinity-groups/list/list_test.go +++ b/internal/cmd/affinity-groups/list/list_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListAffinityGroupsRequest)) ia func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -105,43 +107,7 @@ func TestParseInput(t *testing.T) { } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - if err := cmd.Flags().Set(flag, value); err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/auth/activate-service-account/activate_service_account.go b/internal/cmd/auth/activate-service-account/activate_service_account.go index 1246dcd98..a3cf1ee46 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account.go @@ -58,8 +58,11 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit auth activate-service-account --service-account-token my-service-account-token --only-print-access-token", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { - model := parseInput(params.Printer, cmd) + RunE: func(cmd *cobra.Command, args []string) error { + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } tokenCustomEndpoint := viper.GetString(config.TokenCustomEndpointKey) if !model.OnlyPrintAccessToken { @@ -113,7 +116,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(onlyPrintAccessTokenFlag, false, "If this is set to true the credentials are not stored in either the keyring or a file") } -func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { model := inputModel{ ServiceAccountToken: flags.FlagToStringValue(p, cmd, serviceAccountTokenFlag), ServiceAccountKeyPath: flags.FlagToStringValue(p, cmd, serviceAccountKeyPathFlag), @@ -122,7 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { } p.DebugInputModel(model) - return &model + return &model, nil } func storeCustomEndpoint(tokenCustomEndpoint string) error { diff --git a/internal/cmd/auth/activate-service-account/activate_service_account_test.go b/internal/cmd/auth/activate-service-account/activate_service_account_test.go index 84532195c..026ba8dce 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account_test.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account_test.go @@ -3,15 +3,12 @@ package activateserviceaccount import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/zalando/go-keyring" - - "github.com/google/go-cmp/cmp" ) var testTokenCustomEndpoint = "token_url" @@ -45,6 +42,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string tokenCustomEndpoint string isValid bool @@ -106,32 +104,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - model := parseInput(p, cmd) - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 8db52f60e..a26b71b20 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -29,8 +29,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Print a short-lived access token`, "$ stackit auth get-access-token"), ), - RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(params.Printer, cmd) + RunE: func(cmd *cobra.Command, args []string) error { + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index 64d3c2871..33551e3ac 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create an application loadbalancer from a configuration file`, "$ stackit beta alb create --configuration my-loadbalancer.json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -107,7 +107,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/create/create_test.go b/internal/cmd/beta/alb/create/create_test.go index 82517b0f5..a3b7c0725 100644 --- a/internal/cmd/beta/alb/create/create_test.go +++ b/internal/cmd/beta/alb/create/create_test.go @@ -13,6 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -79,6 +80,7 @@ func fixtureRequest(mods ...func(request *alb.ApiCreateLoadBalancerRequest)) alb func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -134,46 +136,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/delete/delete_test.go b/internal/cmd/beta/alb/delete/delete_test.go index ce6808fbd..6c5290a52 100644 --- a/internal/cmd/beta/alb/delete/delete_test.go +++ b/internal/cmd/beta/alb/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -112,54 +111,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argsValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/describe/describe_test.go b/internal/cmd/beta/alb/describe/describe_test.go index 4d1195313..9132fc5af 100644 --- a/internal/cmd/beta/alb/describe/describe_test.go +++ b/internal/cmd/beta/alb/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -112,54 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argsValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index a16443730..2c4d8924d 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit beta alb list --limit=10`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/list/list_test.go b/internal/cmd/beta/alb/list/list_test.go index f0fb05146..c623ea0b8 100644 --- a/internal/cmd/beta/alb/list/list_test.go +++ b/internal/cmd/beta/alb/list/list_test.go @@ -9,6 +9,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/uuid" @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *alb.ApiListLoadBalancersRequest)) alb. func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -99,44 +101,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index 8fd15d81d..1b430cdf6 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -40,10 +40,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Add observability credentials to a load balancer with username "xxx" and display name "yyy", providing the path to a file with the password as flag`, "$ stackit beta alb observability-credentials add --username xxx --password @./password.txt --display-name yyy"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -84,7 +84,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(flags.MarkFlagsRequired(cmd, usernameFlag, displaynameFlag)) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ diff --git a/internal/cmd/beta/alb/observability-credentials/add/add_test.go b/internal/cmd/beta/alb/observability-credentials/add/add_test.go index b5fa2bac6..fb81d7a34 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add_test.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -82,6 +83,7 @@ func fixturePayload(mods ...func(payload *alb.CreateCredentialsPayload)) alb.Cre func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -101,46 +103,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go b/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go index 79412281b..df4d70fe1 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -112,54 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argsValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index dace68982..961455b53 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit beta alb observability-credentials list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -90,7 +90,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Number of credentials to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) diff --git a/internal/cmd/beta/alb/observability-credentials/list/list_test.go b/internal/cmd/beta/alb/observability-credentials/list/list_test.go index 77863ded8..e8054a4e8 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list_test.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -65,6 +66,7 @@ func fixtureRequest(mods ...func(request *alb.ApiListCredentialsRequest)) alb.Ap func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -120,46 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatal("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/observability-credentials/update/update_test.go b/internal/cmd/beta/alb/observability-credentials/update/update_test.go index 4d3780ba1..1fd029be1 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update_test.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update_test.go @@ -84,6 +84,7 @@ func fixturePayload(mods ...func(payload *alb.UpdateCredentialsPayload)) alb.Upd func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string args []string isValid bool diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index 55c4ab6c5..6bb5e01fc 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -34,9 +34,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit beta alb plans`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/plans/plans_test.go b/internal/cmd/beta/alb/plans/plans_test.go index 84b5c9002..1a31d711b 100644 --- a/internal/cmd/beta/alb/plans/plans_test.go +++ b/internal/cmd/beta/alb/plans/plans_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -55,6 +56,7 @@ func fixtureRequest(mods ...func(request *alb.ApiListPlansRequest)) alb.ApiListP func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -95,44 +97,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index a3a8aa983..ca294f052 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Update an application target pool from a configuration file (the name of the pool is read from the file)`, "$ stackit beta alb update --configuration my-target-pool.json --name my-load-balancer"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/pool/update/update_test.go b/internal/cmd/beta/alb/pool/update/update_test.go index f279c1f01..15bc4f4a9 100644 --- a/internal/cmd/beta/alb/pool/update/update_test.go +++ b/internal/cmd/beta/alb/pool/update/update_test.go @@ -13,6 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -85,6 +86,7 @@ func fixtureRequest(mods ...func(request *alb.ApiUpdateTargetPoolRequest)) alb.A func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -142,46 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index 9b2729c29..3f9a63002 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -33,9 +33,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit beta alb quotas`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/quotas/quotas_test.go b/internal/cmd/beta/alb/quotas/quotas_test.go index 6240e20d3..ee63dffcd 100644 --- a/internal/cmd/beta/alb/quotas/quotas_test.go +++ b/internal/cmd/beta/alb/quotas/quotas_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -55,6 +56,7 @@ func fixtureRequest(mods ...func(request *alb.ApiGetQuotaRequest)) alb.ApiGetQuo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -95,44 +97,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/template/template.go b/internal/cmd/beta/alb/template/template.go index c1dad5350..a57b83f67 100644 --- a/internal/cmd/beta/alb/template/template.go +++ b/internal/cmd/beta/alb/template/template.go @@ -53,8 +53,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit beta alb template --format=json --type pool`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(params.Printer, cmd) + RunE: func(cmd *cobra.Command, args []string) error { + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().VarP(flags.EnumFlag(true, "alb", "alb", "pool"), typeFlag, "t", "Defines the output type ('alb' or 'pool'), default is 'alb'") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/template/template_test.go b/internal/cmd/beta/alb/template/template_test.go index be7bed72d..7f73d3f7d 100644 --- a/internal/cmd/beta/alb/template/template_test.go +++ b/internal/cmd/beta/alb/template/template_test.go @@ -3,12 +3,10 @@ package template import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/uuid" ) @@ -41,6 +39,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -138,44 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index a8b32b156..c1c576f06 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Update an application loadbalancer from a configuration file`, "$ stackit beta alb update --configuration my-loadbalancer.json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -114,7 +114,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/alb/update/update_test.go b/internal/cmd/beta/alb/update/update_test.go index 5749b8b86..dc8f5986a 100644 --- a/internal/cmd/beta/alb/update/update_test.go +++ b/internal/cmd/beta/alb/update/update_test.go @@ -13,6 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) @@ -82,6 +83,7 @@ func fixtureRequest(mods ...func(request *alb.ApiUpdateLoadBalancerRequest)) alb func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -137,46 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/database/create/create_test.go b/internal/cmd/beta/sqlserverflex/database/create/create_test.go index c6359313e..23001c28c 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -177,54 +178,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go index 53a099f48..ab137dcd0 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" "github.com/google/go-cmp/cmp" @@ -160,54 +159,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go index 919b1e3c5..b77f11679 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -159,54 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index 990946dad..38f630a3f 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 SQLServer Flex databases of instance with ID "xxx"`, "$ stackit beta sqlserverflex database list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -98,7 +98,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/sqlserverflex/database/list/list_test.go b/internal/cmd/beta/sqlserverflex/database/list/list_test.go index 0aa4979f7..ae340d0db 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiListDatabasesRequest) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -138,48 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 9acc361b7..cc5f2214d 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -82,10 +82,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a SQLServer Flex instance with name "my-instance", specify flavor by CPU and RAM, set storage size to 20 GB, and restrict access to a specific range of IP addresses. Other parameters are set to default values`, `$ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -156,7 +156,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go index 851d3d1fd..40481f963 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -131,6 +132,7 @@ func fixturePayload(mods ...func(payload *sqlserverflex.CreateInstancePayload)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -251,56 +253,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.aclValues { - err := cmd.Flags().Set(aclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", aclFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + aclFlag: tt.aclValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go index ae971f31d..fe66b190b 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -139,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go index 7412418c6..66676b001 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 3e8606347..76cf59d8a 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 SQLServer Flex instances`, "$ stackit beta sqlserverflex instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go index be4b5debe..59711594b 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiListInstancesRequest) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index a6c126e8b..9352e53b5 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -106,9 +106,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List SQL Server Flex user roles and database compatibilities for a given instance. The IDs of existing instances can be obtained by running "$ stackit beta sqlserverflex instance list"`, "$ stackit beta sqlserverflex options --user-roles --db-compatibilities --instance-id "), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -143,7 +143,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(instanceIdFlag, "", `The instance ID to show user roles, database collations and database compatibilities for. Only relevant when "--user-roles", "--db-collations" or "--db-compatibilities" is passed`) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) flavors := flags.FlagToBoolValue(p, cmd, flavorsFlag) diff --git a/internal/cmd/beta/sqlserverflex/options/options_test.go b/internal/cmd/beta/sqlserverflex/options/options_test.go index 1f527d85e..61b24b242 100644 --- a/internal/cmd/beta/sqlserverflex/options/options_test.go +++ b/internal/cmd/beta/sqlserverflex/options/options_test.go @@ -5,11 +5,11 @@ import ( "fmt" "testing" - "github.com/google/go-cmp/cmp" "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -158,6 +158,7 @@ func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -263,46 +264,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index cb159965f..5160873f2 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit beta sqlserverflex user create --instance-id xxx --username johndoe --roles "##STACKIT_LoginManager##,##STACKIT_DatabaseManager##"`), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -107,7 +107,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/sqlserverflex/user/create/create_test.go b/internal/cmd/beta/sqlserverflex/user/create/create_test.go index 4c294d6d9..ad5df9a27 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -70,6 +70,7 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiCreateUserRequest)) s func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -139,48 +140,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go index c4345ba6a..9220bcbfc 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -154,54 +153,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go index 8f44c6db7..e67aeb3b9 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -153,54 +154,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index 08950270e..0c131e32b 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit beta sqlserverflex user list --instance-id xxx --limit 10"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -99,7 +99,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/beta/sqlserverflex/user/list/list_test.go b/internal/cmd/beta/sqlserverflex/user/list/list_test.go index 7ec60722f..ef80e6252 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *sqlserverflex.ApiListUsersRequest)) sq func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -131,48 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go index eeeb230a1..b15b7069e 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) @@ -153,54 +154,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/config/profile/create/create_test.go b/internal/cmd/config/profile/create/create_test.go index 6bf77a7ae..a2edcfe47 100644 --- a/internal/cmd/config/profile/create/create_test.go +++ b/internal/cmd/config/profile/create/create_test.go @@ -3,12 +3,8 @@ package create import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - - "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) const testProfile = "test-profile" @@ -105,54 +101,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/config/profile/delete/delete_test.go b/internal/cmd/config/profile/delete/delete_test.go index 66374b69d..e3ea1bf51 100644 --- a/internal/cmd/config/profile/delete/delete_test.go +++ b/internal/cmd/config/profile/delete/delete_test.go @@ -3,12 +3,8 @@ package delete import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - - "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) const testProfile = "test-profile" @@ -81,54 +77,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/config/profile/export/export_test.go b/internal/cmd/config/profile/export/export_test.go index 5975cf783..dc67621da 100644 --- a/internal/cmd/config/profile/export/export_test.go +++ b/internal/cmd/config/profile/export/export_test.go @@ -4,12 +4,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - - "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) const ( @@ -103,54 +99,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argsValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/config/profile/import/import.go b/internal/cmd/config/profile/import/import.go index 82f8229dd..a499f0da0 100644 --- a/internal/cmd/config/profile/import/import.go +++ b/internal/cmd/config/profile/import/import.go @@ -41,8 +41,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { ), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(params.Printer, cmd) + RunE: func(cmd *cobra.Command, args []string) error { + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -70,7 +70,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(cmd.MarkFlagRequired(configFlag)) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := &inputModel{ diff --git a/internal/cmd/config/profile/import/import_test.go b/internal/cmd/config/profile/import/import_test.go index 121b7adb9..e676f1b14 100644 --- a/internal/cmd/config/profile/import/import_test.go +++ b/internal/cmd/config/profile/import/import_test.go @@ -5,11 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - - "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) const testProfile = "test-profile" @@ -49,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -75,45 +73,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - t.Fatalf("error parsing input: %v", err) - } - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(tt.expectedModel, model) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/config/profile/set/set_test.go b/internal/cmd/config/profile/set/set_test.go index 67b5f0789..a2ccdbbff 100644 --- a/internal/cmd/config/profile/set/set_test.go +++ b/internal/cmd/config/profile/set/set_test.go @@ -3,12 +3,8 @@ package set import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - - "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) const testProfile = "test-profile" @@ -81,54 +77,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index 841f8e66e..5e4dfa540 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -76,8 +76,8 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Set the DNS custom endpoint. This endpoint will be used on all calls to the DNS API (unless overridden by the "STACKIT_DNS_CUSTOM_ENDPOINT" environment variable)`, "$ stackit config set --dns-custom-endpoint https://dns.stackit.cloud"), ), - RunE: func(cmd *cobra.Command, _ []string) error { - model, err := parseInput(params.Printer, cmd) + RunE: func(cmd *cobra.Command, args []string) error { + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -217,7 +217,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { sessionTimeLimit, err := parseSessionTimeLimit(p, cmd) if err != nil { return nil, &errors.FlagValidationError{ diff --git a/internal/cmd/config/set/set_test.go b/internal/cmd/config/set/set_test.go index 8015fddff..c13c84d5c 100644 --- a/internal/cmd/config/set/set_test.go +++ b/internal/cmd/config/set/set_test.go @@ -3,19 +3,17 @@ package set import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/uuid" ) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -123,46 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 1320248d4..96a5fc8e7 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -53,9 +53,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a DNS record set with name "my-rr" with records "1.2.3.4" and "5.6.7.8" in zone with ID "xxx"`, "$ stackit dns record-set create --zone-id xxx --name my-rr --record 1.2.3.4 --record 5.6.7.8"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -123,7 +123,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/dns/record-set/create/create_test.go b/internal/cmd/dns/record-set/create/create_test.go index 789e46626..d284504bf 100644 --- a/internal/cmd/dns/record-set/create/create_test.go +++ b/internal/cmd/dns/record-set/create/create_test.go @@ -12,6 +12,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/dns" ) @@ -86,6 +87,7 @@ func fixtureRequest(mods ...func(request *dns.ApiCreateRecordSetRequest)) dns.Ap func TestParseInput(t *testing.T) { var tests = []struct { description string + argValues []string flagValues map[string]string recordFlagValues []string isValid bool @@ -267,56 +269,9 @@ func TestParseInput(t *testing.T) { } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.recordFlagValues { - err := cmd.Flags().Set(recordFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", recordFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + recordFlag: tt.recordFlagValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/dns/record-set/delete/delete_test.go b/internal/cmd/dns/record-set/delete/delete_test.go index 55b534fde..c02628dd1 100644 --- a/internal/cmd/dns/record-set/delete/delete_test.go +++ b/internal/cmd/dns/record-set/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/record-set/describe/describe_test.go b/internal/cmd/dns/record-set/describe/describe_test.go index 55a032bd8..45d58c2a1 100644 --- a/internal/cmd/dns/record-set/describe/describe_test.go +++ b/internal/cmd/dns/record-set/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/dns" ) @@ -164,54 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index 1d9093de7..eedc2a59e 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -72,9 +72,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List the deleted DNS record-sets for zone with ID "xxx"`, "$ stackit dns record-set list --zone-id xxx --deleted"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -123,7 +123,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/dns/record-set/list/list_test.go b/internal/cmd/dns/record-set/list/list_test.go index 122a2b29d..6eaf5504b 100644 --- a/internal/cmd/dns/record-set/list/list_test.go +++ b/internal/cmd/dns/record-set/list/list_test.go @@ -14,6 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/dns" @@ -72,6 +73,7 @@ func fixtureRequest(mods ...func(request *dns.ApiListRecordSetsRequest)) dns.Api func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -214,46 +216,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/zone/clone/clone_test.go b/internal/cmd/dns/zone/clone/clone_test.go index 01f738f3a..b17d634fe 100644 --- a/internal/cmd/dns/zone/clone/clone_test.go +++ b/internal/cmd/dns/zone/clone/clone_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/dns" ) @@ -169,54 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index a28e05622..0658ceb8b 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -68,9 +68,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a DNS zone with name "my-zone", DNS name "www.my-zone.com" and default time to live of 1000ms`, "$ stackit dns zone create --name my-zone --dns-name www.my-zone.com --default-ttl 1000"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -145,7 +145,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/dns/zone/create/create_test.go b/internal/cmd/dns/zone/create/create_test.go index 536711d80..8c7f58bc0 100644 --- a/internal/cmd/dns/zone/create/create_test.go +++ b/internal/cmd/dns/zone/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/dns" ) @@ -97,6 +98,7 @@ func fixtureRequest(mods ...func(request *dns.ApiCreateZoneRequest)) dns.ApiCrea func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string primaryFlagValues []string isValid bool @@ -215,56 +217,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.primaryFlagValues { - err := cmd.Flags().Set(primaryFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", primaryFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + primaryFlag: tt.primaryFlagValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/dns/zone/delete/delete_test.go b/internal/cmd/dns/zone/delete/delete_test.go index 77cb37649..a4b967998 100644 --- a/internal/cmd/dns/zone/delete/delete_test.go +++ b/internal/cmd/dns/zone/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/zone/describe/describe_test.go b/internal/cmd/dns/zone/describe/describe_test.go index ed58cbb14..69a7f0587 100644 --- a/internal/cmd/dns/zone/describe/describe_test.go +++ b/internal/cmd/dns/zone/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/dns" ) @@ -137,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index d39cea62e..e86c8ec78 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -68,9 +68,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List DNS zones, including deleted`, "$ stackit dns zone list --include-deleted"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -115,7 +115,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(pageSizeFlag, pageSizeDefault, "Number of items fetched in each API call. Does not affect the number of items in the command output") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/dns/zone/list/list_test.go b/internal/cmd/dns/zone/list/list_test.go index 844c2afa6..bb46d6aea 100644 --- a/internal/cmd/dns/zone/list/list_test.go +++ b/internal/cmd/dns/zone/list/list_test.go @@ -14,6 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/dns" @@ -69,6 +70,7 @@ func fixtureRequest(mods ...func(request *dns.ApiListZonesRequest)) dns.ApiListZ func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -209,46 +211,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index 2b2a5039e..68b674830 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -41,9 +41,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit git flavor list --limit=10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -83,7 +83,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/git/flavor/list/list_test.go b/internal/cmd/git/flavor/list/list_test.go index 1413630b0..d5a6e2f54 100644 --- a/internal/cmd/git/flavor/list/list_test.go +++ b/internal/cmd/git/flavor/list/list_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/git" ) @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *git.ApiListFlavorsRequest)) git.ApiLis func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -123,46 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index d94b99112..296a44598 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -53,9 +53,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit git instance create --name my-new-instance --acl 1.1.1.1/1'`, ), ), - RunE: func(cmd *cobra.Command, _ []string) (err error) { + RunE: func(cmd *cobra.Command, args []string) (err error) { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -111,7 +111,7 @@ func configureFlags(cmd *cobra.Command) { } } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { diff --git a/internal/cmd/git/instance/create/create_test.go b/internal/cmd/git/instance/create/create_test.go index 5b46e1eef..955e5132f 100644 --- a/internal/cmd/git/instance/create/create_test.go +++ b/internal/cmd/git/instance/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/git" ) @@ -79,6 +80,7 @@ func fixtureRequest(mods ...func(request *git.ApiCreateInstanceRequest)) git.Api func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -126,51 +128,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateFlagGroups(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flag groups: %v", err) - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/git/instance/delete/delete_test.go b/internal/cmd/git/instance/delete/delete_test.go index 8c90a4f1d..13609df4e 100644 --- a/internal/cmd/git/instance/delete/delete_test.go +++ b/internal/cmd/git/instance/delete/delete_test.go @@ -55,6 +55,7 @@ func fixtureRequest(mods ...func(request *git.ApiDeleteInstanceRequest)) git.Api func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string args []string isValid bool diff --git a/internal/cmd/git/instance/describe/describe_test.go b/internal/cmd/git/instance/describe/describe_test.go index 17cd8dae8..5e1825565 100644 --- a/internal/cmd/git/instance/describe/describe_test.go +++ b/internal/cmd/git/instance/describe/describe_test.go @@ -54,6 +54,7 @@ func fixtureRequest(mods ...func(request *git.ApiGetInstanceRequest)) git.ApiGet func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool args []string diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index a31337551..1499ecfdf 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -42,9 +42,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit git instance list --limit=10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -84,7 +84,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/git/instance/list/list_test.go b/internal/cmd/git/instance/list/list_test.go index f73297388..8d6ac21a6 100644 --- a/internal/cmd/git/instance/list/list_test.go +++ b/internal/cmd/git/instance/list/list_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/git" ) @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *git.ApiListInstancesRequest)) git.ApiL func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -123,46 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 58be504a8..9ad653d18 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -102,9 +102,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit image create --name my-new-image --disk-format=raw --local-file-path=/my/raw/image --uefi=false`, ), ), - RunE: func(cmd *cobra.Command, _ []string) (err error) { + RunE: func(cmd *cobra.Command, args []string) (err error) { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -292,7 +292,7 @@ func configureFlags(cmd *cobra.Command) { cmd.MarkFlagsRequiredTogether(rescueBusFlag, rescueDeviceFlag) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index 45a926fbf..545586502 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -12,6 +12,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -172,6 +173,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateImageRequest)) iaas.ApiC func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -277,51 +279,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateFlagGroups(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flag groups: %v", err) - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/image/delete/delete_test.go b/internal/cmd/image/delete/delete_test.go index 93b2a656a..2b4f74c1e 100644 --- a/internal/cmd/image/delete/delete_test.go +++ b/internal/cmd/image/delete/delete_test.go @@ -57,6 +57,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiDeleteImageRequest)) iaas.ApiD func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string args []string isValid bool diff --git a/internal/cmd/image/describe/describe_test.go b/internal/cmd/image/describe/describe_test.go index a5e421a9d..076010d69 100644 --- a/internal/cmd/image/describe/describe_test.go +++ b/internal/cmd/image/describe/describe_test.go @@ -57,6 +57,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiGetImageRequest)) iaas.ApiGetI func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool args []string diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index bac3f9c97..a0949187f 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -50,9 +50,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit image list --limit=10`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/image/list/list_test.go b/internal/cmd/image/list/list_test.go index 6437127df..bdfc4c6ed 100644 --- a/internal/cmd/image/list/list_test.go +++ b/internal/cmd/image/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -64,6 +65,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListImagesRequest)) iaas.ApiLi func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -124,44 +126,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/image/update/update_test.go b/internal/cmd/image/update/update_test.go index 5e4d620ca..a40748f3b 100644 --- a/internal/cmd/image/update/update_test.go +++ b/internal/cmd/image/update/update_test.go @@ -168,6 +168,7 @@ func fixtureRequest(mods ...func(*iaas.ApiUpdateImageRequest)) iaas.ApiUpdateIma func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string args []string isValid bool diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index acb8a0f29..b7170f539 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -53,9 +53,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit key-pair create --public-key `ssh-rsa xxx` --labels key=value,key1=value1", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ diff --git a/internal/cmd/key-pair/create/create_test.go b/internal/cmd/key-pair/create/create_test.go index 32a0516b6..a14818f72 100644 --- a/internal/cmd/key-pair/create/create_test.go +++ b/internal/cmd/key-pair/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -78,6 +79,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateKeyPairPayload)) iaas.Creat func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -123,46 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/key-pair/describe/describe_test.go b/internal/cmd/key-pair/describe/describe_test.go index c3dd4ffaa..7af2ff2e8 100644 --- a/internal/cmd/key-pair/describe/describe_test.go +++ b/internal/cmd/key-pair/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -108,54 +109,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argsValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argsValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/key-pair/list/list.go b/internal/cmd/key-pair/list/list.go index 68134bb02..eecec55f0 100644 --- a/internal/cmd/key-pair/list/list.go +++ b/internal/cmd/key-pair/list/list.go @@ -56,9 +56,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit key-pair list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -98,7 +98,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) diff --git a/internal/cmd/key-pair/list/list_test.go b/internal/cmd/key-pair/list/list_test.go index 6679cee0d..bc9da640f 100644 --- a/internal/cmd/key-pair/list/list_test.go +++ b/internal/cmd/key-pair/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListKeyPairsRequest)) iaas.Api func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -116,46 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err = cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatal("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index edc927496..a6b2adc73 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -58,9 +58,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { ``, `$ stackit load-balancer create --payload @./payload.json`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -122,7 +122,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/load-balancer/create/create_test.go b/internal/cmd/load-balancer/create/create_test.go index 66cdb2754..ac22f6c6d 100644 --- a/internal/cmd/load-balancer/create/create_test.go +++ b/internal/cmd/load-balancer/create/create_test.go @@ -6,9 +6,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -210,6 +209,7 @@ func fixtureRequest(mods ...func(request *loadbalancer.ApiCreateLoadBalancerRequ func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -277,56 +277,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(*model, *tt.expectedModel, - cmpopts.EquateComparable(testCtx), - ) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/delete/delete_test.go b/internal/cmd/load-balancer/delete/delete_test.go index 17cca82cb..61e9a941b 100644 --- a/internal/cmd/load-balancer/delete/delete_test.go +++ b/internal/cmd/load-balancer/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/describe/describe_test.go b/internal/cmd/load-balancer/describe/describe_test.go index 2aebb5e61..a7b9a4e36 100644 --- a/internal/cmd/load-balancer/describe/describe_test.go +++ b/internal/cmd/load-balancer/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -129,54 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index a3bffa93e..b7bfac451 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -134,9 +134,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Generate a payload with values of an existing load balancer, and preview it in the terminal`, `$ stackit load-balancer generate-payload --lb-name xxx`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -181,7 +181,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload to the given file. If unset, writes the payload to the standard output") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) loadBalancerName := flags.FlagToStringPointer(p, cmd, loadBalancerNameFlag) diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index 66a0891ec..516d41c92 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -69,6 +70,7 @@ func fixtureRequest(mods ...func(request *loadbalancer.ApiGetLoadBalancerRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -132,54 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index fa31894eb..a56de2041 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 load balancers `, "$ stackit load-balancer list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -94,7 +94,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/load-balancer/list/list_test.go b/internal/cmd/load-balancer/list/list_test.go index f43d4ae62..ee948a6f3 100644 --- a/internal/cmd/load-balancer/list/list_test.go +++ b/internal/cmd/load-balancer/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *loadbalancer.ApiListLoadBalancersReque func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -116,46 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index cc2715e82..ece99c961 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Add observability credentials to a load balancer with username "xxx" and display name "yyy", providing the path to a file with the password as flag`, "$ stackit load-balancer observability-credentials add --username xxx --password @./password.txt --display-name yyy"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -106,7 +106,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/load-balancer/observability-credentials/add/add_test.go b/internal/cmd/load-balancer/observability-credentials/add/add_test.go index bedebaf95..b1e71cf16 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add_test.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -71,6 +72,7 @@ func fixtureRequest(mods ...func(request *loadbalancer.ApiCreateCredentialsReque func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -125,46 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index 718884c9c..5a521bb9f 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -33,9 +33,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Delete observability credentials unused by any Load Balancer`, "$ stackit load-balancer observability-credentials cleanup"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -108,7 +108,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go index 7154b55ee..338dcaa08 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/google/go-cmp/cmp" @@ -116,54 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go index 4730f6a31..c53114075 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/google/go-cmp/cmp" @@ -136,54 +135,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go index 55335f68b..69cfd3bef 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -135,54 +136,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 88f3d3607..537edc93f 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -57,9 +57,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Load Balancer observability credentials`, "$ stackit load-balancer observability-credentials list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -127,7 +127,7 @@ func configureFlags(cmd *cobra.Command) { cmd.MarkFlagsMutuallyExclusive(usedFlag, unusedFlag) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/load-balancer/observability-credentials/list/list_test.go b/internal/cmd/load-balancer/observability-credentials/list/list_test.go index 00d107c2e..475f4bf8f 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list_test.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *loadbalancer.ApiListCredentialsRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -145,54 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/observability-credentials/update/update_test.go b/internal/cmd/load-balancer/observability-credentials/update/update_test.go index 5aa4faa50..563b489d6 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update_test.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update_test.go @@ -5,9 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -180,54 +179,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index 1f84ea3ef..0549fe177 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -32,9 +32,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Get the configured load balancer quota for the project`, "$ stackit load-balancer quota"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/load-balancer/quota/quota_test.go b/internal/cmd/load-balancer/quota/quota_test.go index 16c14e857..634da62e0 100644 --- a/internal/cmd/load-balancer/quota/quota_test.go +++ b/internal/cmd/load-balancer/quota/quota_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *loadbalancer.ApiGetQuotaRequest)) load func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -94,46 +96,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/load-balancer/update/update_test.go b/internal/cmd/load-balancer/update/update_test.go index b57d57336..23504dcfd 100644 --- a/internal/cmd/load-balancer/update/update_test.go +++ b/internal/cmd/load-balancer/update/update_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -300,54 +299,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index 4808614e9..1df3832a2 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -43,9 +43,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for a LogMe instance and show the password in the output`, "$ stackit logme credentials create --instance-id xxx --show-password"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/logme/credentials/create/create_test.go b/internal/cmd/logme/credentials/create/create_test.go index d577d1422..a266eaac7 100644 --- a/internal/cmd/logme/credentials/create/create_test.go +++ b/internal/cmd/logme/credentials/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *logme.ApiCreateCredentialsRequest)) lo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -130,46 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/credentials/delete/delete_test.go b/internal/cmd/logme/credentials/delete/delete_test.go index 96aff20b2..466250e72 100644 --- a/internal/cmd/logme/credentials/delete/delete_test.go +++ b/internal/cmd/logme/credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/credentials/describe/describe_test.go b/internal/cmd/logme/credentials/describe/describe_test.go index ae7f38696..324b92dd6 100644 --- a/internal/cmd/logme/credentials/describe/describe_test.go +++ b/internal/cmd/logme/credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index 7455b78db..2d0065a72 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials' IDs for a LogMe instance`, "$ stackit logme credentials list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/logme/credentials/list/list_test.go b/internal/cmd/logme/credentials/list/list_test.go index 55c522bbf..fc6c5069b 100644 --- a/internal/cmd/logme/credentials/list/list_test.go +++ b/internal/cmd/logme/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *logme.ApiListCredentialsRequest)) logm func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -137,46 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index aa8f8af04..fb5ea3e60 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -71,9 +71,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a LogMe instance with name "my-instance" and specify IP range which is allowed to access it`, "$ stackit logme instance create --name my-instance --plan-id xxx --acl 1.2.3.0/24"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -148,7 +148,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/logme/instance/create/create_test.go b/internal/cmd/logme/instance/create/create_test.go index 9f452d086..23616f5f8 100644 --- a/internal/cmd/logme/instance/create/create_test.go +++ b/internal/cmd/logme/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -108,6 +109,7 @@ func fixtureRequest(mods ...func(request *logme.ApiCreateInstanceRequest)) logme func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string sgwAclValues []string syslogValues []string @@ -262,66 +264,10 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.sgwAclValues { - err := cmd.Flags().Set(sgwAclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", sgwAclFlag, value, err) - } - } - - for _, value := range tt.syslogValues { - err := cmd.Flags().Set(syslogFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", syslogFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + sgwAclFlag: tt.sgwAclValues, + syslogFlag: tt.syslogValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/logme/instance/delete/delete_test.go b/internal/cmd/logme/instance/delete/delete_test.go index dde9637bb..f2d599f6e 100644 --- a/internal/cmd/logme/instance/delete/delete_test.go +++ b/internal/cmd/logme/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/instance/describe/describe_test.go b/internal/cmd/logme/instance/describe/describe_test.go index 00041b4a9..3e7967085 100644 --- a/internal/cmd/logme/instance/describe/describe_test.go +++ b/internal/cmd/logme/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index e1a2a6d6f..201d49d53 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 LogMe instances`, "$ stackit logme instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/logme/instance/list/list_test.go b/internal/cmd/logme/instance/list/list_test.go index 0168ee409..b3a95fc2b 100644 --- a/internal/cmd/logme/instance/list/list_test.go +++ b/internal/cmd/logme/instance/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/logme" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *logme.ApiListInstancesRequest)) logme. func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index 6b58ced4a..72a601109 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 LogMe service plans`, "$ stackit logme plans --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/logme/plans/plans_test.go b/internal/cmd/logme/plans/plans_test.go index 6feb2a2a5..83980c517 100644 --- a/internal/cmd/logme/plans/plans_test.go +++ b/internal/cmd/logme/plans/plans_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/logme" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *logme.ApiListOfferingsRequest)) logme. func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index 3a2fda5da..274b8b740 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -44,9 +44,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for a MariaDB instance and show the password in the output`, "$ stackit mariadb credentials create --instance-id xxx --show-password"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mariadb/credentials/create/create_test.go b/internal/cmd/mariadb/credentials/create/create_test.go index 5516a2415..3ab58f4c3 100644 --- a/internal/cmd/mariadb/credentials/create/create_test.go +++ b/internal/cmd/mariadb/credentials/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *mariadb.ApiCreateCredentialsRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -130,46 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/credentials/delete/delete_test.go b/internal/cmd/mariadb/credentials/delete/delete_test.go index 81da9d7b3..5f8ba6638 100644 --- a/internal/cmd/mariadb/credentials/delete/delete_test.go +++ b/internal/cmd/mariadb/credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/credentials/describe/describe_test.go b/internal/cmd/mariadb/credentials/describe/describe_test.go index 522049aec..7f233f5c4 100644 --- a/internal/cmd/mariadb/credentials/describe/describe_test.go +++ b/internal/cmd/mariadb/credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index 4495106be..b52bf3720 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials' IDs for a MariaDB instance`, "$ stackit mariadb credentials list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mariadb/credentials/list/list_test.go b/internal/cmd/mariadb/credentials/list/list_test.go index c4fbce7b2..1a56a7b6b 100644 --- a/internal/cmd/mariadb/credentials/list/list_test.go +++ b/internal/cmd/mariadb/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *mariadb.ApiListCredentialsRequest)) ma func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -137,46 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index a7866f6bb..e55787006 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -71,9 +71,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a MariaDB instance with name "my-instance" and specify IP range which is allowed to access it`, "$ stackit mariadb instance create --name my-instance --plan-id xxx --acl 1.2.3.0/24"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -148,7 +148,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/mariadb/instance/create/create_test.go b/internal/cmd/mariadb/instance/create/create_test.go index 33dedf860..86cfb1daa 100644 --- a/internal/cmd/mariadb/instance/create/create_test.go +++ b/internal/cmd/mariadb/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -108,6 +109,7 @@ func fixtureRequest(mods ...func(request *mariadb.ApiCreateInstanceRequest)) mar func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string sgwAclValues []string syslogValues []string @@ -262,66 +264,10 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.sgwAclValues { - err := cmd.Flags().Set(sgwAclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", sgwAclFlag, value, err) - } - } - - for _, value := range tt.syslogValues { - err := cmd.Flags().Set(syslogFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", syslogFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + sgwAclFlag: tt.sgwAclValues, + syslogFlag: tt.syslogValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/instance/delete/delete_test.go b/internal/cmd/mariadb/instance/delete/delete_test.go index 737f2affc..c3930a9c8 100644 --- a/internal/cmd/mariadb/instance/delete/delete_test.go +++ b/internal/cmd/mariadb/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/instance/describe/describe_test.go b/internal/cmd/mariadb/instance/describe/describe_test.go index 3d5cc03ec..4aa17ccc9 100644 --- a/internal/cmd/mariadb/instance/describe/describe_test.go +++ b/internal/cmd/mariadb/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 43df97970..56e1b0e43 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 MariaDB instances`, "$ stackit mariadb instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mariadb/instance/list/list_test.go b/internal/cmd/mariadb/instance/list/list_test.go index 7f199d16c..14587ff87 100644 --- a/internal/cmd/mariadb/instance/list/list_test.go +++ b/internal/cmd/mariadb/instance/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *mariadb.ApiListInstancesRequest)) mari func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index d5ebcde6d..e66d67052 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 MariaDB service plans`, "$ stackit mariadb plans --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mariadb/plans/plans_test.go b/internal/cmd/mariadb/plans/plans_test.go index f80f6c9cd..f63a84125 100644 --- a/internal/cmd/mariadb/plans/plans_test.go +++ b/internal/cmd/mariadb/plans/plans_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *mariadb.ApiListOfferingsRequest)) mari func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/backup/describe/describe_test.go b/internal/cmd/mongodbflex/backup/describe/describe_test.go index f69454e9b..f83ef4d0a 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe_test.go +++ b/internal/cmd/mongodbflex/backup/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -163,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index ab22427bf..5287336ed 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit mongodbflex backup list --instance-id xxx --limit 10"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -102,7 +102,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/backup/list/list_test.go b/internal/cmd/mongodbflex/backup/list/list_test.go index 8b2e9b177..a6d13d8e4 100644 --- a/internal/cmd/mongodbflex/backup/list/list_test.go +++ b/internal/cmd/mongodbflex/backup/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +67,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiListBackupsRequest)) mo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -141,46 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 6b8ca07ec..c078ed2cd 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit mongodbflex backup restore-jobs --instance-id xxx --limit 10"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go index fd00003a4..7b6419bbe 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +67,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiListRestoreJobsRequest) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -141,46 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index 1d547a486..d853f953b 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -56,10 +56,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Restore a MongoDB Flex instance with ID "yyy", using backup from instance with ID "zzz" with backup ID "xxx"`, `$ stackit mongodbflex backup restore --instance-id zzz --backup-instance-id yyy --backup-id xxx`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -148,7 +148,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/backup/restore/restore_test.go b/internal/cmd/mongodbflex/backup/restore/restore_test.go index 27b1d3181..1fed3553f 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore_test.go +++ b/internal/cmd/mongodbflex/backup/restore/restore_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -88,6 +87,7 @@ func fixtureCloneRequest(mods ...func(request mongodbflex.ApiCloneInstanceReques func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -171,54 +171,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flag groups: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 954e1f8d9..3a34a9e58 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -41,9 +41,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Get details of the backup schedule of a MongoDB Flex instance with ID "xxx" in JSON format`, "$ stackit mongodbflex backup schedule --instance-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -74,7 +74,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go index 1f67e3e64..ab81c09e8 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go @@ -7,11 +7,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) @@ -64,6 +64,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiGetInstanceRequest)) mo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -125,48 +126,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index af23cdef6..111ba4281 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -67,10 +67,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit mongodbflex backup update-schedule --instance-id xxx --store-for-days 5"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -131,7 +131,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go index 77b6c5c2c..649f46738 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -106,6 +107,7 @@ func fixtureInstance(mods ...func(instance *mongodbflex.Instance)) *mongodbflex. func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -175,45 +177,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 440e19fa8..39fe64514 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -72,10 +72,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a MongoDB Flex instance with name "my-instance", allow access to a specific range of IP addresses, specify flavor by CPU and RAM and set storage size to 20 GB. Other parameters are set to default values`, `$ stackit mongodbflex instance create --name my-instance --cpu 1 --ram 4 --acl 1.2.3.0/24 --storage-size 20`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -156,7 +156,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/instance/create/create_test.go b/internal/cmd/mongodbflex/instance/create/create_test.go index 8d2bd7aba..794b5b9fd 100644 --- a/internal/cmd/mongodbflex/instance/create/create_test.go +++ b/internal/cmd/mongodbflex/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -128,6 +129,7 @@ func fixturePayload(mods ...func(payload *mongodbflex.CreateInstancePayload)) mo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -254,56 +256,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.aclValues { - err := cmd.Flags().Set(aclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", aclFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + aclFlag: tt.aclValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/instance/delete/delete_test.go b/internal/cmd/mongodbflex/instance/delete/delete_test.go index 8add607ed..52435d690 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete_test.go +++ b/internal/cmd/mongodbflex/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -142,54 +141,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/instance/describe/describe_test.go b/internal/cmd/mongodbflex/instance/describe/describe_test.go index aa0235465..b63b62933 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe_test.go +++ b/internal/cmd/mongodbflex/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -142,54 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index 798bd544c..1a7d398c7 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 MongoDB Flex instances`, "$ stackit mongodbflex instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -90,7 +90,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/instance/list/list_test.go b/internal/cmd/mongodbflex/instance/list/list_test.go index 1f14f2d89..7ec79019f 100644 --- a/internal/cmd/mongodbflex/instance/list/list_test.go +++ b/internal/cmd/mongodbflex/instance/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) @@ -64,6 +64,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiListInstancesRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -118,48 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index f17de9f9c..9d65ea4ef 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -62,9 +62,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List MongoDB Flex storage options for a given flavor. The flavor ID can be retrieved by running "$ stackit mongodbflex options --flavors"`, "$ stackit mongodbflex options --storages --flavor-id "), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -95,7 +95,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(flavorIdFlag, "", `The flavor ID to show storages for. Only relevant when "--storages" is passed`) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) flavors := flags.FlagToBoolValue(p, cmd, flavorsFlag) versions := flags.FlagToBoolValue(p, cmd, versionsFlag) diff --git a/internal/cmd/mongodbflex/options/options_test.go b/internal/cmd/mongodbflex/options/options_test.go index 35ab363dc..57f549b0b 100644 --- a/internal/cmd/mongodbflex/options/options_test.go +++ b/internal/cmd/mongodbflex/options/options_test.go @@ -8,9 +8,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) @@ -105,6 +105,7 @@ func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -167,46 +168,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index 46d11c50b..f589c3996 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -57,9 +57,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit mongodbflex user create --instance-id xxx --role read --database default"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -112,7 +112,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/user/create/create_test.go b/internal/cmd/mongodbflex/user/create/create_test.go index db666260b..7e210559e 100644 --- a/internal/cmd/mongodbflex/user/create/create_test.go +++ b/internal/cmd/mongodbflex/user/create/create_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) @@ -77,6 +77,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiCreateUserRequest)) mon func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -166,48 +167,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/user/delete/delete_test.go b/internal/cmd/mongodbflex/user/delete/delete_test.go index 1a20490f1..e324f0010 100644 --- a/internal/cmd/mongodbflex/user/delete/delete_test.go +++ b/internal/cmd/mongodbflex/user/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -169,54 +168,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/user/describe/describe_test.go b/internal/cmd/mongodbflex/user/describe/describe_test.go index 5315f8b8a..604758d1d 100644 --- a/internal/cmd/mongodbflex/user/describe/describe_test.go +++ b/internal/cmd/mongodbflex/user/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -169,54 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index b6fb8ad7a..94fcfcdd1 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit mongodbflex user list --instance-id xxx --limit 10"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/mongodbflex/user/list/list_test.go b/internal/cmd/mongodbflex/user/list/list_test.go index 3345bae43..d480ed651 100644 --- a/internal/cmd/mongodbflex/user/list/list_test.go +++ b/internal/cmd/mongodbflex/user/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) @@ -67,6 +67,7 @@ func fixtureRequest(mods ...func(request *mongodbflex.ApiListUsersRequest)) mong func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -135,48 +136,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go index 349baec27..0836c789e 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -169,54 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/mongodbflex/user/update/update_test.go b/internal/cmd/mongodbflex/user/update/update_test.go index 3f12bda1a..0d110a06c 100644 --- a/internal/cmd/mongodbflex/user/update/update_test.go +++ b/internal/cmd/mongodbflex/user/update/update_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -201,54 +200,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 4aefc6d5b..fa97908d9 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -68,9 +68,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --labels key=value,key1=value1`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -132,7 +132,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ diff --git a/internal/cmd/network-area/create/create_test.go b/internal/cmd/network-area/create/create_test.go index 7b9d235cd..a731541fd 100644 --- a/internal/cmd/network-area/create/create_test.go +++ b/internal/cmd/network-area/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -105,6 +106,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaPayload)) iaas.C func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -193,46 +195,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/delete/delete_test.go b/internal/cmd/network-area/delete/delete_test.go index 4b8077590..1ee322dc3 100644 --- a/internal/cmd/network-area/delete/delete_test.go +++ b/internal/cmd/network-area/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -136,54 +135,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/describe/describe_test.go b/internal/cmd/network-area/describe/describe_test.go index 7160f6a01..70e63e145 100644 --- a/internal/cmd/network-area/describe/describe_test.go +++ b/internal/cmd/network-area/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -149,54 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index 6dea71c0e..6184148aa 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -58,9 +58,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit network-area list --organization-id xxx --label-selector yyy", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -118,7 +118,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) if limit != nil && *limit < 1 { diff --git a/internal/cmd/network-area/list/list_test.go b/internal/cmd/network-area/list/list_test.go index d41ae9ad8..41c51e380 100644 --- a/internal/cmd/network-area/list/list_test.go +++ b/internal/cmd/network-area/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -61,6 +62,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreasRequest)) iaas func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -130,46 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index 9f073bc22..ec7f1dbcf 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -43,9 +43,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit network-area network-range create --network-area-id xxx --organization-id yyy --network-range "1.1.1.0/24"`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ diff --git a/internal/cmd/network-area/network-range/create/create_test.go b/internal/cmd/network-area/network-range/create/create_test.go index 478854cc2..6edc6b23b 100644 --- a/internal/cmd/network-area/network-range/create/create_test.go +++ b/internal/cmd/network-area/network-range/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -76,6 +77,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaRangePayload)) i func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -145,46 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index 51f3aeeea..967ffbb9c 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -53,9 +53,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit network-area network-range list --network-area-id xxx --organization-id yyy --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -106,7 +106,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) if limit != nil && *limit < 1 { diff --git a/internal/cmd/network-area/network-range/list/list_test.go b/internal/cmd/network-area/network-range/list/list_test.go index 4e7b52627..f8525e39b 100644 --- a/internal/cmd/network-area/network-range/list/list_test.go +++ b/internal/cmd/network-area/network-range/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -60,6 +61,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreaRangesRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -140,46 +142,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 0dbd0e248..f8548316c 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -54,9 +54,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit network-area route create --labels key=value,foo=bar --organization-id yyy --network-area-id xxx --prefix 1.1.1.0/24 --next-hop 1.1.1.1", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -116,7 +116,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ diff --git a/internal/cmd/network-area/route/create/create_test.go b/internal/cmd/network-area/route/create/create_test.go index a1ab93772..1bc7cb161 100644 --- a/internal/cmd/network-area/route/create/create_test.go +++ b/internal/cmd/network-area/route/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -79,6 +80,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaRoutePayload)) i func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -180,46 +182,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index cdc6a67ae..2af24763a 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -52,9 +52,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit network-area route list --network-area-id xxx --organization-id yyy --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -105,7 +105,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) if limit != nil && *limit < 1 { diff --git a/internal/cmd/network-area/route/list/list_test.go b/internal/cmd/network-area/route/list/list_test.go index 2d66bad9f..8681aa87d 100644 --- a/internal/cmd/network-area/route/list/list_test.go +++ b/internal/cmd/network-area/route/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -60,6 +61,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreaRoutesRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -140,46 +142,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index c22735b0e..1fc368ffa 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -64,9 +64,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit network-interface create --network-id xxx --allowed-addresses "1.1.1.1,8.8.8.8,9.9.9.9" --labels key=value,key2=value2 --name NAME --security-groups "UUID1,UUID2" --nic-security`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -121,7 +121,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/network-interface/create/create_test.go b/internal/cmd/network-interface/create/create_test.go index f05ed584e..82e5b628a 100644 --- a/internal/cmd/network-interface/create/create_test.go +++ b/internal/cmd/network-interface/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -105,6 +106,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateNicPayload)) iaas.CreateNic func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -190,46 +192,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index 2effcf4a8..cd683883a 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -56,9 +56,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit network-interface list --network-id xxx --limit 10`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -110,7 +110,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/network-interface/list/list_test.go b/internal/cmd/network-interface/list/list_test.go index 3e976c5db..68df78a25 100644 --- a/internal/cmd/network-interface/list/list_test.go +++ b/internal/cmd/network-interface/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +67,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListNicsRequest)) iaas.ApiList func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -135,46 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 2d49bc965..acb1bc7e1 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -86,9 +86,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit network create --name network-1 --ipv6-dns-name-servers "2001:4860:4860::8888,2001:4860:4860::8844" --ipv6-prefix "2001:4860:4860::8888" --ipv6-gateway "2001:4860:4860::8888"`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -160,7 +160,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/network/create/create_test.go b/internal/cmd/network/create/create_test.go index 63c6a3635..6fd5c6a9a 100644 --- a/internal/cmd/network/create/create_test.go +++ b/internal/cmd/network/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -123,6 +124,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkPayload)) iaas.Creat func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -258,46 +260,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network/delete/delete_test.go b/internal/cmd/network/delete/delete_test.go index 630a0f3fb..20c5eed47 100644 --- a/internal/cmd/network/delete/delete_test.go +++ b/internal/cmd/network/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network/describe/describe_test.go b/internal/cmd/network/describe/describe_test.go index 9c3b62d35..098baa905 100644 --- a/internal/cmd/network/describe/describe_test.go +++ b/internal/cmd/network/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index 97d570f75..a0c871466 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit network list --label-selector xxx", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -105,7 +105,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/network/list/list_test.go b/internal/cmd/network/list/list_test.go index c0f1ac4c3..f408eeb78 100644 --- a/internal/cmd/network/list/list_test.go +++ b/internal/cmd/network/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListNetworksRequest)) iaas.Api func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -132,46 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index 344c228d5..b6e926cd2 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -136,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/bucket/delete/delete_test.go b/internal/cmd/object-storage/bucket/delete/delete_test.go index 6e06d4adc..2dfe69ec6 100644 --- a/internal/cmd/object-storage/bucket/delete/delete_test.go +++ b/internal/cmd/object-storage/bucket/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -136,54 +135,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/bucket/describe/describe_test.go b/internal/cmd/object-storage/bucket/describe/describe_test.go index 9e376132d..df76123d2 100644 --- a/internal/cmd/object-storage/bucket/describe/describe_test.go +++ b/internal/cmd/object-storage/bucket/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -136,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index d0ed623cf..fd0ec0552 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Object Storage buckets`, "$ stackit object-storage bucket list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/bucket/list/list_test.go b/internal/cmd/object-storage/bucket/list/list_test.go index eb50f0ca7..3d70ff50b 100644 --- a/internal/cmd/object-storage/bucket/list/list_test.go +++ b/internal/cmd/object-storage/bucket/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) @@ -64,6 +64,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiListBucketsRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -118,48 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index c92f24956..b4f8a850c 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -38,9 +38,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials group to hold Object Storage access credentials`, "$ stackit object-storage credentials-group create --name example"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -80,7 +80,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/credentials-group/create/create_test.go b/internal/cmd/object-storage/credentials-group/create/create_test.go index f23487603..23908c876 100644 --- a/internal/cmd/object-storage/credentials-group/create/create_test.go +++ b/internal/cmd/object-storage/credentials-group/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -75,6 +76,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiCreateCredentialsGrou func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -122,46 +124,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/credentials-group/delete/delete_test.go b/internal/cmd/object-storage/credentials-group/delete/delete_test.go index a5097a0b7..901fc4304 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -142,54 +141,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index adc5531d1..800b0f742 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -44,9 +44,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials groups`, "$ stackit object-storage credentials-group list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -84,7 +84,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/credentials-group/list/list_test.go b/internal/cmd/object-storage/credentials-group/list/list_test.go index b0570483b..587e6842a 100644 --- a/internal/cmd/object-storage/credentials-group/list/list_test.go +++ b/internal/cmd/object-storage/credentials-group/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiListCredentialsGroups func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -117,46 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index 41fde917c..e7f9fdcfc 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for a credentials group with ID "xxx", including a specific expiration date`, "$ stackit object-storage credentials create --credentials-group-id xxx --expire-date 2024-03-06T00:00:00.000Z"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -95,7 +95,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/credentials/create/create_test.go b/internal/cmd/object-storage/credentials/create/create_test.go index c2efbf566..f3c0bdd60 100644 --- a/internal/cmd/object-storage/credentials/create/create_test.go +++ b/internal/cmd/object-storage/credentials/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -89,6 +90,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiCreateAccessKeyReques func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -181,46 +183,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/credentials/delete/delete_test.go b/internal/cmd/object-storage/credentials/delete/delete_test.go index 1ba508df1..d5ff9e4e5 100644 --- a/internal/cmd/object-storage/credentials/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -161,54 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index 3fb8b920d..0ebc5efea 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials for a credentials group with ID "xxx"`, "$ stackit object-storage credentials list --credentials-group-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/credentials/list/list_test.go b/internal/cmd/object-storage/credentials/list/list_test.go index 6f6fb41a3..119f7c7c0 100644 --- a/internal/cmd/object-storage/credentials/list/list_test.go +++ b/internal/cmd/object-storage/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -67,6 +68,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiListAccessKeysRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -142,46 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index f5cec2175..12a0f16de 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -32,9 +32,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Disable Object Storage functionality for your project.`, "$ stackit object-storage disable"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -77,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/disable/disable_test.go b/internal/cmd/object-storage/disable/disable_test.go index cb65e8961..5b5a2ea7f 100644 --- a/internal/cmd/object-storage/disable/disable_test.go +++ b/internal/cmd/object-storage/disable/disable_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) @@ -60,6 +59,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiDisableServiceRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -100,46 +100,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index fe9fa549e..e6a1ade29 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -32,9 +32,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Enable Object Storage functionality for your project`, "$ stackit object-storage enable"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -77,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/object-storage/enable/enable_test.go b/internal/cmd/object-storage/enable/enable_test.go index 562bb6907..59e88e9e0 100644 --- a/internal/cmd/object-storage/enable/enable_test.go +++ b/internal/cmd/object-storage/enable/enable_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) @@ -60,6 +59,7 @@ func fixtureRequest(mods ...func(request *objectstorage.ApiEnableServiceRequest) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -100,46 +100,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index 99b185ba2..f9cd2feb4 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -41,9 +41,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for Observability instance with ID "xxx"`, "$ stackit observability credentials create --instance-id xxx"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/observability/credentials/create/create_test.go b/internal/cmd/observability/credentials/create/create_test.go index 16fcc439d..43ba6f271 100644 --- a/internal/cmd/observability/credentials/create/create_test.go +++ b/internal/cmd/observability/credentials/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/google/go-cmp/cmp" @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *observability.ApiCreateCredentialsRequ func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -120,45 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/credentials/list/list.go b/internal/cmd/observability/credentials/list/list.go index f0423793e..5e7e7a3ad 100644 --- a/internal/cmd/observability/credentials/list/list.go +++ b/internal/cmd/observability/credentials/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List the usernames of up to 10 credentials for an Observability instance`, "$ stackit observability credentials list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/observability/credentials/list/list_test.go b/internal/cmd/observability/credentials/list/list_test.go index 64d92b12f..ceed7952d 100644 --- a/internal/cmd/observability/credentials/list/list_test.go +++ b/internal/cmd/observability/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *observability.ApiListCredentialsReques func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -137,45 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go index 9dc5019d2..58fdfd098 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go @@ -5,9 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -186,54 +185,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go index 6d1fbea0a..1f3d0fb89 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go @@ -5,9 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -186,54 +185,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go index e536ab098..224c73cca 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go @@ -5,9 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -186,54 +185,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go index 033227257..f13a2db25 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable_test.go @@ -5,10 +5,9 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -186,54 +185,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 7bd73e90a..84e8b1b6b 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -51,9 +51,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create an Observability instance with name "my-instance" and specify plan by ID`, "$ stackit observability instance create --name my-instance --plan-id xxx"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -120,7 +120,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/observability/instance/create/create_test.go b/internal/cmd/observability/instance/create/create_test.go index 6cdeda809..382cbeb0a 100644 --- a/internal/cmd/observability/instance/create/create_test.go +++ b/internal/cmd/observability/instance/create/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -99,6 +100,7 @@ func fixturePlansResponse(mods ...func(response *observability.PlansResponse)) * func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -175,46 +177,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/instance/delete/delete_test.go b/internal/cmd/observability/instance/delete/delete_test.go index d8432900f..5d6bce774 100644 --- a/internal/cmd/observability/instance/delete/delete_test.go +++ b/internal/cmd/observability/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/instance/describe/describe_test.go b/internal/cmd/observability/instance/describe/describe_test.go index 62f60d451..1aa4cc756 100644 --- a/internal/cmd/observability/instance/describe/describe_test.go +++ b/internal/cmd/observability/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index a52ebeb34..ff124b8fb 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Observability instances`, "$ stackit observability instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/observability/instance/list/list_test.go b/internal/cmd/observability/instance/list/list_test.go index 33157c100..f4c1b20b7 100644 --- a/internal/cmd/observability/instance/list/list_test.go +++ b/internal/cmd/observability/instance/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/observability" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *observability.ApiListInstancesRequest) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,47 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/instance/update/update_test.go b/internal/cmd/observability/instance/update/update_test.go index fd798093c..6a576ce5d 100644 --- a/internal/cmd/observability/instance/update/update_test.go +++ b/internal/cmd/observability/instance/update/update_test.go @@ -5,9 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -240,54 +239,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index 62fc0ac86..322bebb0d 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Observability service plans`, "$ stackit observability plans --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/observability/plans/plans_test.go b/internal/cmd/observability/plans/plans_test.go index 2228a0402..36026aecf 100644 --- a/internal/cmd/observability/plans/plans_test.go +++ b/internal/cmd/observability/plans/plans_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/observability" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *observability.ApiListPlansRequest)) ob func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index d11d4b575..43ff12a8f 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -60,9 +60,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { ``, `$ stackit observability scrape-config create --payload @./payload.json --instance-id xxx`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -136,7 +136,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/observability/scrape-config/create/create_test.go b/internal/cmd/observability/scrape-config/create/create_test.go index 533bf457b..9d4ab9ba9 100644 --- a/internal/cmd/observability/scrape-config/create/create_test.go +++ b/internal/cmd/observability/scrape-config/create/create_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -146,6 +148,7 @@ func fixtureRequest(mods ...func(request *observability.ApiCreateScrapeConfigReq func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -230,55 +233,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(*model, *tt.expectedModel, - cmpopts.EquateComparable(testCtx), - ) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go index 487fa32b3..5476fbd94 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go @@ -60,9 +60,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Generate an Update payload with the values of an existing configuration named "my-config" for Observability instance xxx, and preview it in the terminal`, `$ stackit observability scrape-config generate-payload --job-name my-config --instance-id xxx`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -102,7 +102,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload to the given file. If unset, writes the payload to the standard output") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) jobName := flags.FlagToStringPointer(p, cmd, jobNameFlag) diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go index e9a3a076b..07be71444 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -69,6 +71,7 @@ func fixtureRequest(mods ...func(request *observability.ApiGetScrapeConfigReques func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -171,53 +174,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/observability/scrape-config/list/list.go b/internal/cmd/observability/scrape-config/list/list.go index 998613343..1002a87d8 100644 --- a/internal/cmd/observability/scrape-config/list/list.go +++ b/internal/cmd/observability/scrape-config/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 scrape configurations of Observability instance "xxx"`, "$ stackit observability scrape-config list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/observability/scrape-config/list/list_test.go b/internal/cmd/observability/scrape-config/list/list_test.go index 35e53001b..371944178 100644 --- a/internal/cmd/observability/scrape-config/list/list_test.go +++ b/internal/cmd/observability/scrape-config/list/list_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -12,7 +14,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/observability" ) @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *observability.ApiListScrapeConfigsRequ func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -138,47 +140,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index 9600ea189..c74347c51 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -43,9 +43,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for an OpenSearch instance and show the password in the output`, "$ stackit opensearch credentials create --instance-id xxx --show-password"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/opensearch/credentials/create/create_test.go b/internal/cmd/opensearch/credentials/create/create_test.go index 6928feefc..8943eede7 100644 --- a/internal/cmd/opensearch/credentials/create/create_test.go +++ b/internal/cmd/opensearch/credentials/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *opensearch.ApiCreateCredentialsRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -130,46 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/credentials/delete/delete_test.go b/internal/cmd/opensearch/credentials/delete/delete_test.go index 350175fd2..53b987e9f 100644 --- a/internal/cmd/opensearch/credentials/delete/delete_test.go +++ b/internal/cmd/opensearch/credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/credentials/describe/describe_test.go b/internal/cmd/opensearch/credentials/describe/describe_test.go index 50ce776b5..c1c2f3b2d 100644 --- a/internal/cmd/opensearch/credentials/describe/describe_test.go +++ b/internal/cmd/opensearch/credentials/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index 40efab492..2e5451ec2 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials' IDs for an OpenSearch instance`, "$ stackit opensearch credentials list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/opensearch/credentials/list/list_test.go b/internal/cmd/opensearch/credentials/list/list_test.go index bfe0ea554..8375506e1 100644 --- a/internal/cmd/opensearch/credentials/list/list_test.go +++ b/internal/cmd/opensearch/credentials/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *opensearch.ApiListCredentialsRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -137,46 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index e9dd330bd..826c6990f 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -73,9 +73,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create an OpenSearch instance with name "my-instance" and specify IP range which is allowed to access it`, "$ stackit opensearch instance create --name my-instance --plan-id xxx --acl 1.2.3.0/24"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -151,7 +151,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/opensearch/instance/create/create_test.go b/internal/cmd/opensearch/instance/create/create_test.go index e6028b4d9..fe8afe7d3 100644 --- a/internal/cmd/opensearch/instance/create/create_test.go +++ b/internal/cmd/opensearch/instance/create/create_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -111,6 +113,7 @@ func fixtureRequest(mods ...func(request *opensearch.ApiCreateInstanceRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string sgwAclValues []string pluginValues []string @@ -277,76 +280,11 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.sgwAclValues { - err := cmd.Flags().Set(sgwAclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", sgwAclFlag, value, err) - } - } - - for _, value := range tt.pluginValues { - err := cmd.Flags().Set(pluginFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", pluginFlag, value, err) - } - } - - for _, value := range tt.syslogValues { - err := cmd.Flags().Set(syslogFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", syslogFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + sgwAclFlag: tt.sgwAclValues, + pluginFlag: tt.pluginValues, + syslogFlag: tt.syslogValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/instance/delete/delete_test.go b/internal/cmd/opensearch/instance/delete/delete_test.go index 217ff1b1d..c6ab9693d 100644 --- a/internal/cmd/opensearch/instance/delete/delete_test.go +++ b/internal/cmd/opensearch/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/instance/describe/describe_test.go b/internal/cmd/opensearch/instance/describe/describe_test.go index 6e17a8e85..8ae93fa8f 100644 --- a/internal/cmd/opensearch/instance/describe/describe_test.go +++ b/internal/cmd/opensearch/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index d53244f04..03e18c79d 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 OpenSearch instances`, "$ stackit opensearch instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/opensearch/instance/list/list_test.go b/internal/cmd/opensearch/instance/list/list_test.go index 766115689..86ac78970 100644 --- a/internal/cmd/opensearch/instance/list/list_test.go +++ b/internal/cmd/opensearch/instance/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *opensearch.ApiListInstancesRequest)) o func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index e8d8c4983..45a026ab9 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 OpenSearch service plans`, "$ stackit opensearch plans --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/opensearch/plans/plans_test.go b/internal/cmd/opensearch/plans/plans_test.go index 0b4f95cec..4cafef6ba 100644 --- a/internal/cmd/opensearch/plans/plans_test.go +++ b/internal/cmd/opensearch/plans/plans_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *opensearch.ApiListOfferingsRequest)) o func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/organization/member/add/add_test.go b/internal/cmd/organization/member/add/add_test.go index a98f06ecc..dfe3300f0 100644 --- a/internal/cmd/organization/member/add/add_test.go +++ b/internal/cmd/organization/member/add/add_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -125,54 +124,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index 3102c987c..d4989bc76 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -54,9 +54,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 members of an organization`, "$ stackit organization member list --organization-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) diff --git a/internal/cmd/organization/member/list/list_test.go b/internal/cmd/organization/member/list/list_test.go index ff90898b2..37f13746b 100644 --- a/internal/cmd/organization/member/list/list_test.go +++ b/internal/cmd/organization/member/list/list_test.go @@ -7,11 +7,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) @@ -56,6 +56,7 @@ func fixtureRequest(mods ...func(request *authorization.ApiListMembersRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -125,48 +126,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/organization/member/remove/remove_test.go b/internal/cmd/organization/member/remove/remove_test.go index 1b2a3e702..81f1a368c 100644 --- a/internal/cmd/organization/member/remove/remove_test.go +++ b/internal/cmd/organization/member/remove/remove_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index 9f1523543..9603d0212 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 roles and permissions of an organization`, "$ stackit organization role list --organization-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -94,7 +94,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) diff --git a/internal/cmd/organization/role/list/list_test.go b/internal/cmd/organization/role/list/list_test.go index 5633b3f60..7e2dcb518 100644 --- a/internal/cmd/organization/role/list/list_test.go +++ b/internal/cmd/organization/role/list/list_test.go @@ -7,11 +7,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) @@ -55,6 +55,7 @@ func fixtureRequest(mods ...func(request *authorization.ApiListRolesRequest)) au func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -95,48 +96,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/backup/list/list.go b/internal/cmd/postgresflex/backup/list/list.go index f365261a9..cfd5718d5 100644 --- a/internal/cmd/postgresflex/backup/list/list.go +++ b/internal/cmd/postgresflex/backup/list/list.go @@ -54,9 +54,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit postgresflex backup list --instance-id xxx --limit 10"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -106,7 +106,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/postgresflex/backup/list/list_test.go b/internal/cmd/postgresflex/backup/list/list_test.go index 9dee772fe..4ac63c37c 100644 --- a/internal/cmd/postgresflex/backup/list/list_test.go +++ b/internal/cmd/postgresflex/backup/list/list_test.go @@ -5,6 +5,8 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -63,6 +65,7 @@ func fixtureRequest(mods ...func(request *postgresflex.ApiListBackupsRequest)) p func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -138,45 +141,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go index 376b04bae..9d8bf59fc 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go @@ -41,10 +41,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit postgresflex backup update-schedule --instance-id xxx --schedule '6 6 * * *'"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule_test.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule_test.go index 446f96226..18ed95ae6 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule_test.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -73,6 +74,7 @@ func fixtureRequest(mods ...func(request *postgresflex.ApiUpdateBackupScheduleRe func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -142,45 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := NewCmd(nil) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(nil, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/instance/clone/clone_test.go b/internal/cmd/postgresflex/instance/clone/clone_test.go index 04dbd1954..5f2a60189 100644 --- a/internal/cmd/postgresflex/instance/clone/clone_test.go +++ b/internal/cmd/postgresflex/instance/clone/clone_test.go @@ -12,6 +12,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -302,54 +303,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index 3af623ca5..1e3172a3b 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -73,10 +73,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a PostgreSQL Flex instance with name "my-instance", allow access to a specific range of IP addresses, specify flavor by CPU and RAM and set storage size to 20 GB. Other parameters are set to default values`, `$ stackit postgresflex instance create --name my-instance --cpu 2 --ram 4 --acl 1.2.3.0/24 --storage-size 20`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -157,7 +157,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/postgresflex/instance/create/create_test.go b/internal/cmd/postgresflex/instance/create/create_test.go index 32d63d5d8..09b6b2311 100644 --- a/internal/cmd/postgresflex/instance/create/create_test.go +++ b/internal/cmd/postgresflex/instance/create/create_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -124,6 +125,7 @@ func fixturePayload(mods ...func(payload *postgresflex.CreateInstancePayload)) p func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -250,56 +252,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.aclValues { - err := cmd.Flags().Set(aclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", aclFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + aclFlag: tt.aclValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/instance/delete/delete_test.go b/internal/cmd/postgresflex/instance/delete/delete_test.go index 13f33bfbd..fdbe26f4c 100644 --- a/internal/cmd/postgresflex/instance/delete/delete_test.go +++ b/internal/cmd/postgresflex/instance/delete/delete_test.go @@ -5,9 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -171,54 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/instance/describe/describe_test.go b/internal/cmd/postgresflex/instance/describe/describe_test.go index 69e100822..9331b81d4 100644 --- a/internal/cmd/postgresflex/instance/describe/describe_test.go +++ b/internal/cmd/postgresflex/instance/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index f7115f502..148a31d46 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 PostgreSQL Flex instances`, "$ stackit postgresflex instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -94,7 +94,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/postgresflex/instance/list/list_test.go b/internal/cmd/postgresflex/instance/list/list_test.go index 3cfc85652..c8c2d8a7a 100644 --- a/internal/cmd/postgresflex/instance/list/list_test.go +++ b/internal/cmd/postgresflex/instance/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *postgresflex.ApiListInstancesRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index 0e0581c3f..d5afbbbf5 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -63,9 +63,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List PostgreSQL Flex storage options for a given flavor. The flavor ID can be retrieved by running "$ stackit postgresflex options --flavors"`, "$ stackit postgresflex options --storages --flavor-id "), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(flavorIdFlag, "", `The flavor ID to show storages for. Only relevant when "--storages" is passed`) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/postgresflex/options/options_test.go b/internal/cmd/postgresflex/options/options_test.go index 54df1ccf9..4f7f5c67f 100644 --- a/internal/cmd/postgresflex/options/options_test.go +++ b/internal/cmd/postgresflex/options/options_test.go @@ -5,11 +5,11 @@ import ( "fmt" "testing" - "github.com/google/go-cmp/cmp" "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -113,6 +113,7 @@ func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -175,46 +176,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index f7cc55a35..73682a34a 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit postgresflex user create --instance-id xxx --username johndoe --role createdb"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -108,7 +108,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/postgresflex/user/create/create_test.go b/internal/cmd/postgresflex/user/create/create_test.go index e75d785e9..bbd08e214 100644 --- a/internal/cmd/postgresflex/user/create/create_test.go +++ b/internal/cmd/postgresflex/user/create/create_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -70,6 +70,7 @@ func fixtureRequest(mods ...func(request *postgresflex.ApiCreateUserRequest)) po func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -149,48 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/user/delete/delete_test.go b/internal/cmd/postgresflex/user/delete/delete_test.go index 867635736..a3ff66105 100644 --- a/internal/cmd/postgresflex/user/delete/delete_test.go +++ b/internal/cmd/postgresflex/user/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -160,54 +159,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/user/describe/describe_test.go b/internal/cmd/postgresflex/user/describe/describe_test.go index 8b91301b7..ad6a2377f 100644 --- a/internal/cmd/postgresflex/user/describe/describe_test.go +++ b/internal/cmd/postgresflex/user/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -159,54 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index d62bfd1ed..420619f46 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit postgresflex user list --instance-id xxx --limit 10"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -99,7 +99,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/postgresflex/user/list/list_test.go b/internal/cmd/postgresflex/user/list/list_test.go index 20adc9e13..8985f945f 100644 --- a/internal/cmd/postgresflex/user/list/list_test.go +++ b/internal/cmd/postgresflex/user/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *postgresflex.ApiListUsersRequest)) pos func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -131,48 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go index b12c31d3a..51572b406 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) @@ -159,54 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/postgresflex/user/update/update_test.go b/internal/cmd/postgresflex/user/update/update_test.go index 787dc992d..c20ded9b7 100644 --- a/internal/cmd/postgresflex/user/update/update_test.go +++ b/internal/cmd/postgresflex/user/update/update_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -169,54 +168,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index 5fcd2bec3..c70e58e92 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -63,9 +63,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a STACKIT project with a network area`, "$ stackit project create --parent-id xxxx --name my-project --network-area-id yyyy"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -111,7 +111,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) labels := flags.FlagToStringToStringPointer(p, cmd, labelFlag) diff --git a/internal/cmd/project/create/create_test.go b/internal/cmd/project/create/create_test.go index f6cf9fbde..3503b0b68 100644 --- a/internal/cmd/project/create/create_test.go +++ b/internal/cmd/project/create/create_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" "github.com/zalando/go-keyring" @@ -86,6 +87,7 @@ func fixtureRequest(mods ...func(request *resourcemanager.ApiCreateProjectReques func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string labelValues []string isValid bool @@ -177,56 +179,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.labelValues { - err := cmd.Flags().Set(labelFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", labelFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + labelFlag: tt.labelValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/project/delete/delete.go b/internal/cmd/project/delete/delete.go index ce572bfc5..eff9d2615 100644 --- a/internal/cmd/project/delete/delete.go +++ b/internal/cmd/project/delete/delete.go @@ -35,9 +35,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Delete a STACKIT project by explicitly providing the project ID`, "$ stackit project delete --project-id xxx"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -80,7 +80,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/project/delete/delete_test.go b/internal/cmd/project/delete/delete_test.go index b53ede53d..f14e83869 100644 --- a/internal/cmd/project/delete/delete_test.go +++ b/internal/cmd/project/delete/delete_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) @@ -55,6 +54,7 @@ func fixtureRequest(mods ...func(request *resourcemanager.ApiDeleteProjectReques func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -74,46 +74,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/describe/describe_test.go b/internal/cmd/project/describe/describe_test.go index f32dbc491..2afd90610 100644 --- a/internal/cmd/project/describe/describe_test.go +++ b/internal/cmd/project/describe/describe_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) @@ -137,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index 8b459dd4c..fe7f8503a 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -62,9 +62,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all STACKIT projects that a certain user is a member of`, "$ stackit project list --member example@email.com"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -101,7 +101,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(pageSizeFlag, pageSizeDefault, "Number of items fetched in each API call. Does not affect the number of items in the command output") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) creationTimeAfter, err := flags.FlagToDateTimePointer(p, cmd, creationTimeAfterFlag, creationTimeAfterFormat) diff --git a/internal/cmd/project/list/list_test.go b/internal/cmd/project/list/list_test.go index 6d187a9bc..baf7fed6d 100644 --- a/internal/cmd/project/list/list_test.go +++ b/internal/cmd/project/list/list_test.go @@ -9,6 +9,8 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -81,6 +83,7 @@ func fixtureRequest(mods ...func(request *resourcemanager.ApiListProjectsRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string projectIdLikevalues *[]string isValid bool @@ -194,66 +197,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if tt.projectIdLikevalues != nil { - for _, value := range *tt.projectIdLikevalues { - err := cmd.Flags().Set(projectIdLikeFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", projectIdLikeFlag, value, err) - } - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating one of required flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + projectIdLikeFlag: utils.GetSliceFromPointer(tt.projectIdLikevalues), + }, tt.isValid) }) } } diff --git a/internal/cmd/project/member/add/add_test.go b/internal/cmd/project/member/add/add_test.go index 9d24461bf..fa8cb5f04 100644 --- a/internal/cmd/project/member/add/add_test.go +++ b/internal/cmd/project/member/add/add_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -124,54 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index 675ddcd22..04d141e3b 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -53,9 +53,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 members of a project`, "$ stackit project member list --project-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.EnumFlag(false, "subject", sortByFlagOptions...), sortByFlag, fmt.Sprintf("Sort entries by a specific field, one of %q", sortByFlagOptions)) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/project/member/list/list_test.go b/internal/cmd/project/member/list/list_test.go index a710f7b5d..14167c407 100644 --- a/internal/cmd/project/member/list/list_test.go +++ b/internal/cmd/project/member/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *authorization.ApiListMembersRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -129,48 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/member/remove/remove_test.go b/internal/cmd/project/member/remove/remove_test.go index c3cb414e1..d0fc6d8f0 100644 --- a/internal/cmd/project/member/remove/remove_test.go +++ b/internal/cmd/project/member/remove/remove_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -137,54 +136,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index e4dadb288..a2d65e21d 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 roles and permissions of a project`, "$ stackit project role list --project-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -94,7 +94,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/project/role/list/list_test.go b/internal/cmd/project/role/list/list_test.go index b1f14f432..66f51f7df 100644 --- a/internal/cmd/project/role/list/list_test.go +++ b/internal/cmd/project/role/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) @@ -59,6 +59,7 @@ func fixtureRequest(mods ...func(request *authorization.ApiListRolesRequest)) au func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -99,48 +100,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/project/update/update.go b/internal/cmd/project/update/update.go index d8ad38c71..7523ff5e1 100644 --- a/internal/cmd/project/update/update.go +++ b/internal/cmd/project/update/update.go @@ -54,9 +54,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Update the name of a STACKIT project by explicitly providing the project ID`, "$ stackit project update --name my-updated-project --project-id xxx"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -102,7 +102,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a project. A label can be provided with the format key=value and the flag can be used multiple times to provide a list of labels") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/project/update/update_test.go b/internal/cmd/project/update/update_test.go index 289a3b752..a2f70d560 100644 --- a/internal/cmd/project/update/update_test.go +++ b/internal/cmd/project/update/update_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +65,7 @@ func fixtureRequest(mods ...func(request *resourcemanager.ApiPartialUpdateProjec func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string labelValues []string isValid bool @@ -131,56 +131,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.labelValues { - err := cmd.Flags().Set(labelFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", labelFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + labelFlag: tt.labelValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 831d6eb46..1929e81e6 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit public-ip create --associated-resource-id xxx --labels key=value,foo=bar`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -97,7 +97,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a public IP. E.g. '--labels key1=value1,key2=value2,...'") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/public-ip/create/create_test.go b/internal/cmd/public-ip/create/create_test.go index be2653938..5e946f386 100644 --- a/internal/cmd/public-ip/create/create_test.go +++ b/internal/cmd/public-ip/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -79,6 +80,7 @@ func fixturePayload(mods ...func(payload *iaas.CreatePublicIPPayload)) iaas.Crea func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -142,46 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/public-ip/delete/delete_test.go b/internal/cmd/public-ip/delete/delete_test.go index 667578fb0..115c9d2e7 100644 --- a/internal/cmd/public-ip/delete/delete_test.go +++ b/internal/cmd/public-ip/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/public-ip/describe/describe_test.go b/internal/cmd/public-ip/describe/describe_test.go index f69ba8dbb..05ceefe6e 100644 --- a/internal/cmd/public-ip/describe/describe_test.go +++ b/internal/cmd/public-ip/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index c282f26bb..4501c1cab 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit public-ip list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -105,7 +105,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/public-ip/list/list_test.go b/internal/cmd/public-ip/list/list_test.go index a6fe99a48..1d6f7b20d 100644 --- a/internal/cmd/public-ip/list/list_test.go +++ b/internal/cmd/public-ip/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListPublicIPsRequest)) iaas.Ap func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -132,46 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/public-ip/ranges/list/list.go b/internal/cmd/public-ip/ranges/list/list.go index e959d39f4..7188146f6 100644 --- a/internal/cmd/public-ip/ranges/list/list.go +++ b/internal/cmd/public-ip/ranges/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit public-ip ranges list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -84,7 +84,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) diff --git a/internal/cmd/public-ip/ranges/list/list_test.go b/internal/cmd/public-ip/ranges/list/list_test.go index f9aa0d6be..20af8f19f 100644 --- a/internal/cmd/public-ip/ranges/list/list_test.go +++ b/internal/cmd/public-ip/ranges/list/list_test.go @@ -3,7 +3,8 @@ package list import ( "testing" - "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -16,13 +17,14 @@ func TestParseInput(t *testing.T) { projectId := uuid.New().String() tests := []struct { description string - globalFlags map[string]string + argValues []string + flagValues map[string]string expectedModel *inputModel isValid bool }{ { description: "valid project id", - globalFlags: map[string]string{ + flagValues: map[string]string{ "project-id": projectId, }, expectedModel: &inputModel{ @@ -35,7 +37,7 @@ func TestParseInput(t *testing.T) { }, { description: "missing project id does not lead into error", - globalFlags: map[string]string{}, + flagValues: map[string]string{}, expectedModel: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.InfoVerbosity, @@ -45,7 +47,7 @@ func TestParseInput(t *testing.T) { }, { description: "valid input with limit", - globalFlags: map[string]string{ + flagValues: map[string]string{ "limit": "10", }, expectedModel: &inputModel{ @@ -58,7 +60,7 @@ func TestParseInput(t *testing.T) { }, { description: "valid input without limit", - globalFlags: map[string]string{}, + flagValues: map[string]string{}, expectedModel: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.InfoVerbosity, @@ -68,7 +70,7 @@ func TestParseInput(t *testing.T) { }, { description: "invalid limit (zero)", - globalFlags: map[string]string{ + flagValues: map[string]string{ "limit": "0", }, expectedModel: nil, @@ -76,7 +78,7 @@ func TestParseInput(t *testing.T) { }, { description: "invalid limit (negative)", - globalFlags: map[string]string{ + flagValues: map[string]string{ "limit": "-1", }, expectedModel: nil, @@ -86,29 +88,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatal(err) - } - - for flag, value := range tt.globalFlags { - if err := cmd.Flags().Set(flag, value); err != nil { - t.Fatalf("Failed to set global flag %s: %v", flag, err) - } - } - - model, err := parseInput(p, cmd) - if !tt.isValid && err == nil { - t.Fatalf("parseInput() error = %v, wantErr %v", err, !tt.isValid) - } - - if tt.isValid { - if diff := cmp.Diff(model, tt.expectedModel); diff != "" { - t.Fatalf("Model mismatch (-want +got):\n%s", diff) - } - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index 89cb8b90c..84835b555 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -34,9 +34,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit quota list`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/quota/list/list_test.go b/internal/cmd/quota/list/list_test.go index ab2cdd8ea..973f28abb 100644 --- a/internal/cmd/quota/list/list_test.go +++ b/internal/cmd/quota/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -55,6 +56,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListQuotasRequest)) iaas.ApiLi func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -95,44 +97,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index f4d4830e0..9f22b594a 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -43,9 +43,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for a RabbitMQ instance and show the password in the output`, "$ stackit rabbitmq credentials create --instance-id xxx --show-password"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/rabbitmq/credentials/create/create_test.go b/internal/cmd/rabbitmq/credentials/create/create_test.go index 84e65eaa0..b4f28de99 100644 --- a/internal/cmd/rabbitmq/credentials/create/create_test.go +++ b/internal/cmd/rabbitmq/credentials/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) @@ -58,6 +59,7 @@ func fixtureRequest(mods ...func(request *rabbitmq.ApiCreateCredentialsRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -129,46 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/credentials/delete/delete_test.go b/internal/cmd/rabbitmq/credentials/delete/delete_test.go index e716f7c72..6d6a46340 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete_test.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/credentials/describe/describe_test.go b/internal/cmd/rabbitmq/credentials/describe/describe_test.go index a40cd610d..15bf51687 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe_test.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) @@ -164,54 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index 4b638c13c..efa8fc187 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials' IDs for a RabbitMQ instance`, "$ stackit rabbitmq credentials list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/rabbitmq/credentials/list/list_test.go b/internal/cmd/rabbitmq/credentials/list/list_test.go index 77f7f2f5e..ed752b64d 100644 --- a/internal/cmd/rabbitmq/credentials/list/list_test.go +++ b/internal/cmd/rabbitmq/credentials/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) @@ -61,6 +62,7 @@ func fixtureRequest(mods ...func(request *rabbitmq.ApiListCredentialsRequest)) r func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -136,46 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index b20674c33..143264140 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -73,9 +73,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a RabbitMQ instance with name "my-instance" and specify IP range which is allowed to access it`, "$ stackit rabbitmq instance create --name my-instance --plan-id xxx --acl 1.2.3.0/24"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -151,7 +151,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/rabbitmq/instance/create/create_test.go b/internal/cmd/rabbitmq/instance/create/create_test.go index aa39a62e8..a1b4585c4 100644 --- a/internal/cmd/rabbitmq/instance/create/create_test.go +++ b/internal/cmd/rabbitmq/instance/create/create_test.go @@ -5,6 +5,8 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -110,6 +112,7 @@ func fixtureRequest(mods ...func(request *rabbitmq.ApiCreateInstanceRequest)) ra func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string sgwAclValues []string pluginValues []string @@ -276,76 +279,11 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.sgwAclValues { - err := cmd.Flags().Set(sgwAclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", sgwAclFlag, value, err) - } - } - - for _, value := range tt.pluginValues { - err := cmd.Flags().Set(pluginFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", pluginFlag, value, err) - } - } - - for _, value := range tt.syslogValues { - err := cmd.Flags().Set(syslogFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", syslogFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + sgwAclFlag: tt.sgwAclValues, + syslogFlag: tt.syslogValues, + pluginFlag: tt.pluginValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/instance/delete/delete_test.go b/internal/cmd/rabbitmq/instance/delete/delete_test.go index 8064098ad..24fbaeac9 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete_test.go +++ b/internal/cmd/rabbitmq/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/instance/describe/describe_test.go b/internal/cmd/rabbitmq/instance/describe/describe_test.go index 8fe1f8288..620119e9b 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe_test.go +++ b/internal/cmd/rabbitmq/instance/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) @@ -137,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 53a62a067..61bc42e5b 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 RabbitMQ instances`, "$ stackit rabbitmq instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/rabbitmq/instance/list/list_test.go b/internal/cmd/rabbitmq/instance/list/list_test.go index bbfefdfff..6160eb6cc 100644 --- a/internal/cmd/rabbitmq/instance/list/list_test.go +++ b/internal/cmd/rabbitmq/instance/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) @@ -59,6 +59,7 @@ func fixtureRequest(mods ...func(request *rabbitmq.ApiListInstancesRequest)) rab func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -113,48 +114,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index 1114a9fc1..09f0220ab 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 RabbitMQ service plans`, "$ stackit rabbitmq plans --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/rabbitmq/plans/plans_test.go b/internal/cmd/rabbitmq/plans/plans_test.go index d5f0f9aee..2089d4414 100644 --- a/internal/cmd/rabbitmq/plans/plans_test.go +++ b/internal/cmd/rabbitmq/plans/plans_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) @@ -59,6 +59,7 @@ func fixtureRequest(mods ...func(request *rabbitmq.ApiListOfferingsRequest)) rab func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -113,48 +114,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index 5b2d313b4..2b8e011da 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -44,9 +44,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create credentials for a Redis instance and show the password in the output`, "$ stackit redis credentials create --instance-id xxx --show-password"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/redis/credentials/create/create_test.go b/internal/cmd/redis/credentials/create/create_test.go index 070229478..fc968ce32 100644 --- a/internal/cmd/redis/credentials/create/create_test.go +++ b/internal/cmd/redis/credentials/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -58,6 +59,7 @@ func fixtureRequest(mods ...func(request *redis.ApiCreateCredentialsRequest)) re func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -129,46 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/credentials/delete/delete_test.go b/internal/cmd/redis/credentials/delete/delete_test.go index d8b2c4632..08960a15d 100644 --- a/internal/cmd/redis/credentials/delete/delete_test.go +++ b/internal/cmd/redis/credentials/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/credentials/describe/describe_test.go b/internal/cmd/redis/credentials/describe/describe_test.go index fc8edb1b8..b98c36631 100644 --- a/internal/cmd/redis/credentials/describe/describe_test.go +++ b/internal/cmd/redis/credentials/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -164,54 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index 08f4bf88b..8f2dc6945 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 credentials' IDs for a Redis instance`, "$ stackit redis credentials list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/redis/credentials/list/list_test.go b/internal/cmd/redis/credentials/list/list_test.go index a6c29f283..cd986c587 100644 --- a/internal/cmd/redis/credentials/list/list_test.go +++ b/internal/cmd/redis/credentials/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -61,6 +62,7 @@ func fixtureRequest(mods ...func(request *redis.ApiListCredentialsRequest)) redi func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -136,46 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index 6e694b135..d5a410d35 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -71,9 +71,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a Redis instance with name "my-instance" and specify IP range which is allowed to access it`, "$ stackit redis instance create --name my-instance --plan-id xxx --acl 1.2.3.0/24"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -148,7 +148,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/redis/instance/create/create_test.go b/internal/cmd/redis/instance/create/create_test.go index 814673259..6316e50b6 100644 --- a/internal/cmd/redis/instance/create/create_test.go +++ b/internal/cmd/redis/instance/create/create_test.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -107,6 +108,7 @@ func fixtureRequest(mods ...func(request *redis.ApiCreateInstanceRequest)) redis func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string sgwAclValues []string syslogValues []string @@ -261,66 +263,10 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.sgwAclValues { - err := cmd.Flags().Set(sgwAclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", sgwAclFlag, value, err) - } - } - - for _, value := range tt.syslogValues { - err := cmd.Flags().Set(syslogFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", syslogFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + sgwAclFlag: tt.sgwAclValues, + syslogFlag: tt.syslogValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/redis/instance/delete/delete_test.go b/internal/cmd/redis/instance/delete/delete_test.go index bb0da281f..6372daa5b 100644 --- a/internal/cmd/redis/instance/delete/delete_test.go +++ b/internal/cmd/redis/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/instance/describe/describe_test.go b/internal/cmd/redis/instance/describe/describe_test.go index 651164b98..9c1bf4e39 100644 --- a/internal/cmd/redis/instance/describe/describe_test.go +++ b/internal/cmd/redis/instance/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -137,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index 6f98a00f1..571004f47 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Redis instances`, "$ stackit redis instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -91,7 +91,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/redis/instance/list/list_test.go b/internal/cmd/redis/instance/list/list_test.go index f35a6eddd..fea12c21f 100644 --- a/internal/cmd/redis/instance/list/list_test.go +++ b/internal/cmd/redis/instance/list/list_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -59,6 +59,7 @@ func fixtureRequest(mods ...func(request *redis.ApiListInstancesRequest)) redis. func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -113,48 +114,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index 1fda160e4..83125b63a 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Redis service plans`, "$ stackit redis plans --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/redis/plans/plans_test.go b/internal/cmd/redis/plans/plans_test.go index 8ea65f786..919b8d01f 100644 --- a/internal/cmd/redis/plans/plans_test.go +++ b/internal/cmd/redis/plans/plans_test.go @@ -7,10 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) @@ -59,6 +59,7 @@ func fixtureRequest(mods ...func(request *redis.ApiListOfferingsRequest)) redis. func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -113,48 +114,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index d22f30292..8f5401d9a 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -45,10 +45,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a Secrets Manager instance with name "my-instance" and specify IP range which is allowed to access it`, `$ stackit secrets-manager instance create --name my-instance --acl 1.2.3.0/24`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -108,7 +108,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/secrets-manager/instance/create/create_test.go b/internal/cmd/secrets-manager/instance/create/create_test.go index 02a895c01..641767b53 100644 --- a/internal/cmd/secrets-manager/instance/create/create_test.go +++ b/internal/cmd/secrets-manager/instance/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) @@ -77,6 +78,7 @@ func fixtureUpdateACLsRequest(mods ...func(request *secretsmanager.ApiUpdateACLs func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -184,56 +186,9 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.aclValues { - err := cmd.Flags().Set(aclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", aclFlag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + aclFlag: tt.aclValues, + }, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/instance/delete/delete_test.go b/internal/cmd/secrets-manager/instance/delete/delete_test.go index fe6eae032..6a1909548 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete_test.go +++ b/internal/cmd/secrets-manager/instance/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/instance/describe/describe_test.go b/internal/cmd/secrets-manager/instance/describe/describe_test.go index 2cadb3be2..25ee15d66 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe_test.go +++ b/internal/cmd/secrets-manager/instance/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -146,54 +147,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index 82576c398..9cd6b24ad 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -45,9 +45,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Secrets Manager instances`, "$ stackit secrets-manager instance list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/secrets-manager/instance/list/list_test.go b/internal/cmd/secrets-manager/instance/list/list_test.go index 6ea677137..2b416584d 100644 --- a/internal/cmd/secrets-manager/instance/list/list_test.go +++ b/internal/cmd/secrets-manager/instance/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *secretsmanager.ApiListInstancesRequest func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -124,48 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index 7d9f6d3f7..153bb5035 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -51,9 +51,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit secrets-manager user create --instance-id xxx --write"), ), Args: args.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -102,7 +102,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/secrets-manager/user/create/create_test.go b/internal/cmd/secrets-manager/user/create/create_test.go index a64b826ba..bbc606f1e 100644 --- a/internal/cmd/secrets-manager/user/create/create_test.go +++ b/internal/cmd/secrets-manager/user/create/create_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) @@ -70,6 +70,7 @@ func fixtureRequest(mods ...func(request *secretsmanager.ApiCreateUserRequest)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -153,48 +154,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/user/delete/delete_test.go b/internal/cmd/secrets-manager/user/delete/delete_test.go index 0827ebf88..8b66aa96a 100644 --- a/internal/cmd/secrets-manager/user/delete/delete_test.go +++ b/internal/cmd/secrets-manager/user/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -153,54 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/user/describe/describe_test.go b/internal/cmd/secrets-manager/user/describe/describe_test.go index 53c14c586..f65790dfe 100644 --- a/internal/cmd/secrets-manager/user/describe/describe_test.go +++ b/internal/cmd/secrets-manager/user/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -165,54 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index 1c76d15fc..249b0cee5 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 Secrets Manager users with ID "xxx"`, "$ stackit secrets-manager user list --instance-id xxx --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -99,7 +99,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/secrets-manager/user/list/list_test.go b/internal/cmd/secrets-manager/user/list/list_test.go index d2de82297..cd395dc64 100644 --- a/internal/cmd/secrets-manager/user/list/list_test.go +++ b/internal/cmd/secrets-manager/user/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *secretsmanager.ApiListUsersRequest)) s func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -131,48 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index d54b797f3..9598ef794 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -42,9 +42,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { examples.NewExample(`Create a named group`, `$ stackit security-group create --name my-new-group`), examples.NewExample(`Create a named group with labels`, `$ stackit security-group create --name my-new-group --labels label1=value1,label2=value2`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -94,7 +94,7 @@ func configureFlags(cmd *cobra.Command) { } } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/security-group/create/create_test.go b/internal/cmd/security-group/create/create_test.go index 7b9cbd21e..3f936f5ab 100644 --- a/internal/cmd/security-group/create/create_test.go +++ b/internal/cmd/security-group/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -89,6 +90,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateSecurityGroupRequest)) i func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -168,44 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/security-group/delete/delete_test.go b/internal/cmd/security-group/delete/delete_test.go index ec7143cbf..5a4787576 100644 --- a/internal/cmd/security-group/delete/delete_test.go +++ b/internal/cmd/security-group/delete/delete_test.go @@ -57,6 +57,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiDeleteSecurityGroupRequest)) i func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string args []string isValid bool diff --git a/internal/cmd/security-group/describe/describe_test.go b/internal/cmd/security-group/describe/describe_test.go index f9b5f7fba..62bf425be 100644 --- a/internal/cmd/security-group/describe/describe_test.go +++ b/internal/cmd/security-group/describe/describe_test.go @@ -56,6 +56,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiGetSecurityGroupRequest)) iaas func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool args []string diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index 9fe33d546..ae9ecdd10 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -39,9 +39,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { examples.NewExample(`List all groups`, `$ stackit security-group list`), examples.NewExample(`List groups with labels`, `$ stackit security-group list --label-selector label1=value1,label2=value2`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -86,7 +86,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/security-group/list/list_test.go b/internal/cmd/security-group/list/list_test.go index bade91812..806ab98e3 100644 --- a/internal/cmd/security-group/list/list_test.go +++ b/internal/cmd/security-group/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListSecurityGroupsRequest)) ia func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -119,44 +121,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - if err := globalflags.Configure(cmd.Flags()); err != nil { - t.Errorf("cannot configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - if err := cmd.ValidateRequiredFlags(); err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index ede4e39a5..cee025e98 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -75,9 +75,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit security-group rule create --security-group-id xxx --direction ingress --protocol-number 1`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -141,7 +141,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/security-group/rule/create/create_test.go b/internal/cmd/security-group/rule/create/create_test.go index 6c1521899..2432c55ae 100644 --- a/internal/cmd/security-group/rule/create/create_test.go +++ b/internal/cmd/security-group/rule/create/create_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -121,6 +123,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateSecurityGroupRulePayload)) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -243,53 +246,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flag groups: %v", err) - } - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/security-group/rule/describe/describe_test.go b/internal/cmd/security-group/rule/describe/describe_test.go index 66b536f5c..68c84b395 100644 --- a/internal/cmd/security-group/rule/describe/describe_test.go +++ b/internal/cmd/security-group/rule/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -165,54 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index 9098a19ff..4984d6b17 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -53,9 +53,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit security-group rule list --security-group-id xxx --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -110,7 +110,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/security-group/rule/list/list_test.go b/internal/cmd/security-group/rule/list/list_test.go index 0b7a49b25..ab41b1d87 100644 --- a/internal/cmd/security-group/rule/list/list_test.go +++ b/internal/cmd/security-group/rule/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -61,6 +62,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListSecurityGroupRulesRequest) func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -141,46 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/security-group/update/update_test.go b/internal/cmd/security-group/update/update_test.go index 1d89a9e48..e7c6c4f00 100644 --- a/internal/cmd/security-group/update/update_test.go +++ b/internal/cmd/security-group/update/update_test.go @@ -87,6 +87,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiUpdateSecurityGroupRequest)) i func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string args []string isValid bool diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index 441568839..824bbb0b9 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -53,10 +53,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a Server Backup with name "mybackup" and retention period of 5 days`, `$ stackit server backup create --server-id xxx --name=mybackup --retention-period=5`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -113,7 +113,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/backup/create/create_test.go b/internal/cmd/server/backup/create/create_test.go index 71a50ff6b..9f7799a7f 100644 --- a/internal/cmd/server/backup/create/create_test.go +++ b/internal/cmd/server/backup/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -82,6 +83,7 @@ func fixturePayload(mods ...func(payload *serverbackup.CreateBackupPayload)) ser func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -131,46 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/delete/delete_test.go b/internal/cmd/server/backup/delete/delete_test.go index d1de3562f..1b90f5c00 100644 --- a/internal/cmd/server/backup/delete/delete_test.go +++ b/internal/cmd/server/backup/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/describe/describe_test.go b/internal/cmd/server/backup/describe/describe_test.go index c706734f1..2e3c10af2 100644 --- a/internal/cmd/server/backup/describe/describe_test.go +++ b/internal/cmd/server/backup/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index 0bc6f6a1c..18acc9627 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -40,9 +40,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Disable Server Backup functionality for your server.`, "$ stackit server backup disable --server-id=zzz"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/backup/disable/disable_test.go b/internal/cmd/server/backup/disable/disable_test.go index 7b13233e1..9e74ae6ee 100644 --- a/internal/cmd/server/backup/disable/disable_test.go +++ b/internal/cmd/server/backup/disable/disable_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) @@ -26,6 +25,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -59,17 +59,23 @@ func fixtureRequest(mods ...func(request *serverbackup.ApiDisableServiceResource func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel }{ { - description: "base", - flagValues: fixtureFlagValues(), - isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.ServerId = "" + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "server id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "" }), + isValid: false, }, { description: "no values", @@ -101,46 +107,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index 4cb0f3667..8194ca95e 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -40,9 +40,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Enable Server Backup functionality for your server`, "$ stackit server backup enable --server-id=zzz"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/backup/enable/enable_test.go b/internal/cmd/server/backup/enable/enable_test.go index b4cc1cb77..b7035a762 100644 --- a/internal/cmd/server/backup/enable/enable_test.go +++ b/internal/cmd/server/backup/enable/enable_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) @@ -26,6 +25,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -59,17 +59,23 @@ func fixtureRequest(mods ...func(request *serverbackup.ApiEnableServiceResourceR func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel }{ { - description: "base", - flagValues: fixtureFlagValues(), - isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.ServerId = "" + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "server id is missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "" }), + isValid: false, }, { description: "no values", @@ -101,46 +107,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index 453185e56..58259611f 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all backups for a server with ID "xxx" in JSON format`, "$ stackit server backup list --server-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/backup/list/list_test.go b/internal/cmd/server/backup/list/list_test.go index 218a17c6e..a265c6779 100644 --- a/internal/cmd/server/backup/list/list_test.go +++ b/internal/cmd/server/backup/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *serverbackup.ApiListBackupsRequest)) s func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -117,46 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/restore/restore_test.go b/internal/cmd/server/backup/restore/restore_test.go index ff14455c2..9f890f3c2 100644 --- a/internal/cmd/server/backup/restore/restore_test.go +++ b/internal/cmd/server/backup/restore/restore_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -132,54 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index 301bc279c..658ab27ee 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -61,10 +61,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a Server Backup Schedule with name "myschedule", backup name "mybackup" and retention period of 5 days`, `$ stackit server backup schedule create --server-id xxx --backup-name=mybackup --backup-schedule-name=myschedule --backup-retention-period=5`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -124,7 +124,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/backup/schedule/create/create_test.go b/internal/cmd/server/backup/schedule/create/create_test.go index ceb92188b..5f4d51733 100644 --- a/internal/cmd/server/backup/schedule/create/create_test.go +++ b/internal/cmd/server/backup/schedule/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -93,6 +94,7 @@ func fixturePayload(mods ...func(payload *serverbackup.CreateBackupSchedulePaylo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -142,46 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/schedule/delete/delete_test.go b/internal/cmd/server/backup/schedule/delete/delete_test.go index 26c218485..5e0f108ca 100644 --- a/internal/cmd/server/backup/schedule/delete/delete_test.go +++ b/internal/cmd/server/backup/schedule/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/schedule/describe/describe_test.go b/internal/cmd/server/backup/schedule/describe/describe_test.go index edc952d18..5d1f51e3a 100644 --- a/internal/cmd/server/backup/schedule/describe/describe_test.go +++ b/internal/cmd/server/backup/schedule/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) @@ -129,54 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index b3a93e3fa..1c396d0e1 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all backup schedules for a server with ID "xxx" in JSON format`, "$ stackit server backup schedule list --server-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -101,7 +101,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/backup/schedule/list/list_test.go b/internal/cmd/server/backup/schedule/list/list_test.go index c88ec459e..2234b0397 100644 --- a/internal/cmd/server/backup/schedule/list/list_test.go +++ b/internal/cmd/server/backup/schedule/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -63,6 +64,7 @@ func fixtureRequest(mods ...func(request *serverbackup.ApiListBackupSchedulesReq func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -117,46 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/volume-backup/delete/delete_test.go b/internal/cmd/server/backup/volume-backup/delete/delete_test.go index 34859934a..0a1da5857 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete_test.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -133,54 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/backup/volume-backup/restore/restore_test.go b/internal/cmd/server/backup/volume-backup/restore/restore_test.go index 21da9b128..f329161db 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore_test.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -139,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 7e1817b50..0f489ee7a 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -49,10 +49,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a server command for server with ID "xxx", template name "RunShellScript" and a script provided on the command line`, `$ stackit server command create --server-id xxx --template-name=RunShellScript --params script='echo hello'`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -108,7 +108,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/command/create/create_test.go b/internal/cmd/server/command/create/create_test.go index eed029584..cb2368d6f 100644 --- a/internal/cmd/server/command/create/create_test.go +++ b/internal/cmd/server/command/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -81,6 +82,7 @@ func fixturePayload(mods ...func(payload *runcommand.CreateCommandPayload)) runc func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -127,46 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/command/describe/describe_test.go b/internal/cmd/server/command/describe/describe_test.go index 59363f0e7..89689817d 100644 --- a/internal/cmd/server/command/describe/describe_test.go +++ b/internal/cmd/server/command/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -163,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index c3a875043..f917b1689 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all commands for a server with ID "xxx" in JSON format`, "$ stackit server command list --server-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/command/list/list_test.go b/internal/cmd/server/command/list/list_test.go index 7d6ce40fb..9af1dfc05 100644 --- a/internal/cmd/server/command/list/list_test.go +++ b/internal/cmd/server/command/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +67,7 @@ func fixtureRequest(mods ...func(request *runcommand.ApiListCommandsRequest)) ru func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -120,46 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/command/template/describe/describe_test.go b/internal/cmd/server/command/template/describe/describe_test.go index 9fa7ba208..45cbe627a 100644 --- a/internal/cmd/server/command/template/describe/describe_test.go +++ b/internal/cmd/server/command/template/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -163,54 +164,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index 54ff4fd98..ffd76ac24 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -41,9 +41,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all commands templates in JSON format`, "$ stackit server command template list --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -81,7 +81,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/command/template/list/list_test.go b/internal/cmd/server/command/template/list/list_test.go index 0ff491e5d..9255b13fe 100644 --- a/internal/cmd/server/command/template/list/list_test.go +++ b/internal/cmd/server/command/template/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -57,6 +58,7 @@ func fixtureRequest(mods ...func(request *runcommand.ApiListCommandTemplatesRequ func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -111,46 +113,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/console/console_test.go b/internal/cmd/server/console/console_test.go index 9b6c0413c..ab80a7fc4 100644 --- a/internal/cmd/server/console/console_test.go +++ b/internal/cmd/server/console/console_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -129,54 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index b4f012148..b0142acec 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -108,9 +108,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml")`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -188,7 +188,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/create/create_test.go b/internal/cmd/server/create/create_test.go index 1548691d4..192caac02 100644 --- a/internal/cmd/server/create/create_test.go +++ b/internal/cmd/server/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -41,7 +42,6 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st bootVolumeSourceIdFlag: testSourceId, bootVolumeSourceTypeFlag: "test-source-type", bootVolumeDeleteOnTerminationFlag: "false", - imageIdFlag: testImageId, keypairNameFlag: "test-keypair-name", networkIdFlag: testNetworkId, securityGroupsFlag: "test-security-groups", @@ -70,7 +70,6 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { BootVolumeSourceId: utils.Ptr(testSourceId), BootVolumeSourceType: utils.Ptr("test-source-type"), BootVolumeDeleteOnTermination: utils.Ptr(false), - ImageId: utils.Ptr(testImageId), KeypairName: utils.Ptr("test-keypair-name"), NetworkId: utils.Ptr(testNetworkId), SecurityGroups: utils.Ptr([]string{"test-security-groups"}), @@ -117,7 +116,6 @@ func fixturePayload(mods ...func(payload *iaas.CreateServerPayload)) iaas.Create Name: utils.Ptr("test-server-name"), AvailabilityZone: utils.Ptr("eu01-1"), AffinityGroup: utils.Ptr("test-affinity-group"), - ImageId: utils.Ptr(testImageId), KeypairName: utils.Ptr("test-keypair-name"), SecurityGroups: utils.Ptr([]string{"test-security-groups"}), ServiceAccountMails: utils.Ptr([]string{"test-service-account"}), @@ -147,6 +145,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateServerPayload)) iaas.Create func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -175,6 +174,7 @@ func TestParseInput(t *testing.T) { delete(flagValues, serviceAccountEmailsFlag) delete(flagValues, userDataFlag) delete(flagValues, volumesFlag) + flagValues[imageIdFlag] = testImageId }), isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { @@ -193,6 +193,7 @@ func TestParseInput(t *testing.T) { model.ServiceAccountMails = nil model.UserData = nil model.Volumes = nil + model.ImageId = utils.Ptr(testImageId) }), }, { @@ -292,12 +293,14 @@ func TestParseInput(t *testing.T) { delete(flagValues, bootVolumeSourceIdFlag) delete(flagValues, bootVolumeSourceTypeFlag) delete(flagValues, bootVolumeSizeFlag) + flagValues[imageIdFlag] = testImageId }), isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { model.BootVolumeSourceId = nil model.BootVolumeSourceType = nil model.BootVolumeSize = nil + model.ImageId = utils.Ptr(testImageId) }), }, { @@ -326,46 +329,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/deallocate/deallocate_test.go b/internal/cmd/server/deallocate/deallocate_test.go index 379fc3a58..5f1c06bea 100644 --- a/internal/cmd/server/deallocate/deallocate_test.go +++ b/internal/cmd/server/deallocate/deallocate_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -128,54 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/delete/delete_test.go b/internal/cmd/server/delete/delete_test.go index 1c04e26cb..3b72baca3 100644 --- a/internal/cmd/server/delete/delete_test.go +++ b/internal/cmd/server/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/describe/describe_test.go b/internal/cmd/server/describe/describe_test.go index 86052e8b7..0d416e464 100644 --- a/internal/cmd/server/describe/describe_test.go +++ b/internal/cmd/server/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -139,54 +140,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index 13a4be08f..0918e1d91 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -57,9 +57,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit server list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -105,7 +105,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/list/list_test.go b/internal/cmd/server/list/list_test.go index 64fe0ddb4..1507be485 100644 --- a/internal/cmd/server/list/list_test.go +++ b/internal/cmd/server/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -64,6 +65,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListServersRequest)) iaas.ApiL func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -133,46 +135,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/log/log_test.go b/internal/cmd/server/log/log_test.go index 0ebc57bdc..c1768f672 100644 --- a/internal/cmd/server/log/log_test.go +++ b/internal/cmd/server/log/log_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -142,54 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/machine-type/describe/describe_test.go b/internal/cmd/server/machine-type/describe/describe_test.go index 20e47affc..81c992468 100644 --- a/internal/cmd/server/machine-type/describe/describe_test.go +++ b/internal/cmd/server/machine-type/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -126,54 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 7d4f228cd..833de684e 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit server machine-type list --limit=10`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/machine-type/list/list_test.go b/internal/cmd/server/machine-type/list/list_test.go index 8472b596d..db8906209 100644 --- a/internal/cmd/server/machine-type/list/list_test.go +++ b/internal/cmd/server/machine-type/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -59,6 +60,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListMachineTypesRequest)) iaas func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -118,46 +120,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 739a9169e..1d774ffea 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -52,9 +52,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit server network-interface attach --network-id xxx --server-id yyy --create`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -131,7 +131,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/network-interface/attach/attach_test.go b/internal/cmd/server/network-interface/attach/attach_test.go index 6e5a00011..697562536 100644 --- a/internal/cmd/server/network-interface/attach/attach_test.go +++ b/internal/cmd/server/network-interface/attach/attach_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -73,6 +72,7 @@ func fixtureRequestCreateAndAttach(mods ...func(request *iaas.ApiAddNetworkToSer func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -199,54 +199,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flag groups: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index 7d72df379..b8afad878 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -52,9 +52,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit server network-interface detach --network-id xxx --server-id yyy --delete`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -133,7 +133,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/network-interface/detach/detach_test.go b/internal/cmd/server/network-interface/detach/detach_test.go index cc60c9912..1eef8529a 100644 --- a/internal/cmd/server/network-interface/detach/detach_test.go +++ b/internal/cmd/server/network-interface/detach/detach_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -73,6 +72,7 @@ func fixtureRequestDetachAndDelete(mods ...func(request *iaas.ApiRemoveNetworkFr func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -199,54 +199,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flag groups: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index 3e895c4b4..ef8f70ca7 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -50,9 +50,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit server network-interface list --server-id xxx --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/network-interface/list/list_test.go b/internal/cmd/server/network-interface/list/list_test.go index 8d2c90f86..4b91f4742 100644 --- a/internal/cmd/server/network-interface/list/list_test.go +++ b/internal/cmd/server/network-interface/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListServerNicsRequest)) iaas.A func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -137,46 +139,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 3a2709ded..7af78387a 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -48,10 +48,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a Server os-update with name "myupdate" and maintenance window for 13 o'clock.`, `$ stackit server os-update create --server-id xxx --maintenance-window=13`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64P(maintenanceWindowFlag, "m", defaultMaintenanceWindow, "Maintenance window (in hours, 1-24)") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/os-update/create/create_test.go b/internal/cmd/server/os-update/create/create_test.go index 78e914882..073ea1db6 100644 --- a/internal/cmd/server/os-update/create/create_test.go +++ b/internal/cmd/server/os-update/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -78,6 +79,7 @@ func fixturePayload(mods ...func(payload *serverupdate.CreateUpdatePayload)) ser func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -129,46 +131,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/describe/describe_test.go b/internal/cmd/server/os-update/describe/describe_test.go index 0a859c415..32dfa4334 100644 --- a/internal/cmd/server/os-update/describe/describe_test.go +++ b/internal/cmd/server/os-update/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -133,54 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index dabf2bacf..3c9510b98 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -39,9 +39,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Disable os-update functionality for your server.`, "$ stackit server os-update disable --server-id=zzz"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/os-update/disable/disable_test.go b/internal/cmd/server/os-update/disable/disable_test.go index 566300e33..b7d28e23c 100644 --- a/internal/cmd/server/os-update/disable/disable_test.go +++ b/internal/cmd/server/os-update/disable/disable_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) @@ -29,6 +28,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -62,17 +62,23 @@ func fixtureRequest(mods ...func(request *serverupdate.ApiDisableServiceResource func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel }{ { - description: "base", - flagValues: fixtureFlagValues(), - isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.ServerId = "" + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "server id flag is missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "" }), + isValid: false, }, { description: "no values", @@ -104,46 +110,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index 2697de207..c81c27b44 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -40,9 +40,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Enable os-update functionality for your server`, "$ stackit server os-update enable --server-id=zzz"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -96,7 +96,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/os-update/enable/enable_test.go b/internal/cmd/server/os-update/enable/enable_test.go index d35251a70..4ebed0b3a 100644 --- a/internal/cmd/server/os-update/enable/enable_test.go +++ b/internal/cmd/server/os-update/enable/enable_test.go @@ -5,12 +5,11 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) @@ -29,6 +28,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -62,17 +62,23 @@ func fixtureRequest(mods ...func(request *serverupdate.ApiEnableServiceResourceR func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel }{ { - description: "base", - flagValues: fixtureFlagValues(), - isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.ServerId = "" + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "server id flag is missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "" }), + isValid: false, }, { description: "no values", @@ -104,46 +110,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index fbb5d0fa6..5ce2a5c27 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all os-updates for a server with ID "xxx" in JSON format`, "$ stackit server os-update list --server-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -101,7 +101,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/os-update/list/list_test.go b/internal/cmd/server/os-update/list/list_test.go index 078f7ca0a..541ad0567 100644 --- a/internal/cmd/server/os-update/list/list_test.go +++ b/internal/cmd/server/os-update/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +67,7 @@ func fixtureRequest(mods ...func(request *serverupdate.ApiListUpdatesRequest)) s func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -120,46 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index 63325c4da..76dd76235 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -56,10 +56,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a Server os-update Schedule with name "myschedule" and maintenance window for 14 o'clock`, `$ stackit server os-update schedule create --server-id xxx --name=myschedule --maintenance-window=14`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -117,7 +117,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/os-update/schedule/create/create_test.go b/internal/cmd/server/os-update/schedule/create/create_test.go index 2cdb00f75..c944e63e7 100644 --- a/internal/cmd/server/os-update/schedule/create/create_test.go +++ b/internal/cmd/server/os-update/schedule/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -87,6 +88,7 @@ func fixturePayload(mods ...func(payload *serverupdate.CreateUpdateSchedulePaylo func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string aclValues []string isValid bool @@ -136,46 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/schedule/delete/delete_test.go b/internal/cmd/server/os-update/schedule/delete/delete_test.go index eb005e164..99b0aaafb 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete_test.go +++ b/internal/cmd/server/os-update/schedule/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -133,54 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/schedule/describe/describe_test.go b/internal/cmd/server/os-update/schedule/describe/describe_test.go index 178585383..1f938f1de 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe_test.go +++ b/internal/cmd/server/os-update/schedule/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -133,54 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index c1c0ed606..b9721cca8 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -46,9 +46,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all os-update schedules for a server with ID "xxx" in JSON format`, "$ stackit server os-update schedule list --server-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/os-update/schedule/list/list_test.go b/internal/cmd/server/os-update/schedule/list/list_test.go index 57aa1c0dc..f39c88508 100644 --- a/internal/cmd/server/os-update/schedule/list/list_test.go +++ b/internal/cmd/server/os-update/schedule/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -66,6 +67,7 @@ func fixtureRequest(mods ...func(request *serverupdate.ApiListUpdateSchedulesReq func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -120,46 +122,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/reboot/reboot_test.go b/internal/cmd/server/reboot/reboot_test.go index cfcda6783..074ba2a84 100644 --- a/internal/cmd/server/reboot/reboot_test.go +++ b/internal/cmd/server/reboot/reboot_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/rescue/rescue_test.go b/internal/cmd/server/rescue/rescue_test.go index 8a5695fd9..d3e6e3c50 100644 --- a/internal/cmd/server/rescue/rescue_test.go +++ b/internal/cmd/server/rescue/rescue_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -145,54 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/resize/resize_test.go b/internal/cmd/server/resize/resize_test.go index ee94cfe6e..231d7c1c0 100644 --- a/internal/cmd/server/resize/resize_test.go +++ b/internal/cmd/server/resize/resize_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -144,54 +143,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index efb454e8c..5bf727bc7 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit server service-account list --server-id xxx --output-format json", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -101,7 +101,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/server/service-account/list/list_test.go b/internal/cmd/server/service-account/list/list_test.go index 9ba1d281a..d2a0c159a 100644 --- a/internal/cmd/server/service-account/list/list_test.go +++ b/internal/cmd/server/service-account/list/list_test.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -64,6 +65,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListServerServiceAccountsReque func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -149,46 +151,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/start/start_test.go b/internal/cmd/server/start/start_test.go index 2776c77e7..f028d85d9 100644 --- a/internal/cmd/server/start/start_test.go +++ b/internal/cmd/server/start/start_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -128,54 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/stop/stop_test.go b/internal/cmd/server/stop/stop_test.go index bbaefddba..7aba2f968 100644 --- a/internal/cmd/server/stop/stop_test.go +++ b/internal/cmd/server/stop/stop_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -128,54 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/unrescue/unrescue_test.go b/internal/cmd/server/unrescue/unrescue_test.go index 1f2d95712..8161f03d4 100644 --- a/internal/cmd/server/unrescue/unrescue_test.go +++ b/internal/cmd/server/unrescue/unrescue_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -128,54 +127,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index c48eceb5f..6f25321db 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -42,9 +42,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all volumes for a server with ID "xxx" in JSON format`, "$ stackit server volumes list --server-id xxx --output-format json"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/server/volume/list/list_test.go b/internal/cmd/server/volume/list/list_test.go index a337fc247..6be36d7d6 100644 --- a/internal/cmd/server/volume/list/list_test.go +++ b/internal/cmd/server/volume/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -60,6 +61,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListAttachedVolumesRequest)) i func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -121,46 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index 98389133c..73618ca1f 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -39,9 +39,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a service account with name "my-service-account"`, "$ stackit service-account create --name my-service-account"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -87,7 +87,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/service-account/create/create_test.go b/internal/cmd/service-account/create/create_test.go index 1c3fac895..2f95584f8 100644 --- a/internal/cmd/service-account/create/create_test.go +++ b/internal/cmd/service-account/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *serviceaccount.ApiCreateServiceAccount func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -117,46 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/delete/delete_test.go b/internal/cmd/service-account/delete/delete_test.go index 9a0dc74ef..7dbcc6dfd 100644 --- a/internal/cmd/service-account/delete/delete_test.go +++ b/internal/cmd/service-account/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -126,54 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/key/create/create.go b/internal/cmd/service-account/key/create/create.go index e25d3fbbc..e23d11cc8 100644 --- a/internal/cmd/service-account/key/create/create.go +++ b/internal/cmd/service-account/key/create/create.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a key for the service account with email "my-service-account-1234567@sa.stackit.cloud" and provide the public key in a .pem file"`, `$ stackit service-account key create --email my-service-account-1234567@sa.stackit.cloud --public-key @./public.pem`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -111,7 +111,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/service-account/key/create/create_test.go b/internal/cmd/service-account/key/create/create_test.go index 8f07ed01f..3ee9c7739 100644 --- a/internal/cmd/service-account/key/create/create_test.go +++ b/internal/cmd/service-account/key/create/create_test.go @@ -5,9 +5,8 @@ import ( "testing" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -65,6 +64,7 @@ func fixtureRequest(mods ...func(request *serviceaccount.ApiCreateServiceAccount func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -142,46 +142,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/key/delete/delete_test.go b/internal/cmd/service-account/key/delete/delete_test.go index 9e811b0a6..7f4ade070 100644 --- a/internal/cmd/service-account/key/delete/delete_test.go +++ b/internal/cmd/service-account/key/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -149,54 +148,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/key/describe/describe_test.go b/internal/cmd/service-account/key/describe/describe_test.go index 7111fa0a6..38a7af958 100644 --- a/internal/cmd/service-account/key/describe/describe_test.go +++ b/internal/cmd/service-account/key/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -149,54 +150,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index e090de0a4..bd7184caa 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -47,9 +47,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 keys belonging to the service account with email "my-service-account-1234567@sa.stackit.cloud"`, "$ stackit service-account key list --email my-service-account-1234567@sa.stackit.cloud --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/service-account/key/list/list_test.go b/internal/cmd/service-account/key/list/list_test.go index ebde67439..845c5cae9 100644 --- a/internal/cmd/service-account/key/list/list_test.go +++ b/internal/cmd/service-account/key/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *serviceaccount.ApiListServiceAccountKe func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -124,48 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/key/update/update_test.go b/internal/cmd/service-account/key/update/update_test.go index 84dde9c6d..2d2c66bfa 100644 --- a/internal/cmd/service-account/key/update/update_test.go +++ b/internal/cmd/service-account/key/update/update_test.go @@ -5,9 +5,8 @@ import ( "testing" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -196,54 +195,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index 49ea386cc..7dcd16322 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -39,9 +39,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List all service accounts`, "$ stackit service-account list"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -86,7 +86,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/service-account/list/list_test.go b/internal/cmd/service-account/list/list_test.go index 161f050e2..f6bcc47ec 100644 --- a/internal/cmd/service-account/list/list_test.go +++ b/internal/cmd/service-account/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) @@ -60,6 +60,7 @@ func fixtureRequest(mods ...func(request *serviceaccount.ApiListServiceAccountsR func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -114,48 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index 817e1dc27..d01da3a99 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create an access token for the service account with email "my-service-account-1234567@sa.stackit.cloud" with a time to live of 10 days`, "$ stackit service-account token create --email my-service-account-1234567@sa.stackit.cloud --ttl-days 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -93,7 +93,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/service-account/token/create/create_test.go b/internal/cmd/service-account/token/create/create_test.go index ffa760ce5..a7935e1a7 100644 --- a/internal/cmd/service-account/token/create/create_test.go +++ b/internal/cmd/service-account/token/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -67,6 +68,7 @@ func fixtureRequest(mods ...func(request *serviceaccount.ApiCreateAccessTokenReq func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -121,46 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/token/list/list.go b/internal/cmd/service-account/token/list/list.go index c302dec8f..7e8f6e12d 100644 --- a/internal/cmd/service-account/token/list/list.go +++ b/internal/cmd/service-account/token/list/list.go @@ -52,9 +52,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 access tokens of the service account with email "my-service-account-1234567@sa.stackit.cloud"`, "$ stackit service-account token list --email my-service-account-1234567@sa.stackit.cloud --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -98,7 +98,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/service-account/token/list/list_test.go b/internal/cmd/service-account/token/list/list_test.go index e03ee657f..c4cbcf9df 100644 --- a/internal/cmd/service-account/token/list/list_test.go +++ b/internal/cmd/service-account/token/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *serviceaccount.ApiListAccessTokensRequ func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -124,48 +125,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/service-account/token/revoke/revoke_test.go b/internal/cmd/service-account/token/revoke/revoke_test.go index 17387aceb..cebb61897 100644 --- a/internal/cmd/service-account/token/revoke/revoke_test.go +++ b/internal/cmd/service-account/token/revoke/revoke_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -149,54 +148,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index 8fba70614..b8bb55557 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -6,6 +6,8 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -233,62 +235,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/cluster/delete/delete_test.go b/internal/cmd/ske/cluster/delete/delete_test.go index 2835c477b..86cef5d06 100644 --- a/internal/cmd/ske/cluster/delete/delete_test.go +++ b/internal/cmd/ske/cluster/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/cluster/describe/describe_test.go b/internal/cmd/ske/cluster/describe/describe_test.go index a5f7f766e..da85e7af3 100644 --- a/internal/cmd/ske/cluster/describe/describe_test.go +++ b/internal/cmd/ske/cluster/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -131,54 +132,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index b03f0d42c..e7fcbe234 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Generate a payload with values of a cluster, and preview it in the terminal`, `$ stackit ske cluster generate-payload --cluster-name my-cluster`), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -102,7 +102,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(filePathFlag, "f", "", "If set, writes the payload to the given file. If unset, writes the payload to the standard output") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) clusterName := flags.FlagToStringPointer(p, cmd, clusterNameFlag) diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go index 856db970d..415f83359 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -70,6 +71,7 @@ func fixtureRequest(mods ...func(request *ske.ApiGetClusterRequest)) ske.ApiGetC func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -133,54 +135,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - err = cmd.ValidateFlagGroups() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index d2a3d4d01..33e93389a 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -48,9 +48,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List up to 10 SKE clusters`, "$ stackit ske cluster list --limit 10"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -109,7 +109,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/ske/cluster/list/list_test.go b/internal/cmd/ske/cluster/list/list_test.go index 4f0543544..a2d8f4d44 100644 --- a/internal/cmd/ske/cluster/list/list_test.go +++ b/internal/cmd/ske/cluster/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/ske" ) @@ -64,6 +64,7 @@ func fixtureRequest(mods ...func(request *ske.ApiListClustersRequest)) ske.ApiLi func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -118,48 +119,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index dcf82f207..8285af7e1 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -9,6 +9,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -221,54 +222,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go index b8d40624c..ee40fc120 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go index 0e2f99fa3..063269174 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -130,54 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index 6becf645a..c1804fc9a 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -33,9 +33,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Get details regarding SKE functionality on your project`, "$ stackit ske describe"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/ske/describe/describe_test.go b/internal/cmd/ske/describe/describe_test.go index 4fb7cbb64..3a0283a6c 100644 --- a/internal/cmd/ske/describe/describe_test.go +++ b/internal/cmd/ske/describe/describe_test.go @@ -8,12 +8,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" ) type testCtxKey struct{} @@ -59,6 +59,7 @@ func fixtureRequest(mods ...func(request *serviceenablement.ApiGetServiceStatusR func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -99,46 +100,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index 33647becf..f9eb1ac3b 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -35,9 +35,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Disable SKE functionality for your project, deleting all associated clusters`, "$ stackit ske disable"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -91,7 +91,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/ske/disable/disable_test.go b/internal/cmd/ske/disable/disable_test.go index b377dc366..978e383ed 100644 --- a/internal/cmd/ske/disable/disable_test.go +++ b/internal/cmd/ske/disable/disable_test.go @@ -5,13 +5,12 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" ) @@ -58,6 +57,7 @@ func fixtureRequest(mods ...func(request *serviceenablement.ApiDisableServiceReg func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -98,46 +98,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 0567a9cab..9d9783dd2 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -35,9 +35,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Enable SKE functionality for your project`, "$ stackit ske enable"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -91,7 +91,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/ske/enable/enable_test.go b/internal/cmd/ske/enable/enable_test.go index d46ec2d07..add7b850b 100644 --- a/internal/cmd/ske/enable/enable_test.go +++ b/internal/cmd/ske/enable/enable_test.go @@ -5,13 +5,12 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" ) @@ -58,6 +57,7 @@ func fixtureRequest(mods ...func(request *serviceenablement.ApiEnableServiceRegi func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -98,46 +98,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index 513fae126..5c7b25e58 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/ske" ) @@ -207,54 +208,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index ed8ed322b..5da30e803 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -57,9 +57,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List SKE options regarding Kubernetes versions and machine images`, "$ stackit ske options --kubernetes-versions --machine-images"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -92,7 +92,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(volumeTypesFlag, false, "Lists supported volume types") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) availabilityZones := flags.FlagToBoolValue(p, cmd, availabilityZonesFlag) kubernetesVersions := flags.FlagToBoolValue(p, cmd, kubernetesVersionsFlag) diff --git a/internal/cmd/ske/options/options_test.go b/internal/cmd/ske/options/options_test.go index d2317d1e5..1627f3709 100644 --- a/internal/cmd/ske/options/options_test.go +++ b/internal/cmd/ske/options/options_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -68,6 +69,7 @@ func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -127,46 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index 789c16585..4245716e9 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -56,9 +56,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a backup with labels`, "$ stackit volume backup create --source-id xxx --source-type volume --labels key1=value1,key2=value2"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -137,7 +137,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/volume/backup/create/create_test.go b/internal/cmd/volume/backup/create/create_test.go index 3c4980cc6..2132d89f8 100644 --- a/internal/cmd/volume/backup/create/create_test.go +++ b/internal/cmd/volume/backup/create/create_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -84,6 +85,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateBackupRequest)) iaas.Api func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -150,46 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/backup/delete/delete_test.go b/internal/cmd/volume/backup/delete/delete_test.go index 8425e9c98..a0146e406 100644 --- a/internal/cmd/volume/backup/delete/delete_test.go +++ b/internal/cmd/volume/backup/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -110,46 +109,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/backup/describe/describe_test.go b/internal/cmd/volume/backup/describe/describe_test.go index 3dcac1e56..0ff77ca24 100644 --- a/internal/cmd/volume/backup/describe/describe_test.go +++ b/internal/cmd/volume/backup/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -110,46 +111,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index af7edc33d..82580a440 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -51,9 +51,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List backups with specific labels`, "$ stackit volume backup list --label-selector key1=value1,key2=value2"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -99,7 +99,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter backups by labels") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/volume/backup/list/list_test.go b/internal/cmd/volume/backup/list/list_test.go index 7a24783c2..f3616ef3c 100644 --- a/internal/cmd/volume/backup/list/list_test.go +++ b/internal/cmd/volume/backup/list/list_test.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -63,6 +63,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListBackupsRequest)) iaas.ApiL func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -117,48 +118,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - cmd := &cobra.Command{} - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - configureFlags(cmd) - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - p := print.NewPrinter() - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/backup/restore/restore_test.go b/internal/cmd/volume/backup/restore/restore_test.go index 217300720..8532a05ee 100644 --- a/internal/cmd/volume/backup/restore/restore_test.go +++ b/internal/cmd/volume/backup/restore/restore_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -110,46 +109,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/backup/update/update_test.go b/internal/cmd/volume/backup/update/update_test.go index 21aa21c1e..85faf0764 100644 --- a/internal/cmd/volume/backup/update/update_test.go +++ b/internal/cmd/volume/backup/update/update_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -115,46 +114,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index df781e7c0..f5024261a 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -68,9 +68,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit volume create --availability-zone eu01-1 --performance-class storage_premium_perf1 --size 64`, ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -135,7 +135,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &cliErr.ProjectIdError{} diff --git a/internal/cmd/volume/create/create_test.go b/internal/cmd/volume/create/create_test.go index 716daaad2..35f163e21 100644 --- a/internal/cmd/volume/create/create_test.go +++ b/internal/cmd/volume/create/create_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -109,6 +110,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateVolumePayload)) iaas.Create func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -202,46 +204,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/delete/delete_test.go b/internal/cmd/volume/delete/delete_test.go index 58d10c79c..db5545312 100644 --- a/internal/cmd/volume/delete/delete_test.go +++ b/internal/cmd/volume/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -138,54 +137,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/describe/describe_test.go b/internal/cmd/volume/describe/describe_test.go index aa0a0754f..1c4e2b907 100644 --- a/internal/cmd/volume/describe/describe_test.go +++ b/internal/cmd/volume/describe/describe_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -137,54 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index 1bf196c95..d1c7b884f 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -54,9 +54,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit volume list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -102,7 +102,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/volume/list/list_test.go b/internal/cmd/volume/list/list_test.go index daa736ff1..cb54d2e1f 100644 --- a/internal/cmd/volume/list/list_test.go +++ b/internal/cmd/volume/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListVolumesRequest)) iaas.ApiL func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -131,46 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/performance-class/describe/describe_test.go b/internal/cmd/volume/performance-class/describe/describe_test.go index b5bf0cf3c..737335164 100644 --- a/internal/cmd/volume/performance-class/describe/describe_test.go +++ b/internal/cmd/volume/performance-class/describe/describe_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -131,54 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index e32ed2c33..0c8a5de64 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -55,9 +55,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { "$ stackit volume performance-class list --limit 10", ), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -103,7 +103,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/volume/performance-class/list/list_test.go b/internal/cmd/volume/performance-class/list/list_test.go index 6e877390d..4a36b5333 100644 --- a/internal/cmd/volume/performance-class/list/list_test.go +++ b/internal/cmd/volume/performance-class/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListVolumePerformanceClassesRe func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -131,46 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index 38e92650f..1146ccaba 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -52,9 +52,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `Create a snapshot from a volume with ID "xxx" and labels`, "$ stackit volume snapshot create --volume-id xxx --labels key1=value1,key2=value2"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -126,7 +126,7 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/volume/snapshot/create/create_test.go b/internal/cmd/volume/snapshot/create/create_test.go index 08c5c0baa..00111c28f 100644 --- a/internal/cmd/volume/snapshot/create/create_test.go +++ b/internal/cmd/volume/snapshot/create/create_test.go @@ -7,9 +7,8 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) @@ -75,6 +74,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateSnapshotRequest)) iaas.A func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -134,46 +134,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/snapshot/delete/delete_test.go b/internal/cmd/volume/snapshot/delete/delete_test.go index bf1f87d15..f97165703 100644 --- a/internal/cmd/volume/snapshot/delete/delete_test.go +++ b/internal/cmd/volume/snapshot/delete/delete_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -124,46 +123,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/snapshot/describe/describe_test.go b/internal/cmd/volume/snapshot/describe/describe_test.go index 5d501758f..7da9d09a4 100644 --- a/internal/cmd/volume/snapshot/describe/describe_test.go +++ b/internal/cmd/volume/snapshot/describe/describe_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -125,46 +126,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go index 2b38252a5..2ef8c9d4d 100644 --- a/internal/cmd/volume/snapshot/list/list.go +++ b/internal/cmd/volume/snapshot/list/list.go @@ -49,9 +49,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `List snapshots filtered by label`, "$ stackit volume snapshot list --label-selector key1=value1"), ), - RunE: func(cmd *cobra.Command, _ []string) error { + RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() - model, err := parseInput(params.Printer, cmd) + model, err := parseInput(params.Printer, cmd, args) if err != nil { return err } @@ -100,7 +100,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter snapshots by labels") } -func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} diff --git a/internal/cmd/volume/snapshot/list/list_test.go b/internal/cmd/volume/snapshot/list/list_test.go index e1f68f1b1..c9facab11 100644 --- a/internal/cmd/volume/snapshot/list/list_test.go +++ b/internal/cmd/volume/snapshot/list/list_test.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -62,6 +63,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiListSnapshotsRequest)) iaas.Ap func TestParseInput(t *testing.T) { tests := []struct { description string + argValues []string flagValues map[string]string isValid bool expectedModel *inputModel @@ -128,38 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - model, err := parseInput(p, cmd) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/cmd/volume/snapshot/update/update_test.go b/internal/cmd/volume/snapshot/update/update_test.go index cb4af61fc..b96da76f1 100644 --- a/internal/cmd/volume/snapshot/update/update_test.go +++ b/internal/cmd/volume/snapshot/update/update_test.go @@ -4,9 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -167,46 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing input: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) }) } } diff --git a/internal/pkg/testutils/testutils.go b/internal/pkg/testutils/testutils.go new file mode 100644 index 000000000..8f970fd0a --- /dev/null +++ b/internal/pkg/testutils/testutils.go @@ -0,0 +1,91 @@ +package testutils + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" +) + +// TestParseInput centralizes the logic to test a combination of inputs (arguments, flags) for a cobra command +func TestParseInput[T any](t *testing.T, cmdFactory func(*params.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, isValid bool) { + TestParseInputWithAdditionalFlags(t, cmdFactory, parseInputFunc, expectedModel, argValues, flagValues, map[string][]string{}, isValid) +} + +// TestParseInputWithAdditionalFlags centralizes the logic to test a combination of inputs (arguments, flags) for a cobra command. +// It allows to pass multiple instances of a single flag to the cobra command using the `additionalFlagValues` parameter. +func TestParseInputWithAdditionalFlags[T any](t *testing.T, cmdFactory func(*params.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, additionalFlagValues map[string][]string, isValid bool) { + p := print.NewPrinter() + cmd := cmdFactory(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + // set regular flag values + for flag, value := range flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + // set additional flag values + for flag, values := range additionalFlagValues { + for _, value := range values { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + } + + err = cmd.ValidateArgs(argValues) + if err != nil { + if !isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + err = cmd.ValidateFlagGroups() + if err != nil { + if !isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInputFunc(p, cmd, argValues) + if err != nil { + if !isValid { + return + } + t.Fatalf("error parsing input: %v", err) + } + + if !isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } +} From 99f4d2d6bf245a3ec1c6f9ab625601a7e64164bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 09:20:02 +0200 Subject: [PATCH 175/422] chore(deps): bump renovatebot/github-action from 43.0.17 to 43.0.18 (#1034) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 211759137..0ebc69e31 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.17 + uses: renovatebot/github-action@v43.0.18 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 8e08cf49895e2e5da339ab9d7b99407dbd7dd261 Mon Sep 17 00:00:00 2001 From: JanStern <65732422+JanStern@users.noreply.github.com> Date: Wed, 22 Oct 2025 17:33:19 +0200 Subject: [PATCH 176/422] feat(kms): Add KMS under beta (#935) --- docs/stackit_beta.md | 1 + docs/stackit_beta_kms.md | 37 ++ docs/stackit_beta_kms_key.md | 39 ++ docs/stackit_beta_kms_key_create.md | 62 +++ docs/stackit_beta_kms_key_delete.md | 41 ++ docs/stackit_beta_kms_key_import.md | 46 +++ docs/stackit_beta_kms_key_list.md | 44 +++ docs/stackit_beta_kms_key_restore.md | 41 ++ docs/stackit_beta_kms_key_rotate.md | 41 ++ docs/stackit_beta_kms_keyring.md | 36 ++ docs/stackit_beta_kms_keyring_create.md | 48 +++ docs/stackit_beta_kms_keyring_delete.md | 40 ++ docs/stackit_beta_kms_keyring_list.md | 43 +++ docs/stackit_beta_kms_version.md | 38 ++ docs/stackit_beta_kms_version_destroy.md | 42 ++ docs/stackit_beta_kms_version_disable.md | 42 ++ docs/stackit_beta_kms_version_enable.md | 42 ++ docs/stackit_beta_kms_version_list.md | 45 +++ docs/stackit_beta_kms_version_restore.md | 42 ++ docs/stackit_beta_kms_wrapping-key.md | 36 ++ docs/stackit_beta_kms_wrapping-key_create.md | 49 +++ docs/stackit_beta_kms_wrapping-key_delete.md | 41 ++ docs/stackit_beta_kms_wrapping-key_list.md | 44 +++ ...ckit_beta_sqlserverflex_instance_create.md | 2 +- docs/stackit_config_set.md | 1 + docs/stackit_config_unset.md | 1 + go.mod | 1 + go.sum | 2 + internal/cmd/beta/beta.go | 2 + internal/cmd/beta/kms/key/create/create.go | 218 +++++++++++ .../cmd/beta/kms/key/create/create_test.go | 327 ++++++++++++++++ internal/cmd/beta/kms/key/delete/delete.go | 149 +++++++ .../cmd/beta/kms/key/delete/delete_test.go | 292 ++++++++++++++ .../cmd/beta/kms/key/importKey/importKey.go | 181 +++++++++ .../beta/kms/key/importKey/importKey_test.go | 362 ++++++++++++++++++ internal/cmd/beta/kms/key/key.go | 36 ++ internal/cmd/beta/kms/key/list/list.go | 148 +++++++ internal/cmd/beta/kms/key/list/list_test.go | 258 +++++++++++++ internal/cmd/beta/kms/key/restore/restore.go | 148 +++++++ .../cmd/beta/kms/key/restore/restore_test.go | 292 ++++++++++++++ internal/cmd/beta/kms/key/rotate/rotate.go | 144 +++++++ .../cmd/beta/kms/key/rotate/rotate_test.go | 292 ++++++++++++++ .../cmd/beta/kms/keyring/create/create.go | 182 +++++++++ .../beta/kms/keyring/create/create_test.go | 249 ++++++++++++ .../cmd/beta/kms/keyring/delete/delete.go | 105 +++++ .../beta/kms/keyring/delete/delete_test.go | 212 ++++++++++ internal/cmd/beta/kms/keyring/keyring.go | 30 ++ internal/cmd/beta/kms/keyring/list/list.go | 133 +++++++ .../cmd/beta/kms/keyring/list/list_test.go | 229 +++++++++++ internal/cmd/beta/kms/kms.go | 32 ++ .../cmd/beta/kms/version/destroy/destroy.go | 147 +++++++ .../beta/kms/version/destroy/destroy_test.go | 319 +++++++++++++++ .../cmd/beta/kms/version/disable/disable.go | 149 +++++++ .../beta/kms/version/disable/disable_test.go | 320 ++++++++++++++++ .../cmd/beta/kms/version/enable/enable.go | 160 ++++++++ .../beta/kms/version/enable/enable_test.go | 320 ++++++++++++++++ internal/cmd/beta/kms/version/list/list.go | 150 ++++++++ .../cmd/beta/kms/version/list/list_test.go | 282 ++++++++++++++ .../cmd/beta/kms/version/restore/restore.go | 145 +++++++ .../beta/kms/version/restore/restore_test.go | 320 ++++++++++++++++ internal/cmd/beta/kms/version/version.go | 34 ++ .../cmd/beta/kms/wrappingkey/create/create.go | 204 ++++++++++ .../kms/wrappingkey/create/create_test.go | 318 +++++++++++++++ .../cmd/beta/kms/wrappingkey/delete/delete.go | 118 ++++++ .../kms/wrappingkey/delete/delete_test.go | 241 ++++++++++++ .../cmd/beta/kms/wrappingkey/list/list.go | 149 +++++++ .../beta/kms/wrappingkey/list/list_test.go | 250 ++++++++++++ .../cmd/beta/kms/wrappingkey/wrappingkey.go | 30 ++ .../sqlserverflex/instance/create/create.go | 2 +- internal/cmd/config/set/set.go | 4 + internal/cmd/config/unset/unset.go | 7 + internal/cmd/config/unset/unset_test.go | 13 + internal/pkg/config/config.go | 3 + internal/pkg/services/kms/client/client.go | 45 +++ internal/pkg/services/kms/utils/utils.go | 67 ++++ internal/pkg/services/kms/utils/utils_test.go | 257 +++++++++++++ 76 files changed, 9020 insertions(+), 2 deletions(-) create mode 100644 docs/stackit_beta_kms.md create mode 100644 docs/stackit_beta_kms_key.md create mode 100644 docs/stackit_beta_kms_key_create.md create mode 100644 docs/stackit_beta_kms_key_delete.md create mode 100644 docs/stackit_beta_kms_key_import.md create mode 100644 docs/stackit_beta_kms_key_list.md create mode 100644 docs/stackit_beta_kms_key_restore.md create mode 100644 docs/stackit_beta_kms_key_rotate.md create mode 100644 docs/stackit_beta_kms_keyring.md create mode 100644 docs/stackit_beta_kms_keyring_create.md create mode 100644 docs/stackit_beta_kms_keyring_delete.md create mode 100644 docs/stackit_beta_kms_keyring_list.md create mode 100644 docs/stackit_beta_kms_version.md create mode 100644 docs/stackit_beta_kms_version_destroy.md create mode 100644 docs/stackit_beta_kms_version_disable.md create mode 100644 docs/stackit_beta_kms_version_enable.md create mode 100644 docs/stackit_beta_kms_version_list.md create mode 100644 docs/stackit_beta_kms_version_restore.md create mode 100644 docs/stackit_beta_kms_wrapping-key.md create mode 100644 docs/stackit_beta_kms_wrapping-key_create.md create mode 100644 docs/stackit_beta_kms_wrapping-key_delete.md create mode 100644 docs/stackit_beta_kms_wrapping-key_list.md create mode 100644 internal/cmd/beta/kms/key/create/create.go create mode 100644 internal/cmd/beta/kms/key/create/create_test.go create mode 100644 internal/cmd/beta/kms/key/delete/delete.go create mode 100644 internal/cmd/beta/kms/key/delete/delete_test.go create mode 100644 internal/cmd/beta/kms/key/importKey/importKey.go create mode 100644 internal/cmd/beta/kms/key/importKey/importKey_test.go create mode 100644 internal/cmd/beta/kms/key/key.go create mode 100644 internal/cmd/beta/kms/key/list/list.go create mode 100644 internal/cmd/beta/kms/key/list/list_test.go create mode 100644 internal/cmd/beta/kms/key/restore/restore.go create mode 100644 internal/cmd/beta/kms/key/restore/restore_test.go create mode 100644 internal/cmd/beta/kms/key/rotate/rotate.go create mode 100644 internal/cmd/beta/kms/key/rotate/rotate_test.go create mode 100644 internal/cmd/beta/kms/keyring/create/create.go create mode 100644 internal/cmd/beta/kms/keyring/create/create_test.go create mode 100644 internal/cmd/beta/kms/keyring/delete/delete.go create mode 100644 internal/cmd/beta/kms/keyring/delete/delete_test.go create mode 100644 internal/cmd/beta/kms/keyring/keyring.go create mode 100644 internal/cmd/beta/kms/keyring/list/list.go create mode 100644 internal/cmd/beta/kms/keyring/list/list_test.go create mode 100644 internal/cmd/beta/kms/kms.go create mode 100644 internal/cmd/beta/kms/version/destroy/destroy.go create mode 100644 internal/cmd/beta/kms/version/destroy/destroy_test.go create mode 100644 internal/cmd/beta/kms/version/disable/disable.go create mode 100644 internal/cmd/beta/kms/version/disable/disable_test.go create mode 100644 internal/cmd/beta/kms/version/enable/enable.go create mode 100644 internal/cmd/beta/kms/version/enable/enable_test.go create mode 100644 internal/cmd/beta/kms/version/list/list.go create mode 100644 internal/cmd/beta/kms/version/list/list_test.go create mode 100644 internal/cmd/beta/kms/version/restore/restore.go create mode 100644 internal/cmd/beta/kms/version/restore/restore_test.go create mode 100644 internal/cmd/beta/kms/version/version.go create mode 100644 internal/cmd/beta/kms/wrappingkey/create/create.go create mode 100644 internal/cmd/beta/kms/wrappingkey/create/create_test.go create mode 100644 internal/cmd/beta/kms/wrappingkey/delete/delete.go create mode 100644 internal/cmd/beta/kms/wrappingkey/delete/delete_test.go create mode 100644 internal/cmd/beta/kms/wrappingkey/list/list.go create mode 100644 internal/cmd/beta/kms/wrappingkey/list/list_test.go create mode 100644 internal/cmd/beta/kms/wrappingkey/wrappingkey.go create mode 100644 internal/pkg/services/kms/client/client.go create mode 100644 internal/pkg/services/kms/utils/utils.go create mode 100644 internal/pkg/services/kms/utils/utils_test.go diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index b58eb067a..23097f8ca 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -42,5 +42,6 @@ stackit beta [flags] * [stackit](./stackit.md) - Manage STACKIT resources using the command line * [stackit beta alb](./stackit_beta_alb.md) - Manages application loadbalancers +* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex diff --git a/docs/stackit_beta_kms.md b/docs/stackit_beta_kms.md new file mode 100644 index 000000000..e50cfd05a --- /dev/null +++ b/docs/stackit_beta_kms.md @@ -0,0 +1,37 @@ +## stackit beta kms + +Provides functionality for KMS + +### Synopsis + +Provides functionality for KMS. + +``` +stackit beta kms [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta kms" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings +* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions +* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys + diff --git a/docs/stackit_beta_kms_key.md b/docs/stackit_beta_kms_key.md new file mode 100644 index 000000000..631808f53 --- /dev/null +++ b/docs/stackit_beta_kms_key.md @@ -0,0 +1,39 @@ +## stackit beta kms key + +Manage KMS keys + +### Synopsis + +Provides functionality for key operations inside the KMS + +``` +stackit beta kms key [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS +* [stackit beta kms key create](./stackit_beta_kms_key_create.md) - Creates a KMS key +* [stackit beta kms key delete](./stackit_beta_kms_key_delete.md) - Deletes a KMS key +* [stackit beta kms key import](./stackit_beta_kms_key_import.md) - Import a KMS key +* [stackit beta kms key list](./stackit_beta_kms_key_list.md) - List all KMS keys +* [stackit beta kms key restore](./stackit_beta_kms_key_restore.md) - Restore a key +* [stackit beta kms key rotate](./stackit_beta_kms_key_rotate.md) - Rotate a key + diff --git a/docs/stackit_beta_kms_key_create.md b/docs/stackit_beta_kms_key_create.md new file mode 100644 index 000000000..0c3114a69 --- /dev/null +++ b/docs/stackit_beta_kms_key_create.md @@ -0,0 +1,62 @@ +## stackit beta kms key create + +Creates a KMS key + +### Synopsis + +Creates a KMS key. + +``` +stackit beta kms key create [flags] +``` + +### Examples + +``` + Create a symmetric AES key (AES-256) with the name "symm-aes-gcm" under the key ring "my-keyring-id" + $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "aes_256_gcm" --name "symm-aes-gcm" --purpose "symmetric_encrypt_decrypt" --protection "software" + + Create an asymmetric RSA encryption key (RSA-2048) + $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "prod-orders-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" + + Create a message authentication key (HMAC-SHA512) + $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "hmac_sha512" --name "api-mac-key" --purpose "message_authentication_code" --protection "software" + + Create an ECDSA P-256 key for signing & verification + $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "ecdsa_p256_sha256" --name "signing-ecdsa-p256" --purpose "asymmetric_sign_verify" --protection "software" + + Create an import-only key (versions must be imported) + $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "ext-managed-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --import-only + + Create a key and print the result as YAML + $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "yaml-output-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --output yaml +``` + +### Options + +``` + --algorithm string En-/Decryption / signing algorithm. Possible values: ["aes_256_gcm" "rsa_2048_oaep_sha256" "rsa_3072_oaep_sha256" "rsa_4096_oaep_sha256" "rsa_4096_oaep_sha512" "hmac_sha256" "hmac_sha384" "hmac_sha512" "ecdsa_p256_sha256" "ecdsa_p384_sha384" "ecdsa_p521_sha512"] + --description string Optional description of the key + -h, --help Help for "stackit beta kms key create" + --import-only States whether versions can be created or only imported + --keyring-id string ID of the KMS key ring + --name string The display name to distinguish multiple keys + --protection string The underlying system that is responsible for protecting the key material. Possible values: ["symmetric_encrypt_decrypt" "asymmetric_encrypt_decrypt" "message_authentication_code" "asymmetric_sign_verify"] + --purpose string Purpose of the key. Possible values: ["symmetric_encrypt_decrypt" "asymmetric_encrypt_decrypt" "message_authentication_code" "asymmetric_sign_verify"] +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_key_delete.md b/docs/stackit_beta_kms_key_delete.md new file mode 100644 index 000000000..1f67c4ff8 --- /dev/null +++ b/docs/stackit_beta_kms_key_delete.md @@ -0,0 +1,41 @@ +## stackit beta kms key delete + +Deletes a KMS key + +### Synopsis + +Deletes a KMS key inside a specific key ring. + +``` +stackit beta kms key delete KEY_ID [flags] +``` + +### Examples + +``` + Delete a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id" + $ stackit beta kms key delete "MY_KEY_ID" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key delete" + --keyring-id string ID of the KMS key ring where the key is stored +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_key_import.md b/docs/stackit_beta_kms_key_import.md new file mode 100644 index 000000000..efc1ba47a --- /dev/null +++ b/docs/stackit_beta_kms_key_import.md @@ -0,0 +1,46 @@ +## stackit beta kms key import + +Import a KMS key + +### Synopsis + +After encrypting the secret with the wrapping key’s public key and Base64-encoding it, import it as a new version of the specified KMS key. + +``` +stackit beta kms key import KEY_ID [flags] +``` + +### Examples + +``` + Import a new version for the given KMS key "MY_KEY_ID" from literal value + $ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "BASE64_VALUE" --wrapping-key-id "MY_WRAPPING_KEY_ID" + + Import from a file + $ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "@path/to/wrapped.key.b64" --wrapping-key-id "MY_WRAPPING_KEY_ID" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key import" + --keyring-id string ID of the KMS key ring + --wrapped-key string The wrapped key material to be imported. Base64-encoded. Pass the value directly or a file path (e.g. @path/to/wrapped.key.b64) + --wrapping-key-id string The unique id of the wrapping key the key material has been wrapped with +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_key_list.md b/docs/stackit_beta_kms_key_list.md new file mode 100644 index 000000000..766bb0a5d --- /dev/null +++ b/docs/stackit_beta_kms_key_list.md @@ -0,0 +1,44 @@ +## stackit beta kms key list + +List all KMS keys + +### Synopsis + +List all KMS keys inside a key ring. + +``` +stackit beta kms key list [flags] +``` + +### Examples + +``` + List all KMS keys for the key ring "my-keyring-id" + $ stackit beta kms key list --keyring-id "my-keyring-id" + + List all KMS keys in JSON format + $ stackit beta kms key list --keyring-id "my-keyring-id" --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key list" + --keyring-id string ID of the KMS key ring where the key is stored +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_key_restore.md b/docs/stackit_beta_kms_key_restore.md new file mode 100644 index 000000000..9abd9a85e --- /dev/null +++ b/docs/stackit_beta_kms_key_restore.md @@ -0,0 +1,41 @@ +## stackit beta kms key restore + +Restore a key + +### Synopsis + +Restores the given key from deletion. + +``` +stackit beta kms key restore KEY_ID [flags] +``` + +### Examples + +``` + Restore a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id" that was scheduled for deletion. + $ stackit beta kms key restore "MY_KEY_ID" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key restore" + --keyring-id string ID of the KMS key ring where the key is stored +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_key_rotate.md b/docs/stackit_beta_kms_key_rotate.md new file mode 100644 index 000000000..7fdbbe3c5 --- /dev/null +++ b/docs/stackit_beta_kms_key_rotate.md @@ -0,0 +1,41 @@ +## stackit beta kms key rotate + +Rotate a key + +### Synopsis + +Rotates the given key. + +``` +stackit beta kms key rotate KEY_ID [flags] +``` + +### Examples + +``` + Rotate a KMS key "MY_KEY_ID" and increase its version inside the key ring "my-keyring-id". + $ stackit beta kms key rotate "MY_KEY_ID" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key rotate" + --keyring-id string ID of the KMS key ring where the key is stored +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_keyring.md b/docs/stackit_beta_kms_keyring.md new file mode 100644 index 000000000..6e65f3a47 --- /dev/null +++ b/docs/stackit_beta_kms_keyring.md @@ -0,0 +1,36 @@ +## stackit beta kms keyring + +Manage KMS key rings + +### Synopsis + +Provides functionality for key ring operations inside the KMS + +``` +stackit beta kms keyring [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta kms keyring" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS +* [stackit beta kms keyring create](./stackit_beta_kms_keyring_create.md) - Creates a KMS key ring +* [stackit beta kms keyring delete](./stackit_beta_kms_keyring_delete.md) - Deletes a KMS key ring +* [stackit beta kms keyring list](./stackit_beta_kms_keyring_list.md) - Lists all KMS key rings + diff --git a/docs/stackit_beta_kms_keyring_create.md b/docs/stackit_beta_kms_keyring_create.md new file mode 100644 index 000000000..d02e6e13e --- /dev/null +++ b/docs/stackit_beta_kms_keyring_create.md @@ -0,0 +1,48 @@ +## stackit beta kms keyring create + +Creates a KMS key ring + +### Synopsis + +Creates a KMS key ring. + +``` +stackit beta kms keyring create [flags] +``` + +### Examples + +``` + Create a KMS key ring with name "my-keyring" + $ stackit beta kms keyring create --name my-keyring + + Create a KMS key ring with a description + $ stackit beta kms keyring create --name my-keyring --description my-description + + Create a KMS key ring and print the result as YAML + $ stackit beta kms keyring create --name my-keyring -o yaml +``` + +### Options + +``` + --description string Optional description of the key ring + -h, --help Help for "stackit beta kms keyring create" + --name string Name of the KMS key ring +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings + diff --git a/docs/stackit_beta_kms_keyring_delete.md b/docs/stackit_beta_kms_keyring_delete.md new file mode 100644 index 000000000..d5230f353 --- /dev/null +++ b/docs/stackit_beta_kms_keyring_delete.md @@ -0,0 +1,40 @@ +## stackit beta kms keyring delete + +Deletes a KMS key ring + +### Synopsis + +Deletes a KMS key ring. + +``` +stackit beta kms keyring delete KEYRING-ID [flags] +``` + +### Examples + +``` + Delete a KMS key ring with ID "MY_KEYRING_ID" + $ stackit beta kms keyring delete "MY_KEYRING_ID" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms keyring delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings + diff --git a/docs/stackit_beta_kms_keyring_list.md b/docs/stackit_beta_kms_keyring_list.md new file mode 100644 index 000000000..c82dae950 --- /dev/null +++ b/docs/stackit_beta_kms_keyring_list.md @@ -0,0 +1,43 @@ +## stackit beta kms keyring list + +Lists all KMS key rings + +### Synopsis + +Lists all KMS key rings. + +``` +stackit beta kms keyring list [flags] +``` + +### Examples + +``` + List all KMS key rings + $ stackit beta kms keyring list + + List all KMS key rings in JSON format + $ stackit beta kms keyring list --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta kms keyring list" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings + diff --git a/docs/stackit_beta_kms_version.md b/docs/stackit_beta_kms_version.md new file mode 100644 index 000000000..baf9c5ecb --- /dev/null +++ b/docs/stackit_beta_kms_version.md @@ -0,0 +1,38 @@ +## stackit beta kms version + +Manage KMS key versions + +### Synopsis + +Provides functionality for key version operations inside the KMS + +``` +stackit beta kms version [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta kms version" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS +* [stackit beta kms version destroy](./stackit_beta_kms_version_destroy.md) - Destroy a key version +* [stackit beta kms version disable](./stackit_beta_kms_version_disable.md) - Disable a key version +* [stackit beta kms version enable](./stackit_beta_kms_version_enable.md) - Enable a key version +* [stackit beta kms version list](./stackit_beta_kms_version_list.md) - List all key versions +* [stackit beta kms version restore](./stackit_beta_kms_version_restore.md) - Restore a key version + diff --git a/docs/stackit_beta_kms_version_destroy.md b/docs/stackit_beta_kms_version_destroy.md new file mode 100644 index 000000000..8a189ecf2 --- /dev/null +++ b/docs/stackit_beta_kms_version_destroy.md @@ -0,0 +1,42 @@ +## stackit beta kms version destroy + +Destroy a key version + +### Synopsis + +Removes the key material of a version. + +``` +stackit beta kms version destroy VERSION_NUMBER [flags] +``` + +### Examples + +``` + Destroy key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" + $ stackit beta kms version destroy 42 --key-id "my-key-id" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms version destroy" + --key-id string ID of the key + --keyring-id string ID of the KMS key ring +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions + diff --git a/docs/stackit_beta_kms_version_disable.md b/docs/stackit_beta_kms_version_disable.md new file mode 100644 index 000000000..c2e13a87e --- /dev/null +++ b/docs/stackit_beta_kms_version_disable.md @@ -0,0 +1,42 @@ +## stackit beta kms version disable + +Disable a key version + +### Synopsis + +Disable the given key version. + +``` +stackit beta kms version disable VERSION_NUMBER [flags] +``` + +### Examples + +``` + Disable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" + $ stackit beta kms version disable 42 --key-id "my-key-id" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms version disable" + --key-id string ID of the key + --keyring-id string ID of the KMS key ring +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions + diff --git a/docs/stackit_beta_kms_version_enable.md b/docs/stackit_beta_kms_version_enable.md new file mode 100644 index 000000000..46d23bec0 --- /dev/null +++ b/docs/stackit_beta_kms_version_enable.md @@ -0,0 +1,42 @@ +## stackit beta kms version enable + +Enable a key version + +### Synopsis + +Enable the given key version. + +``` +stackit beta kms version enable VERSION_NUMBER [flags] +``` + +### Examples + +``` + Enable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" + $ stackit beta kms version enable 42 --key-id "my-key-id" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms version enable" + --key-id string ID of the key + --keyring-id string ID of the KMS key ring +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions + diff --git a/docs/stackit_beta_kms_version_list.md b/docs/stackit_beta_kms_version_list.md new file mode 100644 index 000000000..bd4a96747 --- /dev/null +++ b/docs/stackit_beta_kms_version_list.md @@ -0,0 +1,45 @@ +## stackit beta kms version list + +List all key versions + +### Synopsis + +List all versions of a given key. + +``` +stackit beta kms version list [flags] +``` + +### Examples + +``` + List all key versions for the key "my-key-id" inside the key ring "my-keyring-id" + $ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" + + List all key versions in JSON format + $ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" -o json +``` + +### Options + +``` + -h, --help Help for "stackit beta kms version list" + --key-id string ID of the key + --keyring-id string ID of the KMS key ring +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions + diff --git a/docs/stackit_beta_kms_version_restore.md b/docs/stackit_beta_kms_version_restore.md new file mode 100644 index 000000000..1562d5fa2 --- /dev/null +++ b/docs/stackit_beta_kms_version_restore.md @@ -0,0 +1,42 @@ +## stackit beta kms version restore + +Restore a key version + +### Synopsis + +Restores the specified version of a key. + +``` +stackit beta kms version restore VERSION_NUMBER [flags] +``` + +### Examples + +``` + Restore key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" + $ stackit beta kms version restore 42 --key-id "my-key-id" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms version restore" + --key-id string ID of the key + --keyring-id string ID of the KMS key ring +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions + diff --git a/docs/stackit_beta_kms_wrapping-key.md b/docs/stackit_beta_kms_wrapping-key.md new file mode 100644 index 000000000..c10cb4946 --- /dev/null +++ b/docs/stackit_beta_kms_wrapping-key.md @@ -0,0 +1,36 @@ +## stackit beta kms wrapping-key + +Manage KMS wrapping keys + +### Synopsis + +Provides functionality for wrapping key operations inside the KMS + +``` +stackit beta kms wrapping-key [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta kms wrapping-key" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS +* [stackit beta kms wrapping-key create](./stackit_beta_kms_wrapping-key_create.md) - Creates a KMS wrapping key +* [stackit beta kms wrapping-key delete](./stackit_beta_kms_wrapping-key_delete.md) - Deletes a KMS wrapping key +* [stackit beta kms wrapping-key list](./stackit_beta_kms_wrapping-key_list.md) - Lists all KMS wrapping keys + diff --git a/docs/stackit_beta_kms_wrapping-key_create.md b/docs/stackit_beta_kms_wrapping-key_create.md new file mode 100644 index 000000000..d4087bcbe --- /dev/null +++ b/docs/stackit_beta_kms_wrapping-key_create.md @@ -0,0 +1,49 @@ +## stackit beta kms wrapping-key create + +Creates a KMS wrapping key + +### Synopsis + +Creates a KMS wrapping key. + +``` +stackit beta kms wrapping-key create [flags] +``` + +### Examples + +``` + Create a symmetric (RSA + AES) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id" + $ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256_aes_256_key_wrap" --name "my-wrapping-key-name" --purpose "wrap_symmetric_key" --protection "software" + + Create an asymmetric (RSA) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id" + $ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_3072_oaep_sha256" --name "my-wrapping-key-name" --purpose "wrap_asymmetric_key" --protection "software" +``` + +### Options + +``` + --algorithm string En-/Decryption / signing algorithm. Possible values: ["rsa_2048_oaep_sha256" "rsa_3072_oaep_sha256" "rsa_4096_oaep_sha256" "rsa_4096_oaep_sha512" "rsa_2048_oaep_sha256_aes_256_key_wrap" "rsa_3072_oaep_sha256_aes_256_key_wrap" "rsa_4096_oaep_sha256_aes_256_key_wrap" "rsa_4096_oaep_sha512_aes_256_key_wrap"] + --description string Optional description of the wrapping key + -h, --help Help for "stackit beta kms wrapping-key create" + --keyring-id string ID of the KMS key ring + --name string The display name to distinguish multiple wrapping keys + --protection string The underlying system that is responsible for protecting the wrapping key material. Possible values: ["wrap_symmetric_key" "wrap_asymmetric_key"] + --purpose string Purpose of the wrapping key. Possible values: ["wrap_symmetric_key" "wrap_asymmetric_key"] +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys + diff --git a/docs/stackit_beta_kms_wrapping-key_delete.md b/docs/stackit_beta_kms_wrapping-key_delete.md new file mode 100644 index 000000000..0dfd43a03 --- /dev/null +++ b/docs/stackit_beta_kms_wrapping-key_delete.md @@ -0,0 +1,41 @@ +## stackit beta kms wrapping-key delete + +Deletes a KMS wrapping key + +### Synopsis + +Deletes a KMS wrapping key inside a specific key ring. + +``` +stackit beta kms wrapping-key delete WRAPPING_KEY_ID [flags] +``` + +### Examples + +``` + Delete a KMS wrapping key "MY_WRAPPING_KEY_ID" inside the key ring "my-keyring-id" + $ stackit beta kms wrapping-key delete "MY_WRAPPING_KEY_ID" --keyring-id "my-keyring-id" +``` + +### Options + +``` + -h, --help Help for "stackit beta kms wrapping-key delete" + --keyring-id string ID of the KMS key ring where the wrapping key is stored +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys + diff --git a/docs/stackit_beta_kms_wrapping-key_list.md b/docs/stackit_beta_kms_wrapping-key_list.md new file mode 100644 index 000000000..f17c23212 --- /dev/null +++ b/docs/stackit_beta_kms_wrapping-key_list.md @@ -0,0 +1,44 @@ +## stackit beta kms wrapping-key list + +Lists all KMS wrapping keys + +### Synopsis + +Lists all KMS wrapping keys inside a key ring. + +``` +stackit beta kms wrapping-key list [flags] +``` + +### Examples + +``` + List all KMS wrapping keys for the key ring "my-keyring-id" + $ stackit beta kms wrapping-key list --keyring-id "my-keyring-id" + + List all KMS wrapping keys in JSON format + $ stackit beta kms wrapping-key list --keyring-id "my-keyring-id" --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta kms wrapping-key list" + --keyring-id string ID of the KMS key ring where the key is stored +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys + diff --git a/docs/stackit_beta_sqlserverflex_instance_create.md b/docs/stackit_beta_sqlserverflex_instance_create.md index 6e8dc16a0..b297bf7b0 100644 --- a/docs/stackit_beta_sqlserverflex_instance_create.md +++ b/docs/stackit_beta_sqlserverflex_instance_create.md @@ -21,7 +21,7 @@ stackit beta sqlserverflex instance create [flags] $ stackit beta sqlserverflex instance create --name my-instance --flavor-id xxx Create a SQLServer Flex instance with name "my-instance", specify flavor by CPU and RAM, set storage size to 20 GB, and restrict access to a specific range of IP addresses. Other parameters are set to default values - $ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24 + $ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24 ``` ### Options diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index b1abf5662..9b07e46b5 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -36,6 +36,7 @@ stackit config set [flags] --iaas-custom-endpoint string IaaS API base URL, used in calls to this API --identity-provider-custom-client-id string Identity Provider client ID, used for user authentication --identity-provider-custom-well-known-configuration string Identity Provider well-known OpenID configuration URL, used for user authentication + --kms-custom-endpoint string KMS API base URL, used in calls to this API --load-balancer-custom-endpoint string Load Balancer API base URL, used in calls to this API --logme-custom-endpoint string LogMe API base URL, used in calls to this API --mariadb-custom-endpoint string MariaDB API base URL, used in calls to this API diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 4a48b759e..9d4c83088 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -34,6 +34,7 @@ stackit config unset [flags] --iaas-custom-endpoint IaaS API base URL. If unset, uses the default base URL --identity-provider-custom-client-id Identity Provider client ID, used for user authentication --identity-provider-custom-well-known-configuration Identity Provider well-known OpenID configuration URL. If unset, uses the default identity provider + --kms-custom-endpoint KMS API base URL. If unset, uses the default base URL --load-balancer-custom-endpoint Load Balancer API base URL. If unset, uses the default base URL --logme-custom-endpoint LogMe API base URL. If unset, uses the default base URL --mariadb-custom-endpoint MariaDB API base URL. If unset, uses the default base URL diff --git a/go.mod b/go.mod index d152751e2..fe8258d95 100644 --- a/go.mod +++ b/go.mod @@ -238,6 +238,7 @@ require ( github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect diff --git a/go.sum b/go.sum index a896800c1..64b7cd08f 100644 --- a/go.sum +++ b/go.sum @@ -569,6 +569,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0/go.mod h1:KEPVoO21pC4bjy5l0nyhjUJ0+uVwVWb+k2TYrzJ8xYw= github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 h1:/weT7P5Uwy1Qlhw0NidqtQBlbbb/dQehweDV/I9ShXg= github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 h1:dnEjyapuv8WwRN5vE2z6+4/+ZqQTBx+bX27x2nOF7Jw= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index 5a007b87e..b026da770 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -38,4 +39,5 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(sqlserverflex.NewCmd(params)) cmd.AddCommand(alb.NewCmd(params)) + cmd.AddCommand(kms.NewCmd(params)) } diff --git a/internal/cmd/beta/kms/key/create/create.go b/internal/cmd/beta/kms/key/create/create.go new file mode 100644 index 000000000..1d815e638 --- /dev/null +++ b/internal/cmd/beta/kms/key/create/create.go @@ -0,0 +1,218 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" +) + +const ( + keyRingIdFlag = "keyring-id" + + algorithmFlag = "algorithm" + descriptionFlag = "description" + displayNameFlag = "name" + importOnlyFlag = "import-only" + purposeFlag = "purpose" + protectionFlag = "protection" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + + Algorithm *string + Description *string + Name *string + ImportOnly bool // Default false + Purpose *string + Protection *string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a KMS key", + Long: "Creates a KMS key.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a symmetric AES key (AES-256) with the name "symm-aes-gcm" under the key ring "my-keyring-id"`, + `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "aes_256_gcm" --name "symm-aes-gcm" --purpose "symmetric_encrypt_decrypt" --protection "software"`), + examples.NewExample( + `Create an asymmetric RSA encryption key (RSA-2048)`, + `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "prod-orders-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software"`), + examples.NewExample( + `Create a message authentication key (HMAC-SHA512)`, + `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "hmac_sha512" --name "api-mac-key" --purpose "message_authentication_code" --protection "software"`), + examples.NewExample( + `Create an ECDSA P-256 key for signing & verification`, + `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "ecdsa_p256_sha256" --name "signing-ecdsa-p256" --purpose "asymmetric_sign_verify" --protection "software"`), + examples.NewExample( + `Create an import-only key (versions must be imported)`, + `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "ext-managed-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --import-only`), + examples.NewExample( + `Create a key and print the result as YAML`, + `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "yaml-output-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --output yaml`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + if !model.AssumeYes { + err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS Key?") + if err != nil { + return err + } + } + + // Call API + req, _ := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create KMS key: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating key") + _, err = wait.CreateOrUpdateKeyWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, *resp.Id).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for KMS key creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + Algorithm: flags.FlagToStringPointer(p, cmd, algorithmFlag), + Name: flags.FlagToStringPointer(p, cmd, displayNameFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + ImportOnly: flags.FlagToBoolValue(p, cmd, importOnlyFlag), + Purpose: flags.FlagToStringPointer(p, cmd, purposeFlag), + Protection: flags.FlagToStringPointer(p, cmd, protectionFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +type kmsKeyClient interface { + CreateKey(ctx context.Context, projectId string, regionId string, keyRingId string) kms.ApiCreateKeyRequest +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient kmsKeyClient) (kms.ApiCreateKeyRequest, error) { + req := apiClient.CreateKey(ctx, model.ProjectId, model.Region, model.KeyRingId) + + req = req.CreateKeyPayload(kms.CreateKeyPayload{ + DisplayName: model.Name, + Description: model.Description, + Algorithm: kms.CreateKeyPayloadGetAlgorithmAttributeType(model.Algorithm), + Purpose: kms.CreateKeyPayloadGetPurposeAttributeType(model.Purpose), + ImportOnly: &model.ImportOnly, + Protection: kms.CreateKeyPayloadGetProtectionAttributeType(model.Protection), + }) + return req, nil +} + +func outputResult(p *print.Printer, model *inputModel, resp *kms.Key) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch model.OutputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + default: + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s the KMS key %q. Key ID: %s\n", operationState, utils.PtrString(resp.DisplayName), utils.PtrString(resp.Id)) + } + return nil +} + +func configureFlags(cmd *cobra.Command) { + // Algorithm + var algorithmFlagOptions []string + for _, val := range kms.AllowedAlgorithmEnumValues { + algorithmFlagOptions = append(algorithmFlagOptions, string(val)) + } + cmd.Flags().Var(flags.EnumFlag(false, "", algorithmFlagOptions...), algorithmFlag, fmt.Sprintf("En-/Decryption / signing algorithm. Possible values: %q", algorithmFlagOptions)) + + // Purpose + var purposeFlagOptions []string + for _, val := range kms.AllowedPurposeEnumValues { + purposeFlagOptions = append(purposeFlagOptions, string(val)) + } + cmd.Flags().Var(flags.EnumFlag(false, "", purposeFlagOptions...), purposeFlag, fmt.Sprintf("Purpose of the key. Possible values: %q", purposeFlagOptions)) + + // Protection + var protectionFlagOptions []string + for _, val := range kms.AllowedProtectionEnumValues { + protectionFlagOptions = append(protectionFlagOptions, string(val)) + } + cmd.Flags().Var(flags.EnumFlag(false, "", protectionFlagOptions...), protectionFlag, fmt.Sprintf("The underlying system that is responsible for protecting the key material. Possible values: %q", purposeFlagOptions)) + + // All further non Enum Flags + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().String(displayNameFlag, "", "The display name to distinguish multiple keys") + cmd.Flags().String(descriptionFlag, "", "Optional description of the key") + cmd.Flags().Bool(importOnlyFlag, false, "States whether versions can be created or only imported") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, algorithmFlag, purposeFlag, displayNameFlag, protectionFlag) + cobra.CheckErr(err) +} diff --git a/internal/cmd/beta/kms/key/create/create_test.go b/internal/cmd/beta/kms/key/create/create_test.go new file mode 100644 index 000000000..f6c0a024e --- /dev/null +++ b/internal/cmd/beta/kms/key/create/create_test.go @@ -0,0 +1,327 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" + testAlgorithm = "rsa_2048_oaep_sha256" + testDisplayName = "my-key" + testPurpose = "asymmetric_encrypt_decrypt" + testDescription = "my key description" + testImportOnly = "true" + testProtection = "software" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + algorithmFlag: testAlgorithm, + displayNameFlag: testDisplayName, + purposeFlag: testPurpose, + descriptionFlag: testDescription, + importOnlyFlag: testImportOnly, + protectionFlag: testProtection, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + Algorithm: utils.Ptr(testAlgorithm), + Name: utils.Ptr(testDisplayName), + Purpose: utils.Ptr(testPurpose), + Description: utils.Ptr(testDescription), + ImportOnly: true, // Watch out: ImportOnly is not testImportOnly! + Protection: utils.Ptr(testProtection), + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiCreateKeyRequest)) kms.ApiCreateKeyRequest { + request := testClient.CreateKey(testCtx, testProjectId, testRegion, testKeyRingId) + request = request.CreateKeyPayload(kms.CreateKeyPayload{ + Algorithm: kms.CreateKeyPayloadGetAlgorithmAttributeType(utils.Ptr(testAlgorithm)), + DisplayName: utils.Ptr(testDisplayName), + Purpose: kms.CreateKeyPayloadGetPurposeAttributeType(utils.Ptr(testPurpose)), + Description: utils.Ptr(testDescription), + ImportOnly: utils.Ptr(true), + Protection: kms.CreateKeyPayloadGetProtectionAttributeType(utils.Ptr(testProtection)), + }) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "optional flags omitted", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, descriptionFlag) + delete(flagValues, importOnlyFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.ImportOnly = false + }), + }, + { + description: "no values provided", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "algorithm missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, algorithmFlag) + }), + isValid: false, + }, + { + description: "protection missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, protectionFlag) + }), + isValid: false, + }, + { + description: "name missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, displayNameFlag) + }), + isValid: false, + }, + { + description: "purpose missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, purposeFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiCreateKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "no optional values", + model: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.ImportOnly = false + }), + expectedRequest: fixtureRequest().CreateKeyPayload(kms.CreateKeyPayload{ + Algorithm: kms.CreateKeyPayloadGetAlgorithmAttributeType(utils.Ptr(testAlgorithm)), + DisplayName: utils.Ptr(testDisplayName), + Purpose: kms.CreateKeyPayloadGetPurposeAttributeType(utils.Ptr(testPurpose)), + Description: nil, + ImportOnly: utils.Ptr(false), + Protection: kms.CreateKeyPayloadGetProtectionAttributeType(utils.Ptr(testProtection)), + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request, err := buildRequest(testCtx, tt.model, testClient) + if err != nil { + t.Fatalf("error building request: %v", err) + } + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + model *inputModel + key *kms.Key + wantErr bool + }{ + { + description: "nil response", + key: nil, + wantErr: true, + }, + { + description: "default output", + key: &kms.Key{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{}}, + wantErr: false, + }, + { + description: "json output", + key: &kms.Key{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.JSONOutputFormat}}, + wantErr: false, + }, + { + description: "yaml output", + key: &kms.Key{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.YAMLOutputFormat}}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.model, tt.key) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/key/delete/delete.go b/internal/cmd/beta/kms/key/delete/delete.go new file mode 100644 index 000000000..56ab3059a --- /dev/null +++ b/internal/cmd/beta/kms/key/delete/delete.go @@ -0,0 +1,149 @@ +package delete + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyIdArg = "KEY_ID" + + keyRingIdFlag = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyId string + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", keyIdArg), + Short: "Deletes a KMS key", + Long: "Deletes a KMS key inside a specific key ring.", + Args: args.SingleArg(keyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id"`, + `$ stackit beta kms key delete "MY_KEY_ID" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + keyName, err := kmsUtils.GetKeyName(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key name: %v", err) + keyName = model.KeyId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete key %q? (This cannot be undone)", keyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete KMS key: %w", err) + } + + // Don't wait for a month until the deletion was performed. + // Just print the deletion date. + resp, err := apiClient.GetKeyExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key: %v", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + keyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: keyId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiDeleteKeyRequest { + req := apiClient.DeleteKey(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + return req +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring where the key is stored") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Key) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal output to JSON: %w", err) + } + p.Outputln(string(details)) + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal output to YAML: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Deletion of KMS key %s scheduled successfully for the deletion date: %s\n", utils.PtrString(resp.DisplayName), utils.PtrString(resp.DeletionDate)) + } + return nil +} diff --git a/internal/cmd/beta/kms/key/delete/delete_test.go b/internal/cmd/beta/kms/key/delete/delete_test.go new file mode 100644 index 000000000..b073b45be --- /dev/null +++ b/internal/cmd/beta/kms/key/delete/delete_test.go @@ -0,0 +1,292 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testKeyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiDeleteKeyRequest)) kms.ApiDeleteKeyRequest { + request := testClient.DeleteKey(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (keyId)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiDeleteKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + wantErr bool + outputFormat string + resp *kms.Key + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Key{}, + wantErr: false, + }, + { + description: "json output", + outputFormat: print.JSONOutputFormat, + resp: &kms.Key{}, + wantErr: false, + }, + { + description: "yaml output", + outputFormat: print.YAMLOutputFormat, + resp: &kms.Key{}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/key/importKey/importKey.go b/internal/cmd/beta/kms/key/importKey/importKey.go new file mode 100644 index 000000000..f491f6eb7 --- /dev/null +++ b/internal/cmd/beta/kms/key/importKey/importKey.go @@ -0,0 +1,181 @@ +package importKey + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyIdArg = "KEY_ID" + + keyRingIdFlag = "keyring-id" + wrappedKeyFlag = "wrapped-key" + wrappingKeyIdFlag = "wrapping-key-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + KeyId string + WrappedKey *string + WrappingKeyId *string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("import %s", keyIdArg), + Short: "Import a KMS key", + Long: "After encrypting the secret with the wrapping key’s public key and Base64-encoding it, import it as a new version of the specified KMS key.", + Args: args.SingleArg(keyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Import a new version for the given KMS key "MY_KEY_ID" from literal value`, + `$ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "BASE64_VALUE" --wrapping-key-id "MY_WRAPPING_KEY_ID"`), + examples.NewExample( + `Import from a file`, + `$ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "@path/to/wrapped.key.b64" --wrapping-key-id "MY_WRAPPING_KEY_ID"`, + ), + ), + + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + keyName, err := kmsUtils.GetKeyName(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key name: %v", err) + keyName = model.KeyId + } + keyRingName, err := kmsUtils.GetKeyRingName(ctx, apiClient, model.ProjectId, model.KeyRingId, model.Region) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key ring name: %v", err) + keyRingName = model.KeyRingId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to import a new version for the KMS Key %q inside the key ring %q?", keyName, keyRingName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req, _ := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("import KMS key: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, keyRingName, keyName, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + keyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // WrappedKey needs to be base64 encoded + var wrappedKey *string = flags.FlagToStringPointer(p, cmd, wrappedKeyFlag) + _, err := base64.StdEncoding.DecodeString(*wrappedKey) + if err != nil || *wrappedKey == "" { + return nil, &cliErr.FlagValidationError{ + Flag: wrappedKeyFlag, + Details: "The 'wrappedKey' argument is required and needs to be base64 encoded (whether provided inline or via file).", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyId: keyId, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + WrappedKey: wrappedKey, + WrappingKeyId: flags.FlagToStringPointer(p, cmd, wrappingKeyIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +type kmsKeyClient interface { + ImportKey(ctx context.Context, projectId string, regionId string, keyRingId string, keyId string) kms.ApiImportKeyRequest +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient kmsKeyClient) (kms.ApiImportKeyRequest, error) { + req := apiClient.ImportKey(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + + req = req.ImportKeyPayload(kms.ImportKeyPayload{ + WrappedKey: model.WrappedKey, + WrappingKeyId: model.WrappingKeyId, + }) + return req, nil +} + +func outputResult(p *print.Printer, outputFormat, keyRingName, keyName string, resp *kms.Version) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Imported a new version for the key %q inside the key ring %q\n", keyName, keyRingName) + } + + return nil +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().Var(flags.ReadFromFileFlag(), wrappedKeyFlag, "The wrapped key material to be imported. Base64-encoded. Pass the value directly or a file path (e.g. @path/to/wrapped.key.b64)") + cmd.Flags().Var(flags.UUIDFlag(), wrappingKeyIdFlag, "The unique id of the wrapping key the key material has been wrapped with") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, wrappedKeyFlag, wrappingKeyIdFlag) + cobra.CheckErr(err) +} diff --git a/internal/cmd/beta/kms/key/importKey/importKey_test.go b/internal/cmd/beta/kms/key/importKey/importKey_test.go new file mode 100644 index 000000000..37192e9d1 --- /dev/null +++ b/internal/cmd/beta/kms/key/importKey/importKey_test.go @@ -0,0 +1,362 @@ +package importKey + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() + testWrappingKeyId = uuid.NewString() + testWrappedKey = "SnVzdCBzYXlpbmcgaGV5Oyk=" +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testKeyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + wrappedKeyFlag: testWrappedKey, + wrappingKeyIdFlag: testWrappingKeyId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + WrappedKey: &testWrappedKey, + WrappingKeyId: &testWrappingKeyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiImportKeyRequest)) kms.ApiImportKeyRequest { + request := testClient.ImportKey(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId) + request = request.ImportKeyPayload(kms.ImportKeyPayload{ + WrappedKey: &testWrappedKey, + WrappingKeyId: &testWrappingKeyId, + }) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no args (keyId)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values provided", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing (required)", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: []string{"invalid-key"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "wrapping key id missing (required)", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, wrappingKeyIdFlag) + }), + isValid: false, + }, + { + description: "wrapping key id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[wrappingKeyIdFlag] = "" + }), + isValid: false, + }, + { + description: "wrapping key id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[wrappingKeyIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "wrapped key missing (required)", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, wrappedKeyFlag) + }), + isValid: false, + }, + { + description: "wrapped key invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[wrappedKeyFlag] = "" + }), + isValid: false, + }, + { + description: "wrapped key invalid 2 - not base64", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[wrappedKeyFlag] = "Not Base 64" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiImportKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request, err := buildRequest(testCtx, tt.model, testClient) + if err != nil { + t.Fatalf("error building request: %v", err) + } + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + version *kms.Version + outputFormat string + keyRingName string + keyName string + wantErr bool + }{ + { + description: "nil response", + version: nil, + wantErr: true, + }, + { + description: "default output", + version: &kms.Version{}, + keyRingName: "my-key-ring", + keyName: "my-key", + wantErr: false, + }, + { + description: "json output", + version: &kms.Version{}, + outputFormat: print.JSONOutputFormat, + keyRingName: "my-key-ring", + keyName: "my-key", + wantErr: false, + }, + { + description: "yaml output", + version: &kms.Version{}, + outputFormat: print.YAMLOutputFormat, + keyRingName: "my-key-ring", + keyName: "my-key", + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.keyRingName, tt.keyName, tt.version) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/key/key.go b/internal/cmd/beta/kms/key/key.go new file mode 100644 index 000000000..4b2f7d8fa --- /dev/null +++ b/internal/cmd/beta/kms/key/key.go @@ -0,0 +1,36 @@ +package key + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/importKey" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/restore" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/rotate" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "key", + Short: "Manage KMS keys", + Long: "Provides functionality for key operations inside the KMS", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(importKey.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(restore.NewCmd(params)) + cmd.AddCommand(rotate.NewCmd(params)) +} diff --git a/internal/cmd/beta/kms/key/list/list.go b/internal/cmd/beta/kms/key/list/list.go new file mode 100644 index 000000000..aa337b5b7 --- /dev/null +++ b/internal/cmd/beta/kms/key/list/list.go @@ -0,0 +1,148 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyRingIdFlag = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "List all KMS keys", + Long: "List all KMS keys inside a key ring.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all KMS keys for the key ring "my-keyring-id"`, + `$ stackit beta kms key list --keyring-id "my-keyring-id"`), + examples.NewExample( + `List all KMS keys in JSON format`, + `$ stackit beta kms key list --keyring-id "my-keyring-id" --output-format json`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get KMS Keys: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, model.ProjectId, model.KeyRingId, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiListKeysRequest { + req := apiClient.ListKeys(ctx, model.ProjectId, model.Region, model.KeyRingId) + return req +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring where the key is stored") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat, projectId, keyRingId string, resp *kms.KeyList) error { + if resp == nil || resp.Keys == nil { + return fmt.Errorf("response was nil / empty") + } + + keys := *resp.Keys + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(keys, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS Keys list: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(keys, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS Keys list: %w", err) + } + p.Outputln(string(details)) + + default: + if len(keys) == 0 { + p.Outputf("No keys found for project %q under the key ring %q\n", projectId, keyRingId) + return nil + } + table := tables.NewTable() + table.SetHeader("ID", "NAME", "SCOPE", "ALGORITHM", "DELETION DATE", "STATUS") + + for _, key := range keys { + table.AddRow( + utils.PtrString(key.Id), + utils.PtrString(key.DisplayName), + utils.PtrString(key.Purpose), + utils.PtrString(key.Algorithm), + utils.PtrString(key.DeletionDate), + utils.PtrString(key.State), + ) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + } + return nil +} diff --git a/internal/cmd/beta/kms/key/list/list_test.go b/internal/cmd/beta/kms/key/list/list_test.go new file mode 100644 index 000000000..17d773bd5 --- /dev/null +++ b/internal/cmd/beta/kms/key/list/list_test.go @@ -0,0 +1,258 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiListKeysRequest)) kms.ApiListKeysRequest { + request := testClient.ListKeys(testCtx, testProjectId, testRegion, testKeyRingId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "missing keyRingId", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "invalid keyRingId 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid keyRingId 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "Not a valid uuid" + }), + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiListKeysRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + resp *kms.KeyList + projectId string + keyRingId string + outputFormat string + wantErr bool + }{ + { + description: "nil response", + resp: nil, + projectId: uuid.NewString(), + keyRingId: uuid.NewString(), + wantErr: true, + }, + { + description: "empty response", + resp: &kms.KeyList{}, + projectId: uuid.NewString(), + keyRingId: uuid.NewString(), + wantErr: true, + }, + { + description: "default output", + resp: &kms.KeyList{Keys: &[]kms.Key{}}, + projectId: uuid.NewString(), + keyRingId: uuid.NewString(), + wantErr: false, + }, + { + description: "json output", + resp: &kms.KeyList{Keys: &[]kms.Key{}}, + projectId: uuid.NewString(), + keyRingId: uuid.NewString(), + outputFormat: print.JSONOutputFormat, + wantErr: false, + }, + { + description: "yaml output", + resp: &kms.KeyList{Keys: &[]kms.Key{}}, + projectId: uuid.NewString(), + keyRingId: uuid.NewString(), + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.projectId, tt.keyRingId, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/key/restore/restore.go b/internal/cmd/beta/kms/key/restore/restore.go new file mode 100644 index 000000000..05494a97a --- /dev/null +++ b/internal/cmd/beta/kms/key/restore/restore.go @@ -0,0 +1,148 @@ +package restore + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyIdArg = "KEY_ID" + + keyRingIdFlag = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyId string + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("restore %s", keyIdArg), + Short: "Restore a key", + Long: "Restores the given key from deletion.", + Args: args.SingleArg(keyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Restore a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id" that was scheduled for deletion.`, + `$ stackit beta kms key restore "MY_KEY_ID" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + keyName, err := kmsUtils.GetKeyName(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key name: %v", err) + keyName = model.KeyId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to restore key %q? (This cannot be undone)", keyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("restore KMS key: %w", err) + } + + // Grab the key after the restore was applied to display the new state to the user. + resp, err := apiClient.GetKeyExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key: %v", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + keyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: keyId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiRestoreKeyRequest { + req := apiClient.RestoreKey(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + return req +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring where the key is stored") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Key) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal output to JSON: %w", err) + } + p.Outputln(string(details)) + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal output to YAML: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Successfully restored KMS key %q\n", utils.PtrString(resp.DisplayName)) + } + return nil +} diff --git a/internal/cmd/beta/kms/key/restore/restore_test.go b/internal/cmd/beta/kms/key/restore/restore_test.go new file mode 100644 index 000000000..69860461d --- /dev/null +++ b/internal/cmd/beta/kms/key/restore/restore_test.go @@ -0,0 +1,292 @@ +package restore + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testKeyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiRestoreKeyRequest)) kms.ApiRestoreKeyRequest { + request := testClient.RestoreKey(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (keyId)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiRestoreKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + wantErr bool + outputFormat string + resp *kms.Key + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Key{}, + wantErr: false, + }, + { + description: "json output", + outputFormat: print.JSONOutputFormat, + resp: &kms.Key{}, + wantErr: false, + }, + { + description: "yaml output", + outputFormat: print.YAMLOutputFormat, + resp: &kms.Key{}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/key/rotate/rotate.go b/internal/cmd/beta/kms/key/rotate/rotate.go new file mode 100644 index 000000000..14e4ff15f --- /dev/null +++ b/internal/cmd/beta/kms/key/rotate/rotate.go @@ -0,0 +1,144 @@ +package rotate + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyIdArg = "KEY_ID" + + keyRingIdFlag = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyId string + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("rotate %s", keyIdArg), + Short: "Rotate a key", + Long: "Rotates the given key.", + Args: args.SingleArg(keyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Rotate a KMS key "MY_KEY_ID" and increase its version inside the key ring "my-keyring-id".`, + `$ stackit beta kms key rotate "MY_KEY_ID" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + keyName, err := kmsUtils.GetKeyName(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key name: %v", err) + keyName = model.KeyId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to rotate the key %q? (this cannot be undone)", keyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("rotate KMS key: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + keyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: keyId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiRotateKeyRequest { + req := apiClient.RotateKey(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) + return req +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring where the key is stored") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key version: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key version: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Rotated key %s\n", utils.PtrString(resp.KeyId)) + } + + return nil +} diff --git a/internal/cmd/beta/kms/key/rotate/rotate_test.go b/internal/cmd/beta/kms/key/rotate/rotate_test.go new file mode 100644 index 000000000..28d84295e --- /dev/null +++ b/internal/cmd/beta/kms/key/rotate/rotate_test.go @@ -0,0 +1,292 @@ +package rotate + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testKeyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiRotateKeyRequest)) kms.ApiRotateKeyRequest { + request := testClient.RotateKey(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (keyId)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiRotateKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + resp *kms.Version + outputFormat string + wantErr bool + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "json output", + resp: &kms.Version{}, + outputFormat: print.JSONOutputFormat, + wantErr: false, + }, + { + description: "yaml output", + resp: &kms.Version{}, + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/keyring/create/create.go b/internal/cmd/beta/kms/keyring/create/create.go new file mode 100644 index 000000000..b4103e957 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/create/create.go @@ -0,0 +1,182 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" +) + +const ( + keyRingNameFlag = "name" + descriptionFlag = "description" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyringName string + Description string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a KMS key ring", + Long: "Creates a KMS key ring.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a KMS key ring with name "my-keyring"`, + "$ stackit beta kms keyring create --name my-keyring"), + examples.NewExample( + `Create a KMS key ring with a description`, + "$ stackit beta kms keyring create --name my-keyring --description my-description"), + examples.NewExample( + `Create a KMS key ring and print the result as YAML`, + "$ stackit beta kms keyring create --name my-keyring -o yaml"), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + if !model.AssumeYes { + err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS key ring?") + if err != nil { + return err + } + } + + // Call API + req, _ := buildRequest(ctx, model, apiClient) + + keyRing, err := req.Execute() + if err != nil { + return fmt.Errorf("create KMS key ring: %w", err) + } + + // Prevent potential nil pointer dereference + if keyRing == nil || keyRing.Id == nil { + return fmt.Errorf("API call succeeded but returned an invalid response (missing key ring ID)") + } + + keyRingId := *keyRing.Id + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating key ring") + _, err = wait.CreateKeyRingWaitHandler(ctx, apiClient, model.ProjectId, model.Region, keyRingId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for KMS key ring creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model, keyRing) + }, + } + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + keyringName := flags.FlagToStringValue(p, cmd, keyRingNameFlag) + + if keyringName == "" { + return nil, &cliErr.DSAInputPlanError{ + Cmd: cmd, + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyringName: keyringName, + Description: flags.FlagToStringValue(p, cmd, descriptionFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +type kmsKeyringClient interface { + CreateKeyRing(ctx context.Context, projectId string, regionId string) kms.ApiCreateKeyRingRequest +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient kmsKeyringClient) (kms.ApiCreateKeyRingRequest, error) { + req := apiClient.CreateKeyRing(ctx, model.ProjectId, model.Region) + + req = req.CreateKeyRingPayload(kms.CreateKeyRingPayload{ + DisplayName: &model.KeyringName, + + // Description should be empty by default and only be overwritten with the descriptionFlag if it was passed. + Description: &model.Description, + }) + return req, nil +} + +func outputResult(p *print.Printer, model *inputModel, resp *kms.KeyRing) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch model.OutputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key ring: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key ring: %w", err) + } + p.Outputln(string(details)) + + default: + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s key ring. KMS key ring ID: %s\n", operationState, utils.PtrString(resp.Id)) + } + return nil +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(keyRingNameFlag, "", "Name of the KMS key ring") + cmd.Flags().String(descriptionFlag, "", "Optional description of the key ring") + + err := flags.MarkFlagsRequired(cmd, keyRingNameFlag) + cobra.CheckErr(err) +} diff --git a/internal/cmd/beta/kms/keyring/create/create_test.go b/internal/cmd/beta/kms/keyring/create/create_test.go new file mode 100644 index 000000000..8cdf81219 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/create/create_test.go @@ -0,0 +1,249 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" + testKeyRingName = "my-key-ring" + testDescription = "my-description" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingNameFlag: testKeyRingName, + descriptionFlag: testDescription, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyringName: testKeyRingName, + Description: testDescription, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiCreateKeyRingRequest)) kms.ApiCreateKeyRingRequest { + request := testClient.CreateKeyRing(testCtx, testProjectId, testRegion) + request = request.CreateKeyRingPayload(kms.CreateKeyRingPayload{ + DisplayName: utils.Ptr(testKeyRingName), + Description: utils.Ptr(testDescription), + }) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "optional flags omitted", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, descriptionFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = "" + }), + }, + { + description: "no values provided", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiCreateKeyRingRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request, err := buildRequest(testCtx, tt.model, testClient) + if err != nil { + t.Fatalf("error building request: %v", err) + } + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + model *inputModel + description string + keyRing *kms.KeyRing + wantErr bool + }{ + { + description: "nil response", + keyRing: nil, + wantErr: true, + }, + { + description: "default output", + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{}}, + keyRing: &kms.KeyRing{}, + wantErr: false, + }, + { + description: "json output", + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.JSONOutputFormat}}, + keyRing: &kms.KeyRing{}, + wantErr: false, + }, + { + description: "yaml output", + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.YAMLOutputFormat}}, + keyRing: &kms.KeyRing{}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.model, tt.keyRing) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/keyring/delete/delete.go b/internal/cmd/beta/kms/keyring/delete/delete.go new file mode 100644 index 000000000..307729745 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/delete/delete.go @@ -0,0 +1,105 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyRingIdArg = "KEYRING-ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", keyRingIdArg), + Short: "Deletes a KMS key ring", + Long: "Deletes a KMS key ring.", + Args: args.SingleArg(keyRingIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a KMS key ring with ID "MY_KEYRING_ID"`, + `$ stackit beta kms keyring delete "MY_KEYRING_ID"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + keyRingLabel, err := kmsUtils.GetKeyRingName(ctx, apiClient, model.ProjectId, model.KeyRingId, model.Region) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key ring name: %v", err) + keyRingLabel = model.KeyRingId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete key ring %q? (this cannot be undone)", keyRingLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete KMS key ring: %w", err) + } + + // No async wait required; key ring deletion is synchronous. + + // Don't output anything. It's a deletion. + params.Printer.Info("Deleted the key ring %q\n", keyRingLabel) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + keyRingId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: keyRingId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiDeleteKeyRingRequest { + req := apiClient.DeleteKeyRing(ctx, model.ProjectId, model.Region, model.KeyRingId) + return req +} diff --git a/internal/cmd/beta/kms/keyring/delete/delete_test.go b/internal/cmd/beta/kms/keyring/delete/delete_test.go new file mode 100644 index 000000000..c53e7d7f0 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/delete/delete_test.go @@ -0,0 +1,212 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testKeyRingId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiDeleteKeyRingRequest)) kms.ApiDeleteKeyRingRequest { + request := testClient.DeleteKeyRing(testCtx, testProjectId, testRegion, testKeyRingId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no args (keyRingId)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "invalid keyRingId", + argValues: fixtureArgValues(func(argValues []string) { + argValues[0] = "Not an uuid" + }), + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiDeleteKeyRingRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/kms/keyring/keyring.go b/internal/cmd/beta/kms/keyring/keyring.go new file mode 100644 index 000000000..7a42ce131 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/keyring.go @@ -0,0 +1,30 @@ +package keyring + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "keyring", + Short: "Manage KMS key rings", + Long: "Provides functionality for key ring operations inside the KMS", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) +} diff --git a/internal/cmd/beta/kms/keyring/list/list.go b/internal/cmd/beta/kms/keyring/list/list.go new file mode 100644 index 000000000..d12b9ae87 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/list/list.go @@ -0,0 +1,133 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +type inputModel struct { + *globalflags.GlobalFlagModel +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all KMS key rings", + Long: "Lists all KMS key rings.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all KMS key rings`, + "$ stackit beta kms keyring list"), + examples.NewExample( + `List all KMS key rings in JSON format`, + "$ stackit beta kms keyring list --output-format json"), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get KMS key rings: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, model.ProjectId, resp) + }, + } + + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiListKeyRingsRequest { + req := apiClient.ListKeyRings(ctx, model.ProjectId, model.Region) + return req +} + +func outputResult(p *print.Printer, outputFormat, projectId string, resp *kms.KeyRingList) error { + if resp == nil || resp.KeyRings == nil { + return fmt.Errorf("response was nil / empty") + } + + keyRings := *resp.KeyRings + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(keyRings, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key rings list: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(keyRings, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key rings list: %w", err) + } + p.Outputln(string(details)) + + default: + if len(keyRings) == 0 { + p.Outputf("No key rings found for project %q\n", projectId) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "STATUS") + + for i := range keyRings { + keyRing := keyRings[i] + table.AddRow( + utils.PtrString(keyRing.Id), + utils.PtrString(keyRing.DisplayName), + utils.PtrString(keyRing.State), + ) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + } + + return nil +} diff --git a/internal/cmd/beta/kms/keyring/list/list_test.go b/internal/cmd/beta/kms/keyring/list/list_test.go new file mode 100644 index 000000000..d85681c99 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/list/list_test.go @@ -0,0 +1,229 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiListKeyRingsRequest)) kms.ApiListKeyRingsRequest { + request := testClient.ListKeyRings(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values provided", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiListKeyRingsRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + projectId string + resp *kms.KeyRingList + outputFormat string + projectLabel string + wantErr bool + }{ + { + description: "nil response", + resp: nil, + projectId: uuid.NewString(), + projectLabel: "my-project", + wantErr: true, + }, + { + description: "empty response", + resp: &kms.KeyRingList{}, + projectId: uuid.NewString(), + projectLabel: "my-project", + wantErr: true, + }, + { + description: "default output", + projectId: uuid.NewString(), + resp: &kms.KeyRingList{KeyRings: &[]kms.KeyRing{}}, + projectLabel: "my-project", + wantErr: false, + }, + { + description: "json output", + projectId: uuid.NewString(), + resp: &kms.KeyRingList{KeyRings: &[]kms.KeyRing{}}, + outputFormat: print.JSONOutputFormat, + wantErr: false, + }, + { + description: "yaml output", + projectId: uuid.NewString(), + resp: &kms.KeyRingList{KeyRings: &[]kms.KeyRing{}}, + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.projectId, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/kms.go b/internal/cmd/beta/kms/kms.go new file mode 100644 index 000000000..8eeb2b0d2 --- /dev/null +++ b/internal/cmd/beta/kms/kms.go @@ -0,0 +1,32 @@ +package kms + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "kms", + Short: "Provides functionality for KMS", + Long: "Provides functionality for KMS.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(keyring.NewCmd(params)) + cmd.AddCommand(wrappingkey.NewCmd(params)) + cmd.AddCommand(key.NewCmd(params)) + cmd.AddCommand(version.NewCmd(params)) +} diff --git a/internal/cmd/beta/kms/version/destroy/destroy.go b/internal/cmd/beta/kms/version/destroy/destroy.go new file mode 100644 index 000000000..470099c66 --- /dev/null +++ b/internal/cmd/beta/kms/version/destroy/destroy.go @@ -0,0 +1,147 @@ +package destroy + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + versionNumberArg = "VERSION_NUMBER" + + keyRingIdFlag = "keyring-id" + keyIdFlag = "key-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + KeyId string + VersionNumber int64 +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("destroy %s", versionNumberArg), + Short: "Destroy a key version", + Long: "Removes the key material of a version.", + Args: args.SingleArg(versionNumberArg, nil), + Example: examples.Build( + examples.NewExample( + `Destroy key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, + `$ stackit beta kms version destroy 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // This operation can be undone. Don't ask for confirmation! + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("destroy key Version: %w", err) + } + + // Get the key version in its state afterwards + resp, err := apiClient.GetVersionExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key version: %v", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + versionStr := inputArgs[0] + versionNumber, err := strconv.ParseInt(versionStr, 10, 64) + if err != nil || versionNumber < 0 { + return nil, &errors.ArgValidationError{ + Arg: versionNumberArg, + Details: fmt.Sprintf("invalid value %q: must be a positive integer", versionStr), + } + } + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: flags.FlagToStringValue(p, cmd, keyIdFlag), + VersionNumber: versionNumber, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiDestroyVersionRequest { + return apiClient.DestroyVersion(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().Var(flags.UUIDFlag(), keyIdFlag, "ID of the key") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, keyIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Destroyed version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) + } + + return nil +} diff --git a/internal/cmd/beta/kms/version/destroy/destroy_test.go b/internal/cmd/beta/kms/version/destroy/destroy_test.go new file mode 100644 index 000000000..898d1a084 --- /dev/null +++ b/internal/cmd/beta/kms/version/destroy/destroy_test.go @@ -0,0 +1,319 @@ +package destroy + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" + testVersionNumber = int64(1) + testVersionNumberString = "1" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testVersionNumberString, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + keyIdFlag: testKeyId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + VersionNumber: testVersionNumber, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiDestroyVersionRequest)) kms.ApiDestroyVersionRequest { + request := testClient.DestroyVersion(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId, testVersionNumber) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (versionNumber)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyIdFlag) + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "" + }), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "version number invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "version number invalid 2", + argValues: []string{"Not a Number!"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiDestroyVersionRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + wantErr bool + outputFormat string + resp *kms.Version + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "json output", + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "yaml output", + resp: &kms.Version{}, + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/version/disable/disable.go b/internal/cmd/beta/kms/version/disable/disable.go new file mode 100644 index 000000000..095a870e4 --- /dev/null +++ b/internal/cmd/beta/kms/version/disable/disable.go @@ -0,0 +1,149 @@ +package disable + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + versionNumberArg = "VERSION_NUMBER" + + keyRingIdFlag = "keyring-id" + keyIdFlag = "key-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + KeyId string + VersionNumber int64 +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("disable %s", versionNumberArg), + Short: "Disable a key version", + Long: "Disable the given key version.", + Args: args.SingleArg(versionNumberArg, nil), + Example: examples.Build( + examples.NewExample( + `Disable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, + `$ stackit beta kms version disable 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // This operation can be undone. Don't ask for confirmation! + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("disable key version: %w", err) + } + + // kms v1.0.0 has a waiter, but it get's stuck even though the disable api call was already successfully completed. + + // Get the key version in its state afterwards + resp, err := apiClient.GetVersionExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key version: %v", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + versionStr := inputArgs[0] + versionNumber, err := strconv.ParseInt(versionStr, 10, 64) + if err != nil || versionNumber < 0 { + return nil, &errors.ArgValidationError{ + Arg: versionNumberArg, + Details: fmt.Sprintf("invalid value %q: must be a positive integer", versionStr), + } + } + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: flags.FlagToStringValue(p, cmd, keyIdFlag), + VersionNumber: versionNumber, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiDisableVersionRequest { + return apiClient.DisableVersion(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().Var(flags.UUIDFlag(), keyIdFlag, "ID of the key") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, keyIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Disabled version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) + } + + return nil +} diff --git a/internal/cmd/beta/kms/version/disable/disable_test.go b/internal/cmd/beta/kms/version/disable/disable_test.go new file mode 100644 index 000000000..66ec302b8 --- /dev/null +++ b/internal/cmd/beta/kms/version/disable/disable_test.go @@ -0,0 +1,320 @@ +package disable + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" + testVersionNumber = int64(1) + testVersionNumberString = "1" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testVersionNumberString, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + keyIdFlag: testKeyId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + VersionNumber: testVersionNumber, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiDisableVersionRequest)) kms.ApiDisableVersionRequest { + request := testClient.DisableVersion(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId, testVersionNumber) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (versionNumber)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyIdFlag) + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "" + }), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "version number invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "version number invalid 2", + argValues: []string{"Not a Number!"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiDisableVersionRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + wantErr bool + outputFormat string + resp *kms.Version + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "json output", + outputFormat: print.JSONOutputFormat, + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "yaml output", + outputFormat: print.YAMLOutputFormat, + resp: &kms.Version{}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/version/enable/enable.go b/internal/cmd/beta/kms/version/enable/enable.go new file mode 100644 index 000000000..a2530996c --- /dev/null +++ b/internal/cmd/beta/kms/version/enable/enable.go @@ -0,0 +1,160 @@ +package enable + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" +) + +const ( + versionNumberArg = "VERSION_NUMBER" + + keyRingIdFlag = "keyring-id" + keyIdFlag = "key-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + KeyId string + VersionNumber int64 +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("enable %s", versionNumberArg), + Short: "Enable a key version", + Long: "Enable the given key version.", + Args: args.SingleArg(versionNumberArg, nil), + Example: examples.Build( + examples.NewExample( + `Enable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, + `$ stackit beta kms version enable 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // This operation can be undone. Don't ask for confirmation! + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("enable key version: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Enabling key version") + _, err = wait.EnableKeyVersionWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for key version to be enabled: %w", err) + } + s.Stop() + } + + // Get the key version in its state afterwards + resp, err := apiClient.GetVersionExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key version: %v", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + versionStr := inputArgs[0] + versionNumber, err := strconv.ParseInt(versionStr, 10, 64) + if err != nil || versionNumber < 0 { + return nil, &errors.ArgValidationError{ + Arg: versionNumberArg, + Details: fmt.Sprintf("invalid value %q: must be a positive integer", versionStr), + } + } + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: flags.FlagToStringValue(p, cmd, keyIdFlag), + VersionNumber: versionNumber, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiEnableVersionRequest { + return apiClient.EnableVersion(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().Var(flags.UUIDFlag(), keyIdFlag, "ID of the key") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, keyIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS key: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Enabled version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) + } + + return nil +} diff --git a/internal/cmd/beta/kms/version/enable/enable_test.go b/internal/cmd/beta/kms/version/enable/enable_test.go new file mode 100644 index 000000000..381f7885a --- /dev/null +++ b/internal/cmd/beta/kms/version/enable/enable_test.go @@ -0,0 +1,320 @@ +package enable + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" + testVersionNumber = int64(1) + testVersionNumberString = "1" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testVersionNumberString, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + keyIdFlag: testKeyId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + VersionNumber: testVersionNumber, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiEnableVersionRequest)) kms.ApiEnableVersionRequest { + request := testClient.EnableVersion(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId, testVersionNumber) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (versionNumber)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyIdFlag) + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "" + }), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "version number invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "version number invalid 2", + argValues: []string{"Not a Number!"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiEnableVersionRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + wantErr bool + outputFormat string + resp *kms.Version + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "json output", + resp: &kms.Version{}, + outputFormat: print.JSONOutputFormat, + wantErr: false, + }, + { + description: "yaml output", + resp: &kms.Version{}, + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/version/list/list.go b/internal/cmd/beta/kms/version/list/list.go new file mode 100644 index 000000000..c73b2a949 --- /dev/null +++ b/internal/cmd/beta/kms/version/list/list.go @@ -0,0 +1,150 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyRingIdFlag = "keyring-id" + keyIdFlag = "key-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + KeyId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "List all key versions", + Long: "List all versions of a given key.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all key versions for the key "my-key-id" inside the key ring "my-keyring-id"`, + `$ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id"`), + examples.NewExample( + `List all key versions in JSON format`, + `$ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" -o json`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get key version: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, model.ProjectId, model.KeyId, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: flags.FlagToStringValue(p, cmd, keyIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiListVersionsRequest { + return apiClient.ListVersions(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId) +} + +func outputResult(p *print.Printer, outputFormat, projectId, keyId string, resp *kms.VersionList) error { + if resp == nil || resp.Versions == nil { + return fmt.Errorf("response is nil / empty") + } + versions := *resp.Versions + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(versions, "", " ") + if err != nil { + return fmt.Errorf("marshal key versions list: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(versions, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal key versions list: %w", err) + } + p.Outputln(string(details)) + + default: + if len(versions) == 0 { + p.Outputf("No key versions found for project %q for the key %q\n", projectId, keyId) + return nil + } + table := tables.NewTable() + table.SetHeader("ID", "NUMBER", "CREATED AT", "DESTROY DATE", "STATUS") + + for _, version := range versions { + table.AddRow( + utils.PtrString(version.KeyId), + utils.PtrString(version.Number), + utils.PtrString(version.CreatedAt), + utils.PtrString(version.DestroyDate), + utils.PtrString(version.State), + ) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + } + + return nil +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().Var(flags.UUIDFlag(), keyIdFlag, "ID of the key") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, keyIdFlag) + cobra.CheckErr(err) +} diff --git a/internal/cmd/beta/kms/version/list/list_test.go b/internal/cmd/beta/kms/version/list/list_test.go new file mode 100644 index 000000000..a1df169ac --- /dev/null +++ b/internal/cmd/beta/kms/version/list/list_test.go @@ -0,0 +1,282 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + keyIdFlag: testKeyId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiListVersionsRequest)) kms.ApiListVersionsRequest { + request := testClient.ListVersions(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyIdFlag) + }), + isValid: false, + }, + { + description: "key id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "" + }), + isValid: false, + }, + { + description: "key id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiListVersionsRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + projectId string + keyId string + resp *kms.VersionList + outputFormat string + projectLabel string + wantErr bool + }{ + { + description: "nil response", + resp: nil, + projectLabel: "my-project", + wantErr: true, + }, + { + description: "empty default", + resp: &kms.VersionList{}, + projectLabel: "my-project", + wantErr: true, + }, + { + description: "default output", + resp: &kms.VersionList{Versions: &[]kms.Version{}}, + projectLabel: "my-project", + wantErr: false, + }, + { + description: "json output", + resp: &kms.VersionList{Versions: &[]kms.Version{}}, + outputFormat: print.JSONOutputFormat, + wantErr: false, + }, + { + description: "yaml output", + resp: &kms.VersionList{Versions: &[]kms.Version{}}, + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.projectId, tt.keyId, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/version/restore/restore.go b/internal/cmd/beta/kms/version/restore/restore.go new file mode 100644 index 000000000..c5b4e7aec --- /dev/null +++ b/internal/cmd/beta/kms/version/restore/restore.go @@ -0,0 +1,145 @@ +package restore + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + versionNumberArg = "VERSION_NUMBER" + + keyRingIdFlag = "keyring-id" + keyIdFlag = "key-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + KeyId string + VersionNumber int64 +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("restore %s", versionNumberArg), + Short: "Restore a key version", + Long: "Restores the specified version of a key.", + Args: args.SingleArg(versionNumberArg, nil), + Example: examples.Build( + examples.NewExample( + `Restore key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, + `$ stackit beta kms version restore 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // This operation can be undone. Don't ask for confirmation! + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("restore key Version: %w", err) + } + + // Grab the key after the restore was applied to display the new state to the user. + resp, err := apiClient.GetVersionExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get key version: %v", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + versionStr := inputArgs[0] + versionNumber, err := strconv.ParseInt(versionStr, 10, 64) + if err != nil || versionNumber < 0 { + return nil, &errors.ArgValidationError{ + Arg: versionNumberArg, + Details: fmt.Sprintf("invalid value %q: must be a positive integer", versionStr), + } + } + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + KeyId: flags.FlagToStringValue(p, cmd, keyIdFlag), + VersionNumber: versionNumber, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiRestoreVersionRequest { + return apiClient.RestoreVersion(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().Var(flags.UUIDFlag(), keyIdFlag, "ID of the key") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, keyIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { + if resp == nil { + return fmt.Errorf("response is nil / empty") + } + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal output to JSON: %w", err) + } + p.Outputln(string(details)) + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal output to YAML: %w", err) + } + p.Outputln(string(details)) + + default: + p.Outputf("Restored version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) + } + return nil +} diff --git a/internal/cmd/beta/kms/version/restore/restore_test.go b/internal/cmd/beta/kms/version/restore/restore_test.go new file mode 100644 index 000000000..ad388135e --- /dev/null +++ b/internal/cmd/beta/kms/version/restore/restore_test.go @@ -0,0 +1,320 @@ +package restore + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" + testVersionNumber = int64(1) + testVersionNumberString = "1" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testVersionNumberString, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + keyIdFlag: testKeyId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + KeyId: testKeyId, + VersionNumber: testVersionNumber, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiRestoreVersionRequest)) kms.ApiRestoreVersionRequest { + request := testClient.RestoreVersion(testCtx, testProjectId, testRegion, testKeyRingId, testKeyId, testVersionNumber) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (versionNumber)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "key ring id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyIdFlag) + }), + isValid: false, + }, + { + description: "key id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "" + }), + isValid: false, + }, + { + description: "key id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "version number invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "version number invalid 2", + argValues: []string{"Not a Number!"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiRestoreVersionRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + wantErr bool + outputFormat string + resp *kms.Version + }{ + { + description: "nil response", + resp: nil, + wantErr: true, + }, + { + description: "default output", + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "json output", + outputFormat: print.JSONOutputFormat, + resp: &kms.Version{}, + wantErr: false, + }, + { + description: "yaml output", + outputFormat: print.YAMLOutputFormat, + resp: &kms.Version{}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/version/version.go b/internal/cmd/beta/kms/version/version.go new file mode 100644 index 000000000..39c90e5c8 --- /dev/null +++ b/internal/cmd/beta/kms/version/version.go @@ -0,0 +1,34 @@ +package version + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/destroy" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/disable" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/enable" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/restore" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "version", + Short: "Manage KMS key versions", + Long: "Provides functionality for key version operations inside the KMS", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(destroy.NewCmd(params)) + cmd.AddCommand(disable.NewCmd(params)) + cmd.AddCommand(enable.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(restore.NewCmd(params)) +} diff --git a/internal/cmd/beta/kms/wrappingkey/create/create.go b/internal/cmd/beta/kms/wrappingkey/create/create.go new file mode 100644 index 000000000..76d8be6b5 --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/create/create.go @@ -0,0 +1,204 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" +) + +const ( + keyRingIdFlag = "keyring-id" + + algorithmFlag = "algorithm" + descriptionFlag = "description" + displayNameFlag = "name" + purposeFlag = "purpose" + protectionFlag = "protection" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string + + Algorithm *string + Description *string + Name *string + Purpose *string + Protection *string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a KMS wrapping key", + Long: "Creates a KMS wrapping key.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a symmetric (RSA + AES) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id"`, + `$ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256_aes_256_key_wrap" --name "my-wrapping-key-name" --purpose "wrap_symmetric_key" --protection "software"`), + examples.NewExample( + `Create an asymmetric (RSA) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id"`, + `$ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_3072_oaep_sha256" --name "my-wrapping-key-name" --purpose "wrap_asymmetric_key" --protection "software"`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + if !model.AssumeYes { + err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS wrapping key?") + if err != nil { + return err + } + } + + // Call API + req, _ := buildRequest(ctx, model, apiClient) + wrappingKey, err := req.Execute() + if err != nil { + return fmt.Errorf("create KMS wrapping key: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating wrapping key") + _, err = wait.CreateWrappingKeyWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *wrappingKey.KeyRingId, *wrappingKey.Id).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for KMS wrapping key creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model, wrappingKey) + }, + } + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // All values are mandatory strings. No additional type check required. + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + Algorithm: flags.FlagToStringPointer(p, cmd, algorithmFlag), + Name: flags.FlagToStringPointer(p, cmd, displayNameFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Purpose: flags.FlagToStringPointer(p, cmd, purposeFlag), + Protection: flags.FlagToStringPointer(p, cmd, protectionFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +type kmsWrappingKeyClient interface { + CreateWrappingKey(ctx context.Context, projectId string, regionId string, keyRingId string) kms.ApiCreateWrappingKeyRequest +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient kmsWrappingKeyClient) (kms.ApiCreateWrappingKeyRequest, error) { + req := apiClient.CreateWrappingKey(ctx, model.ProjectId, model.Region, model.KeyRingId) + + req = req.CreateWrappingKeyPayload(kms.CreateWrappingKeyPayload{ + DisplayName: model.Name, + Description: model.Description, + Algorithm: kms.CreateWrappingKeyPayloadGetAlgorithmAttributeType(model.Algorithm), + Purpose: kms.CreateWrappingKeyPayloadGetPurposeAttributeType(model.Purpose), + Protection: kms.CreateWrappingKeyPayloadGetProtectionAttributeType(model.Protection), + }) + return req, nil +} + +func outputResult(p *print.Printer, model *inputModel, resp *kms.WrappingKey) error { + if resp == nil { + return fmt.Errorf("response is nil") + } + + switch model.OutputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(resp, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS wrapping key: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS wrapping key: %w", err) + } + p.Outputln(string(details)) + + default: + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s wrapping key. Wrapping key ID: %s\n", operationState, utils.PtrString(resp.Id)) + } + + return nil +} + +func configureFlags(cmd *cobra.Command) { + // Algorithm + var algorithmFlagOptions []string + for _, val := range kms.AllowedWrappingAlgorithmEnumValues { + algorithmFlagOptions = append(algorithmFlagOptions, string(val)) + } + cmd.Flags().Var(flags.EnumFlag(false, "", algorithmFlagOptions...), algorithmFlag, fmt.Sprintf("En-/Decryption / signing algorithm. Possible values: %q", algorithmFlagOptions)) + + // Purpose + var purposeFlagOptions []string + for _, val := range kms.AllowedWrappingPurposeEnumValues { + purposeFlagOptions = append(purposeFlagOptions, string(val)) + } + cmd.Flags().Var(flags.EnumFlag(false, "", purposeFlagOptions...), purposeFlag, fmt.Sprintf("Purpose of the wrapping key. Possible values: %q", purposeFlagOptions)) + + // Protection + // backend was deprectaed in /v1beta, but protection is a required attribute with value "software" + var protectionFlagOptions []string + for _, val := range kms.AllowedProtectionEnumValues { + protectionFlagOptions = append(protectionFlagOptions, string(val)) + } + cmd.Flags().Var(flags.EnumFlag(false, "", protectionFlagOptions...), protectionFlag, fmt.Sprintf("The underlying system that is responsible for protecting the wrapping key material. Possible values: %q", purposeFlagOptions)) + + // All further non Enum Flags + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring") + cmd.Flags().String(displayNameFlag, "", "The display name to distinguish multiple wrapping keys") + cmd.Flags().String(descriptionFlag, "", "Optional description of the wrapping key") + + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag, algorithmFlag, purposeFlag, displayNameFlag, protectionFlag) + cobra.CheckErr(err) +} diff --git a/internal/cmd/beta/kms/wrappingkey/create/create_test.go b/internal/cmd/beta/kms/wrappingkey/create/create_test.go new file mode 100644 index 000000000..15616c322 --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/create/create_test.go @@ -0,0 +1,318 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" + testAlgorithm = "rsa_2048_oaep_sha256" + testDisplayName = "my-key" + testPurpose = "wrap_asymmetric_key" + testDescription = "my key description" + testProtection = "software" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + algorithmFlag: testAlgorithm, + displayNameFlag: testDisplayName, + purposeFlag: testPurpose, + descriptionFlag: testDescription, + protectionFlag: testProtection, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + Algorithm: utils.Ptr(testAlgorithm), + Name: utils.Ptr(testDisplayName), + Purpose: utils.Ptr(testPurpose), + Description: utils.Ptr(testDescription), + Protection: utils.Ptr(testProtection), + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiCreateWrappingKeyRequest)) kms.ApiCreateWrappingKeyRequest { + request := testClient.CreateWrappingKey(testCtx, testProjectId, testRegion, testKeyRingId) + request = request.CreateWrappingKeyPayload(kms.CreateWrappingKeyPayload{ + Algorithm: kms.CreateWrappingKeyPayloadGetAlgorithmAttributeType(utils.Ptr(testAlgorithm)), + DisplayName: utils.Ptr(testDisplayName), + Purpose: kms.CreateWrappingKeyPayloadGetPurposeAttributeType(utils.Ptr(testPurpose)), + Description: utils.Ptr(testDescription), + Protection: kms.CreateWrappingKeyPayloadGetProtectionAttributeType(utils.Ptr(testProtection)), + }) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "optional flags omitted", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, descriptionFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + }), + }, + { + description: "no values provided", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "algorithm missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, algorithmFlag) + }), + isValid: false, + }, + { + description: "name missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, displayNameFlag) + }), + isValid: false, + }, + { + description: "purpose missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, purposeFlag) + }), + isValid: false, + }, + { + description: "protection missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, protectionFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiCreateWrappingKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "no optional values", + model: fixtureInputModel(func(model *inputModel) { + model.Description = nil + }), + expectedRequest: fixtureRequest().CreateWrappingKeyPayload(kms.CreateWrappingKeyPayload{ + Algorithm: kms.CreateWrappingKeyPayloadGetAlgorithmAttributeType(utils.Ptr(testAlgorithm)), + DisplayName: utils.Ptr(testDisplayName), + Purpose: kms.CreateWrappingKeyPayloadGetPurposeAttributeType(utils.Ptr(testPurpose)), + Protection: kms.CreateWrappingKeyPayloadGetProtectionAttributeType(utils.Ptr(testProtection)), + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request, err := buildRequest(testCtx, tt.model, testClient) + if err != nil { + t.Fatalf("error building request: %v", err) + } + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + model *inputModel + wrappingKey *kms.WrappingKey + wantErr bool + }{ + { + description: "nil response", + wrappingKey: nil, + wantErr: true, + }, + { + description: "default output", + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{}}, + wrappingKey: &kms.WrappingKey{}, + wantErr: false, + }, + { + description: "json output", + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.JSONOutputFormat}}, + wrappingKey: &kms.WrappingKey{}, + wantErr: false, + }, + { + description: "yaml output", + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.YAMLOutputFormat}}, + wrappingKey: &kms.WrappingKey{}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.model, tt.wrappingKey) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete.go b/internal/cmd/beta/kms/wrappingkey/delete/delete.go new file mode 100644 index 000000000..0ade8822f --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/delete/delete.go @@ -0,0 +1,118 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + wrappingKeyIdArg = "WRAPPING_KEY_ID" + + keyRingIdFlag = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + WrappingKeyId string + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", wrappingKeyIdArg), + Short: "Deletes a KMS wrapping key", + Long: "Deletes a KMS wrapping key inside a specific key ring.", + Args: args.SingleArg(wrappingKeyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a KMS wrapping key "MY_WRAPPING_KEY_ID" inside the key ring "my-keyring-id"`, + `$ stackit beta kms wrapping-key delete "MY_WRAPPING_KEY_ID" --keyring-id "my-keyring-id"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + wrappingKeyName, err := kmsUtils.GetWrappingKeyName(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.WrappingKeyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get wrapping key name: %v", err) + wrappingKeyName = model.WrappingKeyId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete the wrapping key %q? (this cannot be undone)", wrappingKeyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete KMS wrapping key: %w", err) + } + + // Wait for async operation not relevant. Wrapping key deletion is synchronous + + // Don't output anything. It's a deletion. + params.Printer.Info("Deleted wrapping key %q\n", wrappingKeyName) + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + wrappingKeyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + WrappingKeyId: wrappingKeyId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiDeleteWrappingKeyRequest { + req := apiClient.DeleteWrappingKey(ctx, model.ProjectId, model.Region, model.KeyRingId, model.WrappingKeyId) + return req +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring where the wrapping key is stored") + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag) + cobra.CheckErr(err) +} diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go b/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go new file mode 100644 index 000000000..57be1cbfa --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go @@ -0,0 +1,241 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testWrappingKeyId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testWrappingKeyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + WrappingKeyId: testWrappingKeyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiDeleteWrappingKeyRequest)) kms.ApiDeleteWrappingKeyRequest { + request := testClient.DeleteWrappingKey(testCtx, testProjectId, testRegion, testKeyRingId, testWrappingKeyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no args (wrappingKeyId)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values provided", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "key ring id missing (required)", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "key ring id invalid", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "wrapping key id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "wrapping key id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(¶ms.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiDeleteWrappingKeyRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/kms/wrappingkey/list/list.go b/internal/cmd/beta/kms/wrappingkey/list/list.go new file mode 100644 index 000000000..a89babc53 --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/list/list.go @@ -0,0 +1,149 @@ +package list + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + keyRingIdFlag = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all KMS wrapping keys", + Long: "Lists all KMS wrapping keys inside a key ring.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all KMS wrapping keys for the key ring "my-keyring-id"`, + `$ stackit beta kms wrapping-key list --keyring-id "my-keyring-id"`), + examples.NewExample( + `List all KMS wrapping keys in JSON format`, + `$ stackit beta kms wrapping-key list --keyring-id "my-keyring-id" --output-format json`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get KMS wrapping keys: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, model.KeyRingId, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + KeyRingId: flags.FlagToStringValue(p, cmd, keyRingIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiListWrappingKeysRequest { + req := apiClient.ListWrappingKeys(ctx, model.ProjectId, model.Region, model.KeyRingId) + return req +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), keyRingIdFlag, "ID of the KMS key ring where the key is stored") + err := flags.MarkFlagsRequired(cmd, keyRingIdFlag) + cobra.CheckErr(err) +} + +func outputResult(p *print.Printer, outputFormat, keyRingId string, resp *kms.WrappingKeyList) error { + if resp == nil || resp.WrappingKeys == nil { + return fmt.Errorf("response is nil / empty") + } + + wrappingKeys := *resp.WrappingKeys + + switch outputFormat { + case print.JSONOutputFormat: + details, err := json.MarshalIndent(wrappingKeys, "", " ") + if err != nil { + return fmt.Errorf("marshal KMS wrapping keys list: %w", err) + } + p.Outputln(string(details)) + + case print.YAMLOutputFormat: + details, err := yaml.MarshalWithOptions(wrappingKeys, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return fmt.Errorf("marshal KMS wrapping keys list: %w", err) + } + p.Outputln(string(details)) + + default: + if len(wrappingKeys) == 0 { + p.Outputf("No wrapping keys found under the key ring %q\n", keyRingId) + return nil + } + table := tables.NewTable() + table.SetHeader("ID", "NAME", "SCOPE", "ALGORITHM", "EXPIRES AT", "STATUS") + + for i := range wrappingKeys { + wrappingKey := wrappingKeys[i] + table.AddRow( + utils.PtrString(wrappingKey.Id), + utils.PtrString(wrappingKey.DisplayName), + utils.PtrString(wrappingKey.Purpose), + utils.PtrString(wrappingKey.Algorithm), + utils.PtrString(wrappingKey.ExpiresAt), + utils.PtrString(wrappingKey.State), + ) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + } + + return nil +} diff --git a/internal/cmd/beta/kms/wrappingkey/list/list_test.go b/internal/cmd/beta/kms/wrappingkey/list/list_test.go new file mode 100644 index 000000000..93eb4b88b --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/list/list_test.go @@ -0,0 +1,250 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + testRegion = "eu02" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &kms.APIClient{} + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + keyRingIdFlag: testKeyRingId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingId: testKeyRingId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *kms.ApiListWrappingKeysRequest)) kms.ApiListWrappingKeysRequest { + request := testClient.ListWrappingKeys(testCtx, testProjectId, testRegion, testKeyRingId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "missing keyRingId", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, keyRingIdFlag) + }), + isValid: false, + }, + { + description: "invalid keyRingId 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid keyRingId 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[keyRingIdFlag] = "Not an uuid" + }), + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + configureFlags(cmd) + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + p := print.NewPrinter() + model, err := parseInput(p, cmd) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(tt.expectedModel, model) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest kms.ApiListWrappingKeysRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + keyRingId string + resp *kms.WrappingKeyList + outputFormat string + projectLabel string + wantErr bool + }{ + { + description: "nil response", + resp: nil, + projectLabel: "my-project", + wantErr: true, + }, + { + description: "default output", + resp: &kms.WrappingKeyList{WrappingKeys: &[]kms.WrappingKey{}}, + projectLabel: "my-project", + wantErr: false, + }, + { + description: "json output", + resp: &kms.WrappingKeyList{WrappingKeys: &[]kms.WrappingKey{}}, + outputFormat: print.JSONOutputFormat, + wantErr: false, + }, + { + description: "yaml output", + resp: &kms.WrappingKeyList{WrappingKeys: &[]kms.WrappingKey{}}, + outputFormat: print.YAMLOutputFormat, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.outputFormat, tt.keyRingId, tt.resp) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go b/internal/cmd/beta/kms/wrappingkey/wrappingkey.go new file mode 100644 index 000000000..00184a521 --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/wrappingkey.go @@ -0,0 +1,30 @@ +package wrappingkey + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "wrapping-key", + Short: "Manage KMS wrapping keys", + Long: "Provides functionality for wrapping key operations inside the KMS", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) +} diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index cc5f2214d..8e349c6bc 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -80,7 +80,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { `$ stackit beta sqlserverflex instance create --name my-instance --flavor-id xxx`), examples.NewExample( `Create a SQLServer Flex instance with name "my-instance", specify flavor by CPU and RAM, set storage size to 20 GB, and restrict access to a specific range of IP addresses. Other parameters are set to default values`, - `$ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24`), + `$ stackit beta sqlserverflex instance create --name my-instance --cpu 1 --ram 4 --storage-size 20 --acl 1.2.3.0/24`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index 5e4dfa540..e694e8901 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -37,6 +37,7 @@ const ( redisCustomEndpointFlag = "redis-custom-endpoint" resourceManagerCustomEndpointFlag = "resource-manager-custom-endpoint" secretsManagerCustomEndpointFlag = "secrets-manager-custom-endpoint" + kmsCustomEndpointFlag = "kms-custom-endpoint" serverBackupCustomEndpointFlag = "serverbackup-custom-endpoint" serverOsUpdateCustomEndpointFlag = "server-osupdate-custom-endpoint" runCommandCustomEndpointFlag = "runcommand-custom-endpoint" @@ -150,6 +151,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(redisCustomEndpointFlag, "", "Redis API base URL, used in calls to this API") cmd.Flags().String(resourceManagerCustomEndpointFlag, "", "Resource Manager API base URL, used in calls to this API") cmd.Flags().String(secretsManagerCustomEndpointFlag, "", "Secrets Manager API base URL, used in calls to this API") + cmd.Flags().String(kmsCustomEndpointFlag, "", "KMS API base URL, used in calls to this API") cmd.Flags().String(serviceAccountCustomEndpointFlag, "", "Service Account API base URL, used in calls to this API") cmd.Flags().String(serviceEnablementCustomEndpointFlag, "", "Service Enablement API base URL, used in calls to this API") cmd.Flags().String(serverBackupCustomEndpointFlag, "", "Server Backup API base URL, used in calls to this API") @@ -197,6 +199,8 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) err = viper.BindPFlag(config.SecretsManagerCustomEndpointKey, cmd.Flags().Lookup(secretsManagerCustomEndpointFlag)) cobra.CheckErr(err) + err = viper.BindPFlag(config.KMSCustomEndpointKey, cmd.Flags().Lookup(kmsCustomEndpointFlag)) + cobra.CheckErr(err) err = viper.BindPFlag(config.ServerBackupCustomEndpointKey, cmd.Flags().Lookup(serverBackupCustomEndpointFlag)) cobra.CheckErr(err) err = viper.BindPFlag(config.ServerOsUpdateCustomEndpointKey, cmd.Flags().Lookup(serverOsUpdateCustomEndpointFlag)) diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index e7b6fd6fa..28ed935b9 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -41,6 +41,7 @@ const ( redisCustomEndpointFlag = "redis-custom-endpoint" resourceManagerCustomEndpointFlag = "resource-manager-custom-endpoint" secretsManagerCustomEndpointFlag = "secrets-manager-custom-endpoint" + kmsCustomEndpointFlag = "kms-custom-endpoint" serviceAccountCustomEndpointFlag = "service-account-custom-endpoint" serviceEnablementCustomEndpointFlag = "service-enablement-custom-endpoint" serverBackupCustomEndpointFlag = "serverbackup-custom-endpoint" @@ -78,6 +79,7 @@ type inputModel struct { RedisCustomEndpoint bool ResourceManagerCustomEndpoint bool SecretsManagerCustomEndpoint bool + KMSCustomEndpoint bool ServerBackupCustomEndpoint bool ServerOsUpdateCustomEndpoint bool RunCommandCustomEndpoint bool @@ -180,6 +182,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if model.SecretsManagerCustomEndpoint { viper.Set(config.SecretsManagerCustomEndpointKey, "") } + if model.KMSCustomEndpoint { + viper.Set(config.KMSCustomEndpointKey, "") + } if model.ServiceAccountCustomEndpoint { viper.Set(config.ServiceAccountCustomEndpointKey, "") } @@ -245,6 +250,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(redisCustomEndpointFlag, false, "Redis API base URL. If unset, uses the default base URL") cmd.Flags().Bool(resourceManagerCustomEndpointFlag, false, "Resource Manager API base URL. If unset, uses the default base URL") cmd.Flags().Bool(secretsManagerCustomEndpointFlag, false, "Secrets Manager API base URL. If unset, uses the default base URL") + cmd.Flags().Bool(kmsCustomEndpointFlag, false, "KMS API base URL. If unset, uses the default base URL") cmd.Flags().Bool(serviceAccountCustomEndpointFlag, false, "Service Account API base URL. If unset, uses the default base URL") cmd.Flags().Bool(serviceEnablementCustomEndpointFlag, false, "Service Enablement API base URL. If unset, uses the default base URL") cmd.Flags().Bool(serverBackupCustomEndpointFlag, false, "Server Backup base URL. If unset, uses the default base URL") @@ -283,6 +289,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { RedisCustomEndpoint: flags.FlagToBoolValue(p, cmd, redisCustomEndpointFlag), ResourceManagerCustomEndpoint: flags.FlagToBoolValue(p, cmd, resourceManagerCustomEndpointFlag), SecretsManagerCustomEndpoint: flags.FlagToBoolValue(p, cmd, secretsManagerCustomEndpointFlag), + KMSCustomEndpoint: flags.FlagToBoolValue(p, cmd, kmsCustomEndpointFlag), ServiceAccountCustomEndpoint: flags.FlagToBoolValue(p, cmd, serviceAccountCustomEndpointFlag), ServiceEnablementCustomEndpoint: flags.FlagToBoolValue(p, cmd, serviceEnablementCustomEndpointFlag), ServerBackupCustomEndpoint: flags.FlagToBoolValue(p, cmd, serverBackupCustomEndpointFlag), diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index 246696f15..e48dff384 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -35,6 +35,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool redisCustomEndpointFlag: true, resourceManagerCustomEndpointFlag: true, secretsManagerCustomEndpointFlag: true, + kmsCustomEndpointFlag: true, serviceAccountCustomEndpointFlag: true, serverBackupCustomEndpointFlag: true, serverOsUpdateCustomEndpointFlag: true, @@ -74,6 +75,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { RedisCustomEndpoint: true, ResourceManagerCustomEndpoint: true, SecretsManagerCustomEndpoint: true, + KMSCustomEndpoint: true, ServiceAccountCustomEndpoint: true, ServerBackupCustomEndpoint: true, ServerOsUpdateCustomEndpoint: true, @@ -129,6 +131,7 @@ func TestParseInput(t *testing.T) { model.RedisCustomEndpoint = false model.ResourceManagerCustomEndpoint = false model.SecretsManagerCustomEndpoint = false + model.KMSCustomEndpoint = false model.ServiceAccountCustomEndpoint = false model.ServerBackupCustomEndpoint = false model.ServerOsUpdateCustomEndpoint = false @@ -219,6 +222,16 @@ func TestParseInput(t *testing.T) { model.SecretsManagerCustomEndpoint = false }), }, + { + description: "kms custom endpoint empty", + flagValues: fixtureFlagValues(func(flagValues map[string]bool) { + flagValues[kmsCustomEndpointFlag] = false + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.KMSCustomEndpoint = false + }), + }, { description: "service account custom endpoint empty", flagValues: fixtureFlagValues(func(flagValues map[string]bool) { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 957d7c475..a8c136996 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -36,6 +36,7 @@ const ( RedisCustomEndpointKey = "redis_custom_endpoint" ResourceManagerEndpointKey = "resource_manager_custom_endpoint" SecretsManagerCustomEndpointKey = "secrets_manager_custom_endpoint" + KMSCustomEndpointKey = "kms_custom_endpoint" ServiceAccountCustomEndpointKey = "service_account_custom_endpoint" ServiceEnablementCustomEndpointKey = "service_enablement_custom_endpoint" ServerBackupCustomEndpointKey = "serverbackup_custom_endpoint" @@ -95,6 +96,7 @@ var ConfigKeys = []string{ RedisCustomEndpointKey, ResourceManagerEndpointKey, SecretsManagerCustomEndpointKey, + KMSCustomEndpointKey, ServiceAccountCustomEndpointKey, ServiceEnablementCustomEndpointKey, ServerBackupCustomEndpointKey, @@ -180,6 +182,7 @@ func setConfigDefaults() { viper.SetDefault(PostgresFlexCustomEndpointKey, "") viper.SetDefault(ResourceManagerEndpointKey, "") viper.SetDefault(SecretsManagerCustomEndpointKey, "") + viper.SetDefault(KMSCustomEndpointKey, "") viper.SetDefault(ServiceAccountCustomEndpointKey, "") viper.SetDefault(ServiceEnablementCustomEndpointKey, "") viper.SetDefault(ServerBackupCustomEndpointKey, "") diff --git a/internal/pkg/services/kms/client/client.go b/internal/pkg/services/kms/client/client.go new file mode 100644 index 000000000..b2cbd8250 --- /dev/null +++ b/internal/pkg/services/kms/client/client.go @@ -0,0 +1,45 @@ +package client + +import ( + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/viper" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +func ConfigureClient(p *print.Printer, cliVersion string) (*kms.APIClient, error) { + authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) + if err != nil { + p.Debug(print.ErrorLevel, "configure authentication: %v", err) + return nil, &errors.AuthError{} + } + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } + + customEndpoint := viper.GetString(config.KMSCustomEndpointKey) + + if customEndpoint != "" { + cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) + } + + if p.IsVerbosityDebug() { + cfgOptions = append(cfgOptions, + sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), + ) + } + + apiClient, err := kms.NewAPIClient(cfgOptions...) + if err != nil { + p.Debug(print.ErrorLevel, "create new API client: %v", err) + return nil, &errors.AuthError{} + } + + return apiClient, nil +} diff --git a/internal/pkg/services/kms/utils/utils.go b/internal/pkg/services/kms/utils/utils.go new file mode 100644 index 000000000..5630e27d6 --- /dev/null +++ b/internal/pkg/services/kms/utils/utils.go @@ -0,0 +1,67 @@ +package utils + +import ( + "context" + "fmt" + "time" + + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +type KMSClient interface { + GetKeyExecute(ctx context.Context, projectId string, regionId string, keyRingId string, keyId string) (*kms.Key, error) + GetKeyRingExecute(ctx context.Context, projectId string, regionId string, keyRingId string) (*kms.KeyRing, error) + GetWrappingKeyExecute(ctx context.Context, projectId string, regionId string, keyRingId string, wrappingKeyId string) (*kms.WrappingKey, error) +} + +func GetKeyName(ctx context.Context, apiClient KMSClient, projectId, region, keyRingId, keyId string) (string, error) { + resp, err := apiClient.GetKeyExecute(ctx, projectId, region, keyRingId, keyId) + if err != nil { + return "", fmt.Errorf("get KMS Key: %w", err) + } + + if resp == nil || resp.DisplayName == nil { + return "", fmt.Errorf("response is nil / empty") + } + + return *resp.DisplayName, nil +} + +func GetKeyDeletionDate(ctx context.Context, apiClient KMSClient, projectId, region, keyRingId, keyId string) (time.Time, error) { + resp, err := apiClient.GetKeyExecute(ctx, projectId, region, keyRingId, keyId) + if err != nil { + return time.Now(), fmt.Errorf("get KMS Key: %w", err) + } + + if resp == nil || resp.DeletionDate == nil { + return time.Time{}, fmt.Errorf("response is nil / empty") + } + + return *resp.DeletionDate, nil +} + +func GetKeyRingName(ctx context.Context, apiClient KMSClient, projectId, id, region string) (string, error) { + resp, err := apiClient.GetKeyRingExecute(ctx, projectId, region, id) + if err != nil { + return "", fmt.Errorf("get KMS key ring: %w", err) + } + + if resp == nil || resp.DisplayName == nil { + return "", fmt.Errorf("response is nil / empty") + } + + return *resp.DisplayName, nil +} + +func GetWrappingKeyName(ctx context.Context, apiClient KMSClient, projectId, region, keyRingId, wrappingKeyId string) (string, error) { + resp, err := apiClient.GetWrappingKeyExecute(ctx, projectId, region, keyRingId, wrappingKeyId) + if err != nil { + return "", fmt.Errorf("get KMS Wrapping Key: %w", err) + } + + if resp == nil || resp.DisplayName == nil { + return "", fmt.Errorf("response is nil / empty") + } + + return *resp.DisplayName, nil +} diff --git a/internal/pkg/services/kms/utils/utils_test.go b/internal/pkg/services/kms/utils/utils_test.go new file mode 100644 index 000000000..339cb2d3a --- /dev/null +++ b/internal/pkg/services/kms/utils/utils_test.go @@ -0,0 +1,257 @@ +package utils + +import ( + "context" + "fmt" + "testing" + "time" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +var ( + testProjectId = uuid.NewString() + testKeyRingId = uuid.NewString() + testKeyId = uuid.NewString() + testWrappingKeyId = uuid.NewString() +) + +const ( + testRegion = "eu01" + testKeyName = "my-test-key" + testKeyRingName = "my-key-ring" + testWrappingKeyName = "my-wrapping-key" +) + +type kmsClientMocked struct { + getKeyFails bool + getKeyResp *kms.Key + getKeyRingFails bool + getKeyRingResp *kms.KeyRing + getWrappingKeyFails bool + getWrappingKeyResp *kms.WrappingKey +} + +// Implement the KMSClient interface methods for the mock. +func (m *kmsClientMocked) GetKeyExecute(_ context.Context, _, _, _, _ string) (*kms.Key, error) { + if m.getKeyFails { + return nil, fmt.Errorf("could not get key") + } + return m.getKeyResp, nil +} + +func (m *kmsClientMocked) GetKeyRingExecute(_ context.Context, _, _, _ string) (*kms.KeyRing, error) { + if m.getKeyRingFails { + return nil, fmt.Errorf("could not get key ring") + } + return m.getKeyRingResp, nil +} + +func (m *kmsClientMocked) GetWrappingKeyExecute(_ context.Context, _, _, _, _ string) (*kms.WrappingKey, error) { + if m.getWrappingKeyFails { + return nil, fmt.Errorf("could not get wrapping key") + } + return m.getWrappingKeyResp, nil +} + +func TestGetKeyName(t *testing.T) { + keyName := testKeyName + + tests := []struct { + description string + getKeyFails bool + getKeyResp *kms.Key + isValid bool + expectedOutput string + }{ + { + description: "base", + getKeyResp: &kms.Key{ + DisplayName: &keyName, + }, + isValid: true, + expectedOutput: testKeyName, + }, + { + description: "get key fails", + getKeyFails: true, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &kmsClientMocked{ + getKeyFails: tt.getKeyFails, + getKeyResp: tt.getKeyResp, + } + + output, err := GetKeyName(context.Background(), client, testProjectId, testRegion, testKeyRingId, testKeyId) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input: %v", err) + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %q, got %q", tt.expectedOutput, output) + } + }) + } +} + +// TestGetKeyDeletionDate tests the GetKeyDeletionDate function. +func TestGetKeyDeletionDate(t *testing.T) { + mockTime := time.Date(2025, 8, 20, 0, 0, 0, 0, time.UTC) + + tests := []struct { + description string + getKeyFails bool + getKeyResp *kms.Key + isValid bool + expectedOutput time.Time + }{ + { + description: "base", + getKeyResp: &kms.Key{ + DeletionDate: &mockTime, + }, + isValid: true, + expectedOutput: mockTime, + }, + { + description: "get key fails", + getKeyFails: true, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &kmsClientMocked{ + getKeyFails: tt.getKeyFails, + getKeyResp: tt.getKeyResp, + } + + output, err := GetKeyDeletionDate(context.Background(), client, testProjectId, testRegion, testKeyRingId, testKeyId) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input: %v", err) + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if !output.Equal(tt.expectedOutput) { + t.Errorf("expected output to be %v, got %v", tt.expectedOutput, output) + } + }) + } +} + +// TestGetKeyRingName tests the GetKeyRingName function. +func TestGetKeyRingName(t *testing.T) { + keyRingName := testKeyRingName + + tests := []struct { + description string + getKeyRingFails bool + getKeyRingResp *kms.KeyRing + isValid bool + expectedOutput string + }{ + { + description: "base", + getKeyRingResp: &kms.KeyRing{ + DisplayName: &keyRingName, + }, + isValid: true, + expectedOutput: testKeyRingName, + }, + { + description: "get key ring fails", + getKeyRingFails: true, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &kmsClientMocked{ + getKeyRingFails: tt.getKeyRingFails, + getKeyRingResp: tt.getKeyRingResp, + } + + output, err := GetKeyRingName(context.Background(), client, testProjectId, testKeyRingId, testRegion) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input: %v", err) + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %q, got %q", tt.expectedOutput, output) + } + }) + } +} + +func TestGetWrappingKeyName(t *testing.T) { + wrappingKeyName := testWrappingKeyName + tests := []struct { + description string + getWrappingKeyFails bool + getWrappingKeyResp *kms.WrappingKey + isValid bool + expectedOutput string + }{ + { + description: "base", + getWrappingKeyResp: &kms.WrappingKey{ + DisplayName: &wrappingKeyName, + }, + isValid: true, + expectedOutput: testWrappingKeyName, + }, + { + description: "get wrapping key fails", + getWrappingKeyFails: true, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &kmsClientMocked{ + getWrappingKeyFails: tt.getWrappingKeyFails, + getWrappingKeyResp: tt.getWrappingKeyResp, + } + + output, err := GetWrappingKeyName(context.Background(), client, testProjectId, testRegion, testKeyRingId, testWrappingKeyId) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input: %v", err) + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %q, got %q", tt.expectedOutput, output) + } + }) + } +} From 75569dd538e5f2b41ae3a85dd5a4e57c370db831 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 18:50:13 +0100 Subject: [PATCH 177/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/resourcemanager (#1053) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index fe8258d95..723b49055 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 @@ -238,11 +238,11 @@ require ( github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect + github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 diff --git a/go.sum b/go.sum index 64b7cd08f..a7ee1080a 100644 --- a/go.sum +++ b/go.sum @@ -569,12 +569,12 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0/go.mod h1:KEPVoO21pC4bjy5l0nyhjUJ0+uVwVWb+k2TYrzJ8xYw= github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 h1:/weT7P5Uwy1Qlhw0NidqtQBlbbb/dQehweDV/I9ShXg= github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 h1:dnEjyapuv8WwRN5vE2z6+4/+ZqQTBx+bX27x2nOF7Jw= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0/go.mod h1:KEPVoO21pC4bjy5l0nyhjUJ0+uVwVWb+k2TYrzJ8xYw= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= @@ -595,8 +595,8 @@ github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 h1:ALrDCBih8Fu8 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1/go.mod h1:+qGWSehoV0Js3FalgvT/bOgPj+UqW4I7lP5s8uAxP+o= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 h1:8uPt82Ez34OYMOijjEYxB1zUW6kiybkt6veQKl0AL68= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1/go.mod h1:1Y2GEICmZDt+kr8aGnBx/sjYVAIYHmtfC8xYi9oxNEE= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1 h1:r7oaINTwLmIG31AaqKTuQHHFF8YNuYGzi+46DOuSjw4= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.17.1/go.mod h1:ipcrPRbwfQXHH18dJVfY7K5ujHF5dTT6isoXgmA7YwQ= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 h1:en8IomJeGqZZgGOyLH53PNDCv2F/x4zURz4mGSlhTKs= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0/go.mod h1:0wVdzrB4PhwhTE6drOVA6rETTmJ+k3eHa0neuxpDM/g= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oPt08I2WLsxJDoVDsPMW2VkvKW7/SlUv10= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1/go.mod h1:tip0Ob6x06luy3CmRrmnCMtU5cha95fQLdvZlno3J4w= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 h1:WKFzlHllql3JsVcAq+Y1m5pSMkvwp1qH3Vf2N7i8CPg= From f2ed887a1bf48cf04d18c4b542a0894b10032e76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:58:35 +0000 Subject: [PATCH 178/422] chore(deps): bump renovatebot/github-action from 43.0.18 to 43.0.19 (#1052) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 0ebc69e31..8dab86076 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.18 + uses: renovatebot/github-action@v43.0.19 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From af803a3c0293f2550632b5b6f6f361c07dcc102c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 28 Oct 2025 11:39:38 +0100 Subject: [PATCH 179/422] fix(mariadb): print valid JSON/YAML for list commands (#1036) relates to STACKITCLI-263 / #893 --- internal/cmd/mariadb/credentials/list/list.go | 24 ++++++++++--------- .../cmd/mariadb/credentials/list/list_test.go | 21 ++++++++-------- internal/cmd/mariadb/instance/list/list.go | 24 ++++++++++--------- .../cmd/mariadb/instance/list/list_test.go | 15 ++++++------ internal/cmd/mariadb/plans/plans.go | 24 ++++++++++--------- internal/cmd/mariadb/plans/plans_test.go | 15 ++++++------ 6 files changed, 63 insertions(+), 60 deletions(-) diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index b52bf3720..2ba92d3e0 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -66,22 +66,19 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list MariaDB credentials: %w", err) } - credentials := *resp.CredentialsList - if len(credentials) == 0 { - instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = model.InstanceId - } - params.Printer.Info("No credentials found for instance %q\n", instanceLabel) - return nil + credentials := resp.GetCredentialsList() + + instanceLabel, err := mariadbUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId } // Truncate output if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, credentials) }, } configureFlags(cmd) @@ -125,8 +122,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mariadb.API return req } -func outputResult(p *print.Printer, outputFormat string, credentials []mariadb.CredentialsListItem) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, credentials []mariadb.CredentialsListItem) error { return p.OutputResult(outputFormat, credentials, func() error { + if len(credentials) == 0 { + p.Outputf("No credentials found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID") for i := range credentials { diff --git a/internal/cmd/mariadb/credentials/list/list_test.go b/internal/cmd/mariadb/credentials/list/list_test.go index 1a56a7b6b..7b7b041cb 100644 --- a/internal/cmd/mariadb/credentials/list/list_test.go +++ b/internal/cmd/mariadb/credentials/list/list_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -27,9 +25,9 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -82,21 +80,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -174,8 +172,9 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - credentials []mariadb.CredentialsListItem + outputFormat string + instanceLabel string + credentials []mariadb.CredentialsListItem } tests := []struct { name string @@ -207,7 +206,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 56e1b0e43..6bf70a322 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get MariaDB instances: %w", err) } - instances := *resp.Instances - if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil + instances := resp.GetInstances() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mariadb.API return req } -func outputResult(p *print.Printer, outputFormat string, instances []mariadb.Instance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []mariadb.Instance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { diff --git a/internal/cmd/mariadb/instance/list/list_test.go b/internal/cmd/mariadb/instance/list/list_test.go index 14587ff87..092af5002 100644 --- a/internal/cmd/mariadb/instance/list/list_test.go +++ b/internal/cmd/mariadb/instance/list/list_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -79,21 +77,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -151,6 +149,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instances []mariadb.Instance } tests := []struct { @@ -183,7 +182,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index e66d67052..a09b9cb56 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get MariaDB service plans: %w", err) } - plans := *resp.Offerings - if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No plans found for project %q\n", projectLabel) - return nil + plans := resp.GetOfferings() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, projectLabel, plans) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *mariadb.API return req } -func outputResult(p *print.Printer, outputFormat string, plans []mariadb.Offering) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []mariadb.Offering) error { return p.OutputResult(outputFormat, plans, func() error { + if len(plans) == 0 { + p.Outputf("No plans found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { diff --git a/internal/cmd/mariadb/plans/plans_test.go b/internal/cmd/mariadb/plans/plans_test.go index f63a84125..411579760 100644 --- a/internal/cmd/mariadb/plans/plans_test.go +++ b/internal/cmd/mariadb/plans/plans_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -79,21 +77,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -151,6 +149,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string plans []mariadb.Offering } tests := []struct { @@ -183,7 +182,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From d6772b08181f9396dbcc3711acb242e6b545eb87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 28 Oct 2025 15:13:28 +0100 Subject: [PATCH 180/422] fix(logme): print valid JSON/YAML output for list cmds (#1038) relates to STACKITCLI-264 / #893 --- internal/cmd/logme/credentials/list/list.go | 24 ++++++++++--------- .../cmd/logme/credentials/list/list_test.go | 21 ++++++++-------- internal/cmd/logme/instance/list/list.go | 24 ++++++++++--------- internal/cmd/logme/instance/list/list_test.go | 15 ++++++------ internal/cmd/logme/plans/plans.go | 24 ++++++++++--------- internal/cmd/logme/plans/plans_test.go | 15 ++++++------ 6 files changed, 63 insertions(+), 60 deletions(-) diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index 2d0065a72..eda5d8917 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -67,22 +67,19 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list LogMe credentials: %w", err) } - credentials := *resp.CredentialsList - if len(credentials) == 0 { - instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = model.InstanceId - } - params.Printer.Info("No credentials found for instance %q\n", instanceLabel) - return nil + credentials := resp.GetCredentialsList() + + instanceLabel, err := logmeUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId } // Truncate output if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, credentials) }, } configureFlags(cmd) @@ -126,8 +123,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *logme.APICl return req } -func outputResult(p *print.Printer, outputFormat string, credentials []logme.CredentialsListItem) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, credentials []logme.CredentialsListItem) error { return p.OutputResult(outputFormat, credentials, func() error { + if len(credentials) == 0 { + p.Outputf("No credentials found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID") for i := range credentials { diff --git a/internal/cmd/logme/credentials/list/list_test.go b/internal/cmd/logme/credentials/list/list_test.go index fc6c5069b..73a86bad3 100644 --- a/internal/cmd/logme/credentials/list/list_test.go +++ b/internal/cmd/logme/credentials/list/list_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/logme" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -27,9 +25,9 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -82,21 +80,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -174,8 +172,9 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - credentials []logme.CredentialsListItem + outputFormat string + instanceLabel string + credentials []logme.CredentialsListItem } tests := []struct { name string @@ -206,7 +205,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index 201d49d53..ff5c8c55c 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get LogMe instances: %w", err) } - instances := *resp.Instances - if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil + instances := resp.GetInstances() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *logme.APICl return req } -func outputResult(p *print.Printer, outputFormat string, instances []logme.Instance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []logme.Instance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { diff --git a/internal/cmd/logme/instance/list/list_test.go b/internal/cmd/logme/instance/list/list_test.go index b3a95fc2b..10c36c2ba 100644 --- a/internal/cmd/logme/instance/list/list_test.go +++ b/internal/cmd/logme/instance/list/list_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/logme" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -79,21 +77,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -151,6 +149,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instances []logme.Instance } tests := []struct { @@ -182,7 +181,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index 72a601109..227900628 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get LogMe service plans: %w", err) } - plans := *resp.Offerings - if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No plans found for project %q\n", projectLabel) - return nil + plans := resp.GetOfferings() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, projectLabel, plans) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *logme.APICl return req } -func outputResult(p *print.Printer, outputFormat string, plans []logme.Offering) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []logme.Offering) error { return p.OutputResult(outputFormat, plans, func() error { + if len(plans) == 0 { + p.Outputf("No plans found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { diff --git a/internal/cmd/logme/plans/plans_test.go b/internal/cmd/logme/plans/plans_test.go index 83980c517..0f93fa3a9 100644 --- a/internal/cmd/logme/plans/plans_test.go +++ b/internal/cmd/logme/plans/plans_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/logme" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -79,21 +77,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -151,6 +149,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string plans []logme.Offering } tests := []struct { @@ -182,7 +181,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From 611d185d2c592a29c61961eb2a80f614a60cb5ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Oct 2025 14:21:52 +0000 Subject: [PATCH 181/422] chore(deps): bump github.com/jedib0t/go-pretty/v6 from 6.6.8 to 6.6.9 (#1059) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 723b49055..f5d9080d3 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.6.8 + github.com/jedib0t/go-pretty/v6 v6.6.9 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 diff --git a/go.sum b/go.sum index a7ee1080a..1c421db57 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.6.8 h1:JnnzQeRz2bACBobIaa/r+nqjvws4yEhcmaZ4n1QzsEc= -github.com/jedib0t/go-pretty/v6 v6.6.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.6.9 h1:PQecJLK3L8ODuVyMe2223b61oRJjrKnmXAncbWTv9MY= +github.com/jedib0t/go-pretty/v6 v6.6.9/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From 71b3950e62fcae057e2db0b776d26371ba65fa01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 29 Oct 2025 08:04:17 +0100 Subject: [PATCH 182/422] fix(git): print valid JSON/YAML output for list cmds (#1039) relates to STACKITCLI-265 / #893 --- docs/stackit_git_instance_create.md | 4 +-- internal/cmd/git/flavor/list/list.go | 30 ++++++++++++--------- internal/cmd/git/flavor/list/list_test.go | 3 ++- internal/cmd/git/instance/create/create.go | 4 +-- internal/cmd/git/instance/list/list.go | 30 ++++++++++++--------- internal/cmd/git/instance/list/list_test.go | 3 ++- 6 files changed, 44 insertions(+), 30 deletions(-) diff --git a/docs/stackit_git_instance_create.md b/docs/stackit_git_instance_create.md index e5d8bba93..a82c92ec4 100644 --- a/docs/stackit_git_instance_create.md +++ b/docs/stackit_git_instance_create.md @@ -17,10 +17,10 @@ stackit git instance create [flags] $ stackit git instance create --name my-new-instance Create a instance with name 'my-new-instance' and flavor - $ stackit git instance create --name my-new-instance --flavor git-100' + $ stackit git instance create --name my-new-instance --flavor git-100 Create a instance with name 'my-new-instance' and acl - $ stackit git instance create --name my-new-instance --acl 1.1.1.1/1' + $ stackit git instance create --name my-new-instance --acl 1.1.1.1/1 ``` ### Options diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index 68b674830..c8c8fe583 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -60,19 +60,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get STACKIT Git flavors: %w", err) } - flavors := *resp.Flavors - if len(flavors) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No flavors found for project %q\n", projectLabel) - return nil - } else if model.Limit != nil && len(flavors) > int(*model.Limit) { + flavors := resp.GetFlavors() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + // Truncate output + if model.Limit != nil && len(flavors) > int(*model.Limit) { flavors = (flavors)[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, flavors) + + return outputResult(params.Printer, model.OutputFormat, projectLabel, flavors) }, } configureFlags(cmd) @@ -110,8 +111,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClie return apiClient.ListFlavors(ctx, model.ProjectId) } -func outputResult(p *print.Printer, outputFormat string, flavors []git.Flavor) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, flavors []git.Flavor) error { return p.OutputResult(outputFormat, flavors, func() error { + if len(flavors) == 0 { + p.Outputf("No flavors found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "DESCRIPTION", "DISPLAY_NAME", "AVAILABLE", "SKU") for i := range flavors { diff --git a/internal/cmd/git/flavor/list/list_test.go b/internal/cmd/git/flavor/list/list_test.go index d5a6e2f54..8c2aca50a 100644 --- a/internal/cmd/git/flavor/list/list_test.go +++ b/internal/cmd/git/flavor/list/list_test.go @@ -161,6 +161,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string flavors []git.Flavor } tests := []struct { @@ -192,7 +193,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.flavors); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.flavors); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index 296a44598..8c6c56ac4 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -46,11 +46,11 @@ func NewCmd(params *params.CmdParams) *cobra.Command { ), examples.NewExample( `Create a instance with name 'my-new-instance' and flavor`, - `$ stackit git instance create --name my-new-instance --flavor git-100'`, + `$ stackit git instance create --name my-new-instance --flavor git-100`, ), examples.NewExample( `Create a instance with name 'my-new-instance' and acl`, - `$ stackit git instance create --name my-new-instance --acl 1.1.1.1/1'`, + `$ stackit git instance create --name my-new-instance --acl 1.1.1.1/1`, ), ), RunE: func(cmd *cobra.Command, args []string) (err error) { diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index 1499ecfdf..161af2df4 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -61,19 +61,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get STACKIT Git instances: %w", err) } - instances := *resp.Instances - if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil - } else if model.Limit != nil && len(instances) > int(*model.Limit) { + instances := resp.GetInstances() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + // Truncate output + if model.Limit != nil && len(instances) > int(*model.Limit) { instances = (instances)[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } configureFlags(cmd) @@ -111,8 +112,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *git.APIClie return apiClient.ListInstances(ctx, model.ProjectId) } -func outputResult(p *print.Printer, outputFormat string, instances []git.Instance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []git.Instance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "URL", "VERSION", "STATE", "CREATED") for i := range instances { diff --git a/internal/cmd/git/instance/list/list_test.go b/internal/cmd/git/instance/list/list_test.go index 8d6ac21a6..36fa36f10 100644 --- a/internal/cmd/git/instance/list/list_test.go +++ b/internal/cmd/git/instance/list/list_test.go @@ -161,6 +161,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instances []git.Instance } tests := []struct { @@ -192,7 +193,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From 03ca81085069740e49daaf8f738f0880ed770ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 29 Oct 2025 08:28:02 +0100 Subject: [PATCH 183/422] fix(objectstorage): print valid JSON/YAML for list cmds (#1041) relates to STACKITCLI-267 / #893 --- .../bucket/create/create_test.go | 20 +++++++-------- .../bucket/delete/delete_test.go | 20 +++++++-------- .../bucket/describe/describe_test.go | 20 +++++++-------- .../cmd/object-storage/bucket/list/list.go | 24 ++++++++++-------- .../object-storage/bucket/list/list_test.go | 18 ++++++------- .../credentials-group/create/create_test.go | 22 ++++++++-------- .../credentials-group/delete/delete_test.go | 16 ++++++------ .../credentials-group/list/list.go | 11 ++++---- .../credentials-group/list/list_test.go | 18 ++++++------- .../credentials/create/create_test.go | 24 +++++++++--------- .../credentials/delete/delete_test.go | 22 ++++++++-------- .../object-storage/credentials/list/list.go | 25 ++++++++++--------- .../credentials/list/list_test.go | 24 ++++++++---------- .../object-storage/disable/disable_test.go | 16 ++++++------ .../cmd/object-storage/enable/enable_test.go | 16 ++++++------ 15 files changed, 144 insertions(+), 152 deletions(-) diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index b6e926cd2..976dab8a0 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -15,16 +15,16 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" -var testBucketName = "my-bucket" + +const ( + testRegion = "eu01" + testBucketName = "my-bucket" +) func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -38,8 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -107,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -115,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -123,7 +123,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/bucket/delete/delete_test.go b/internal/cmd/object-storage/bucket/delete/delete_test.go index 2dfe69ec6..829c374cf 100644 --- a/internal/cmd/object-storage/bucket/delete/delete_test.go +++ b/internal/cmd/object-storage/bucket/delete/delete_test.go @@ -13,16 +13,16 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" -var testBucketName = "my-bucket" + +const ( + testRegion = "eu01" + testBucketName = "my-bucket" +) func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -36,8 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -105,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/bucket/describe/describe_test.go b/internal/cmd/object-storage/bucket/describe/describe_test.go index df76123d2..a55f90bc1 100644 --- a/internal/cmd/object-storage/bucket/describe/describe_test.go +++ b/internal/cmd/object-storage/bucket/describe/describe_test.go @@ -15,16 +15,16 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" -var testBucketName = "my-bucket" + +const ( + testRegion = "eu01" + testBucketName = "my-bucket" +) func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -38,8 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -107,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -115,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -123,7 +123,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index fd0ec0552..595b095b9 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -64,23 +64,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get Object Storage buckets: %w", err) } - if resp.Buckets == nil || len(*resp.Buckets) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No buckets found for project %s\n", projectLabel) - return nil + buckets := resp.GetBuckets() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } - buckets := *resp.Buckets // Truncate output if model.Limit != nil && len(buckets) > int(*model.Limit) { buckets = buckets[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, buckets) + return outputResult(params.Printer, model.OutputFormat, projectLabel, buckets) }, } @@ -120,12 +117,17 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstora return req } -func outputResult(p *print.Printer, outputFormat string, buckets []objectstorage.Bucket) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, buckets []objectstorage.Bucket) error { if buckets == nil { return fmt.Errorf("buckets is empty") } return p.OutputResult(outputFormat, buckets, func() error { + if len(buckets) == 0 { + p.Outputf("No buckets found for project %s\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("NAME", "REGION", "URL (PATH STYLE)", "URL (VIRTUAL HOSTED STYLE)") for i := range buckets { diff --git a/internal/cmd/object-storage/bucket/list/list_test.go b/internal/cmd/object-storage/bucket/list/list_test.go index 3d70ff50b..93b467433 100644 --- a/internal/cmd/object-storage/bucket/list/list_test.go +++ b/internal/cmd/object-storage/bucket/list/list_test.go @@ -16,9 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -28,9 +25,9 @@ var testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -83,21 +80,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -155,6 +152,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string buckets []objectstorage.Bucket } tests := []struct { @@ -179,7 +177,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.buckets); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.buckets); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/object-storage/credentials-group/create/create_test.go b/internal/cmd/object-storage/credentials-group/create/create_test.go index 23908c876..307876137 100644 --- a/internal/cmd/object-storage/credentials-group/create/create_test.go +++ b/internal/cmd/object-storage/credentials-group/create/create_test.go @@ -16,22 +16,22 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testCredentialsGroupName = "test-name" -var testRegion = "eu01" + +const ( + testCredentialsGroupName = "test-name" + testRegion = "eu01" +) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - credentialsGroupNameFlag: testCredentialsGroupName, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + credentialsGroupNameFlag: testCredentialsGroupName, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -95,21 +95,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/credentials-group/delete/delete_test.go b/internal/cmd/object-storage/credentials-group/delete/delete_test.go index 901fc4304..9be471b32 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete_test.go @@ -13,16 +13,14 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -36,8 +34,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -105,7 +103,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +111,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +119,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index 800b0f742..cbad3cba1 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -63,11 +63,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list Object Storage credentials groups: %w", err) } - credentialsGroups := *resp.CredentialsGroups - if len(credentialsGroups) == 0 { - params.Printer.Info("No credentials groups found for your project") - return nil - } + credentialsGroups := resp.GetCredentialsGroups() // Truncate output if model.Limit != nil && len(credentialsGroups) > int(*model.Limit) { @@ -114,6 +110,11 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstora func outputResult(p *print.Printer, outputFormat string, credentialsGroups []objectstorage.CredentialsGroup) error { return p.OutputResult(outputFormat, credentialsGroups, func() error { + if len(credentialsGroups) == 0 { + p.Outputf("No credentials groups found for your project") + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "URN") for i := range credentialsGroups { diff --git a/internal/cmd/object-storage/credentials-group/list/list_test.go b/internal/cmd/object-storage/credentials-group/list/list_test.go index 587e6842a..2415108c4 100644 --- a/internal/cmd/object-storage/credentials-group/list/list_test.go +++ b/internal/cmd/object-storage/credentials-group/list/list_test.go @@ -16,21 +16,19 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", - regionFlag: "eu01", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", + globalflags.RegionFlag: "eu01", } for _, mod := range mods { mod(flagValues) @@ -83,21 +81,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/credentials/create/create_test.go b/internal/cmd/object-storage/credentials/create/create_test.go index f3c0bdd60..f351a4d3e 100644 --- a/internal/cmd/object-storage/credentials/create/create_test.go +++ b/internal/cmd/object-storage/credentials/create/create_test.go @@ -17,24 +17,24 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() -var testExpirationDate = "2024-01-01T00:00:00Z" -var testRegion = "eu01" + +const ( + testExpirationDate = "2024-01-01T00:00:00Z" + testRegion = "eu01" +) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - credentialsGroupIdFlag: testCredentialsGroupId, - expireDateFlag: testExpirationDate, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + credentialsGroupIdFlag: testCredentialsGroupId, + expireDateFlag: testExpirationDate, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -109,21 +109,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/credentials/delete/delete_test.go b/internal/cmd/object-storage/credentials/delete/delete_test.go index d5ff9e4e5..699d36bcf 100644 --- a/internal/cmd/object-storage/credentials/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials/delete/delete_test.go @@ -13,17 +13,17 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() -var testCredentialsId = "keyID" -var testRegion = "eu01" + +const ( + testCredentialsId = "keyID" + testRegion = "eu01" +) func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -37,9 +37,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - credentialsGroupIdFlag: testCredentialsGroupId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + credentialsGroupIdFlag: testCredentialsGroupId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -109,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -117,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -125,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index 0ebc5efea..522459440 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -66,23 +66,19 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list Object Storage credentials: %w", err) } - credentials := *resp.AccessKeys - if len(credentials) == 0 { - credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) - credentialsGroupLabel = model.CredentialsGroupId - } - - params.Printer.Info("No credentials found for credentials group %q\n", credentialsGroupLabel) - return nil + credentials := resp.GetAccessKeys() + + credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) + credentialsGroupLabel = model.CredentialsGroupId } // Truncate output if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, credentials) + return outputResult(params.Printer, model.OutputFormat, credentialsGroupLabel, credentials) }, } configureFlags(cmd) @@ -127,8 +123,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstora return req } -func outputResult(p *print.Printer, outputFormat string, credentials []objectstorage.AccessKey) error { +func outputResult(p *print.Printer, outputFormat, credentialsGroupLabel string, credentials []objectstorage.AccessKey) error { return p.OutputResult(outputFormat, credentials, func() error { + if len(credentials) == 0 { + p.Outputf("No credentials found for credentials group %q\n", credentialsGroupLabel) + return nil + } + table := tables.NewTable() table.SetHeader("CREDENTIALS ID", "ACCESS KEY ID", "EXPIRES AT") for i := range credentials { diff --git a/internal/cmd/object-storage/credentials/list/list_test.go b/internal/cmd/object-storage/credentials/list/list_test.go index 119f7c7c0..8e6469b18 100644 --- a/internal/cmd/object-storage/credentials/list/list_test.go +++ b/internal/cmd/object-storage/credentials/list/list_test.go @@ -16,9 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -29,10 +26,10 @@ var testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - credentialsGroupIdFlag: testCredentialsGroupId, - limitFlag: "10", - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + credentialsGroupIdFlag: testCredentialsGroupId, + limitFlag: "10", + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -87,21 +84,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -179,8 +176,9 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - credentials []objectstorage.AccessKey + outputFormat string + credentialsGroupLabel string + credentials []objectstorage.AccessKey } tests := []struct { name string @@ -211,7 +209,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.credentialsGroupLabel, tt.args.credentials); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/object-storage/disable/disable_test.go b/internal/cmd/object-storage/disable/disable_test.go index 5b5a2ea7f..8820b8cc3 100644 --- a/internal/cmd/object-storage/disable/disable_test.go +++ b/internal/cmd/object-storage/disable/disable_test.go @@ -13,20 +13,18 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -78,21 +76,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/object-storage/enable/enable_test.go b/internal/cmd/object-storage/enable/enable_test.go index 59e88e9e0..db8c35d3f 100644 --- a/internal/cmd/object-storage/enable/enable_test.go +++ b/internal/cmd/object-storage/enable/enable_test.go @@ -13,20 +13,18 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) -var projectIdFlag = globalflags.ProjectIdFlag -var regionFlag = globalflags.RegionFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &objectstorage.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - regionFlag: testRegion, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -78,21 +76,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, From a14c016918e870d4e9712bb0fe97b7e57d54cc45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 29 Oct 2025 08:39:15 +0100 Subject: [PATCH 184/422] fix(rabbitmq): print valid JSON/YAML output for list cmds (#1043) relates to STACKITCLI-271 / #893 --- .../credentials/create/create_test.go | 12 ++--- .../credentials/delete/delete_test.go | 12 ++--- .../credentials/describe/describe_test.go | 12 ++--- .../cmd/rabbitmq/credentials/list/list.go | 25 ++++++---- .../rabbitmq/credentials/list/list_test.go | 21 ++++---- .../rabbitmq/instance/create/create_test.go | 50 +++++++++---------- .../rabbitmq/instance/delete/delete_test.go | 10 ++-- .../instance/describe/describe_test.go | 10 ++-- internal/cmd/rabbitmq/instance/list/list.go | 24 +++++---- .../cmd/rabbitmq/instance/list/list_test.go | 15 +++--- .../rabbitmq/instance/update/update_test.go | 42 ++++++++-------- internal/cmd/rabbitmq/plans/plans.go | 24 +++++---- internal/cmd/rabbitmq/plans/plans_test.go | 15 +++--- 13 files changed, 131 insertions(+), 141 deletions(-) diff --git a/internal/cmd/rabbitmq/credentials/create/create_test.go b/internal/cmd/rabbitmq/credentials/create/create_test.go index b4f28de99..b36306cd8 100644 --- a/internal/cmd/rabbitmq/credentials/create/create_test.go +++ b/internal/cmd/rabbitmq/credentials/create/create_test.go @@ -14,8 +14,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -25,8 +23,8 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -88,21 +86,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/credentials/delete/delete_test.go b/internal/cmd/rabbitmq/credentials/delete/delete_test.go index 6d6a46340..176138ad9 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete_test.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -35,8 +33,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -104,7 +102,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -112,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -120,7 +118,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/credentials/describe/describe_test.go b/internal/cmd/rabbitmq/credentials/describe/describe_test.go index 15bf51687..0a466858c 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe_test.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe_test.go @@ -14,8 +14,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,8 +34,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -105,7 +103,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +111,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +119,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index efa8fc187..fd6921b8a 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -66,22 +66,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list RabbitMQ credentials: %w", err) } - credentials := *resp.CredentialsList - if len(credentials) == 0 { - instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = model.InstanceId - } - params.Printer.Info("No credentials found for instance %q\n", instanceLabel) - return nil + credentials := resp.GetCredentialsList() + + instanceLabel, err := rabbitmqUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId } // Truncate output if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, credentials) + + return outputResult(params.Printer, model.OutputFormat, instanceLabel, credentials) }, } configureFlags(cmd) @@ -125,8 +123,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.AP return req } -func outputResult(p *print.Printer, outputFormat string, credentials []rabbitmq.CredentialsListItem) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, credentials []rabbitmq.CredentialsListItem) error { return p.OutputResult(outputFormat, credentials, func() error { + if len(credentials) == 0 { + p.Outputf("No credentials found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID") for i := range credentials { diff --git a/internal/cmd/rabbitmq/credentials/list/list_test.go b/internal/cmd/rabbitmq/credentials/list/list_test.go index ed752b64d..86e36c0aa 100644 --- a/internal/cmd/rabbitmq/credentials/list/list_test.go +++ b/internal/cmd/rabbitmq/credentials/list/list_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,9 +24,9 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -81,21 +79,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -173,8 +171,9 @@ func TestBuildRequest(t *testing.T) { func Test_outputResult(t *testing.T) { type args struct { - outputFormat string - credentials []rabbitmq.CredentialsListItem + outputFormat string + instanceLabel string + credentials []rabbitmq.CredentialsListItem } tests := []struct { name string @@ -201,7 +200,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/rabbitmq/instance/create/create_test.go b/internal/cmd/rabbitmq/instance/create/create_test.go index a1b4585c4..c76fa6af3 100644 --- a/internal/cmd/rabbitmq/instance/create/create_test.go +++ b/internal/cmd/rabbitmq/instance/create/create_test.go @@ -17,8 +17,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -46,17 +44,17 @@ var testMonitoringInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceNameFlag: "example-name", - enableMonitoringFlag: "true", - graphiteFlag: "example-graphite", - metricsFrequencyFlag: "100", - metricsPrefixFlag: "example-prefix", - monitoringInstanceIdFlag: testMonitoringInstanceId, - pluginFlag: "example-plugin", - sgwAclFlag: "198.51.100.14/24", - syslogFlag: "example-syslog", - planIdFlag: testPlanId, + globalflags.ProjectIdFlag: testProjectId, + instanceNameFlag: "example-name", + enableMonitoringFlag: "true", + graphiteFlag: "example-graphite", + metricsFrequencyFlag: "100", + metricsPrefixFlag: "example-prefix", + monitoringInstanceIdFlag: testMonitoringInstanceId, + pluginFlag: "example-plugin", + sgwAclFlag: "198.51.100.14/24", + syslogFlag: "example-syslog", + planIdFlag: testPlanId, } for _, mod := range mods { mod(flagValues) @@ -148,9 +146,9 @@ func TestParseInput(t *testing.T) { { description: "required fields only", flagValues: map[string]string{ - projectIdFlag: testProjectId, - instanceNameFlag: "example-name", - planIdFlag: testPlanId, + globalflags.ProjectIdFlag: testProjectId, + instanceNameFlag: "example-name", + planIdFlag: testPlanId, }, isValid: true, expectedModel: &inputModel{ @@ -165,13 +163,13 @@ func TestParseInput(t *testing.T) { { description: "zero values", flagValues: map[string]string{ - projectIdFlag: testProjectId, - planIdFlag: testPlanId, - instanceNameFlag: "", - enableMonitoringFlag: "false", - graphiteFlag: "", - metricsFrequencyFlag: "0", - metricsPrefixFlag: "", + globalflags.ProjectIdFlag: testProjectId, + planIdFlag: testPlanId, + instanceNameFlag: "", + enableMonitoringFlag: "false", + graphiteFlag: "", + metricsFrequencyFlag: "0", + metricsPrefixFlag: "", }, isValid: true, expectedModel: &inputModel{ @@ -190,21 +188,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/instance/delete/delete_test.go b/internal/cmd/rabbitmq/instance/delete/delete_test.go index 24fbaeac9..4ffdd36a8 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete_test.go +++ b/internal/cmd/rabbitmq/instance/delete/delete_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -34,7 +32,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, } for _, mod := range mods { mod(flagValues) @@ -101,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/instance/describe/describe_test.go b/internal/cmd/rabbitmq/instance/describe/describe_test.go index 620119e9b..b2e2d2a95 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe_test.go +++ b/internal/cmd/rabbitmq/instance/describe/describe_test.go @@ -14,8 +14,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -35,7 +33,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, } for _, mod := range mods { mod(flagValues) @@ -102,7 +100,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +108,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +116,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 61bc42e5b..2bf032e8c 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get RabbitMQ instances: %w", err) } - instances := *resp.Instances - if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil + instances := resp.GetInstances() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.AP return req } -func outputResult(p *print.Printer, outputFormat string, instances []rabbitmq.Instance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []rabbitmq.Instance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { diff --git a/internal/cmd/rabbitmq/instance/list/list_test.go b/internal/cmd/rabbitmq/instance/list/list_test.go index 6160eb6cc..4f9a0ab7d 100644 --- a/internal/cmd/rabbitmq/instance/list/list_test.go +++ b/internal/cmd/rabbitmq/instance/list/list_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -25,8 +23,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -78,21 +76,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -150,6 +148,7 @@ func TestBuildRequest(t *testing.T) { func Test_outputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instances []rabbitmq.Instance } tests := []struct { @@ -177,7 +176,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/rabbitmq/instance/update/update_test.go b/internal/cmd/rabbitmq/instance/update/update_test.go index 50642481c..11198d9a6 100644 --- a/internal/cmd/rabbitmq/instance/update/update_test.go +++ b/internal/cmd/rabbitmq/instance/update/update_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -58,16 +56,16 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - enableMonitoringFlag: "true", - graphiteFlag: "example-graphite", - metricsFrequencyFlag: "100", - metricsPrefixFlag: "example-prefix", - monitoringInstanceIdFlag: testMonitoringInstanceId, - pluginFlag: "example-plugin", - sgwAclFlag: "198.51.100.14/24", - syslogFlag: "example-syslog", - planIdFlag: testPlanId, + globalflags.ProjectIdFlag: testProjectId, + enableMonitoringFlag: "true", + graphiteFlag: "example-graphite", + metricsFrequencyFlag: "100", + metricsPrefixFlag: "example-prefix", + monitoringInstanceIdFlag: testMonitoringInstanceId, + pluginFlag: "example-plugin", + sgwAclFlag: "198.51.100.14/24", + syslogFlag: "example-syslog", + planIdFlag: testPlanId, } for _, mod := range mods { mod(flagValues) @@ -159,7 +157,7 @@ func TestParseInput(t *testing.T) { description: "required flags only (no values to update)", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, }, isValid: false, expectedModel: &inputModel{ @@ -174,12 +172,12 @@ func TestParseInput(t *testing.T) { description: "zero values", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, - planIdFlag: testPlanId, - enableMonitoringFlag: "false", - graphiteFlag: "", - metricsFrequencyFlag: "0", - metricsPrefixFlag: "", + globalflags.ProjectIdFlag: testProjectId, + planIdFlag: testPlanId, + enableMonitoringFlag: "false", + graphiteFlag: "", + metricsFrequencyFlag: "0", + metricsPrefixFlag: "", }, isValid: true, expectedModel: &inputModel{ @@ -199,7 +197,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -207,7 +205,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -215,7 +213,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index 09f0220ab..d62474125 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -65,15 +65,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get RabbitMQ service plans: %w", err) } - plans := *resp.Offerings - if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No plans found for project %q\n", projectLabel) - return nil + plans := resp.GetOfferings() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -81,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, projectLabel, plans) }, } @@ -121,8 +118,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *rabbitmq.AP return req } -func outputResult(p *print.Printer, outputFormat string, plans []rabbitmq.Offering) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []rabbitmq.Offering) error { return p.OutputResult(outputFormat, plans, func() error { + if len(plans) == 0 { + p.Outputf("No plans found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { diff --git a/internal/cmd/rabbitmq/plans/plans_test.go b/internal/cmd/rabbitmq/plans/plans_test.go index 2089d4414..486369731 100644 --- a/internal/cmd/rabbitmq/plans/plans_test.go +++ b/internal/cmd/rabbitmq/plans/plans_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -25,8 +23,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -78,21 +76,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -150,6 +148,7 @@ func TestBuildRequest(t *testing.T) { func Test_outputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string plans []rabbitmq.Offering } tests := []struct { @@ -177,7 +176,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From c066de61d51074cf99d3c51bb2f96d8fd8d1d0a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 08:15:17 +0000 Subject: [PATCH 185/422] chore(deps): bump actions/upload-artifact from 4 to 5 (#1054) --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6311125ba..1bf4b205f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -36,7 +36,7 @@ jobs: run: make test - name: Archive code coverage results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} path: ${{ env.CODE_COVERAGE_FILE_NAME }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 9e453b7fa..3e67096c4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -90,7 +90,7 @@ jobs: rm -f "$GPG_KEY_PATH" - name: Upload artifacts to workflow - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: goreleaser-dist-temp path: dist From 6972ccde2d345cf88b0a3ac07afe8a3c3d5c22cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 09:24:36 +0100 Subject: [PATCH 186/422] chore(deps): bump actions/download-artifact from 5 to 6 (#1051) --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3e67096c4..8eb074ead 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -110,7 +110,7 @@ jobs: # use the artifacts from the "goreleaser" job - name: Download artifacts from workflow - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: goreleaser-dist-temp path: dist @@ -147,7 +147,7 @@ jobs: uses: actions/checkout@v5 - name: Download artifacts from workflow - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v6 with: name: goreleaser-dist-temp path: dist From 02b922af63105fdf327d5c54d16d88abc41d694a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 30 Oct 2025 09:32:09 +0100 Subject: [PATCH 187/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/git (#1062) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f5d9080d3..ba1fee414 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 - github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 diff --git a/go.sum b/go.sum index 1c421db57..989b9de14 100644 --- a/go.sum +++ b/go.sum @@ -569,8 +569,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= -github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0 h1:/weT7P5Uwy1Qlhw0NidqtQBlbbb/dQehweDV/I9ShXg= -github.com/stackitcloud/stackit-sdk-go/services/git v0.8.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= +github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7gUXYzrN0Ip5NXj+6LFBp1EO6cg= +github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 h1:dnEjyapuv8WwRN5vE2z6+4/+ZqQTBx+bX27x2nOF7Jw= github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= From fc25893f1f940916b803bda036e408e2fc186b6d Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Mon, 3 Nov 2025 11:27:38 +0100 Subject: [PATCH 188/422] chore(client): Refactor ConfigureClient() function to use a generic function instead (#1058) Signed-off-by: Alexander Dahmen --- .github/docs/contribution-guide/client.go | 38 +------------- internal/cmd/git/flavor/list/list.go | 2 +- internal/cmd/git/instance/create/create.go | 2 +- internal/cmd/git/instance/delete/delete.go | 2 +- .../cmd/git/instance/describe/describe.go | 2 +- internal/cmd/git/instance/list/list.go | 2 +- internal/pkg/config/config.go | 3 ++ internal/pkg/generic-client/generic_client.go | 50 +++++++++++++++++++ internal/pkg/services/alb/client/client.go | 34 +------------ .../services/authorization/client/client.go | 35 +------------ internal/pkg/services/dns/client/client.go | 35 +------------ internal/pkg/services/git/client/client.go | 37 ++------------ internal/pkg/services/iaas/client/client.go | 37 +------------- internal/pkg/services/kms/client/client.go | 35 +------------ .../services/load-balancer/client/client.go | 34 +------------ internal/pkg/services/logme/client/client.go | 37 +------------- .../pkg/services/mariadb/client/client.go | 37 +------------- .../pkg/services/mongodbflex/client/client.go | 37 ++------------ .../services/object-storage/client/client.go | 38 +------------- .../services/observability/client/client.go | 37 +------------- .../pkg/services/opensearch/client/client.go | 37 +------------- .../services/postgresflex/client/client.go | 37 +------------- .../pkg/services/rabbitmq/client/client.go | 37 +------------- internal/pkg/services/redis/client/client.go | 37 +------------- .../services/resourcemanager/client/client.go | 35 +------------ .../pkg/services/runcommand/client/client.go | 36 +------------ .../services/secrets-manager/client/client.go | 37 +------------- .../services/serverbackup/client/client.go | 37 +------------- .../services/serverosupdate/client/client.go | 36 +------------ .../services/service-account/client/client.go | 35 +------------ .../service-enablement/client/client.go | 37 +------------- internal/pkg/services/ske/client/client.go | 36 +------------ .../services/sqlserverflex/client/client.go | 35 +------------ 33 files changed, 112 insertions(+), 894 deletions(-) create mode 100644 internal/pkg/generic-client/generic_client.go diff --git a/.github/docs/contribution-guide/client.go b/.github/docs/contribution-guide/client.go index 3fdda371b..df0f74442 100644 --- a/.github/docs/contribution-guide/client.go +++ b/.github/docs/contribution-guide/client.go @@ -2,46 +2,12 @@ package client import ( "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" - "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/foo" // (...) ) func ConfigureClient(p *print.Printer, cliVersion string) (*foo.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - return nil, &errors.AuthError{} - } - - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), // Configuring region is needed if "foo" is a regional API - authCfgOption, - } - - customEndpoint := viper.GetString(config.fooCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := foo.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.fooCustomEndpointKey), false, genericclient.CreateApiClient[*foo.APIClient](foo.NewAPIClient)) } diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index c8c8fe583..fddb9bc26 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -49,7 +49,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index 8c6c56ac4..f63e7499d 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/git/instance/delete/delete.go b/internal/cmd/git/instance/delete/delete.go index 01f6f3f19..8b5bb7ba1 100644 --- a/internal/cmd/git/instance/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -46,7 +46,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/git/instance/describe/describe.go b/internal/cmd/git/instance/describe/describe.go index 57bd8e859..2d7948b11 100644 --- a/internal/cmd/git/instance/describe/describe.go +++ b/internal/cmd/git/instance/describe/describe.go @@ -42,7 +42,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index 161af2df4..83aa2015b 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -50,7 +50,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Configure API client - apiClient, err := client.ConfigureClient(params.Printer) + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index a8c136996..9a03ac3b8 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -23,6 +23,7 @@ const ( AllowedUrlDomainKey = "allowed_url_domain" AuthorizationCustomEndpointKey = "authorization_custom_endpoint" + AlbCustomEndpoint = "alb_custom _endpoint" DNSCustomEndpointKey = "dns_custom_endpoint" LoadBalancerCustomEndpointKey = "load_balancer_custom_endpoint" LogMeCustomEndpointKey = "logme_custom_endpoint" @@ -107,6 +108,7 @@ var ConfigKeys = []string{ IaaSCustomEndpointKey, TokenCustomEndpointKey, GitCustomEndpointKey, + AlbCustomEndpoint, } var defaultConfigFolderPath string @@ -193,6 +195,7 @@ func setConfigDefaults() { viper.SetDefault(IaaSCustomEndpointKey, "") viper.SetDefault(TokenCustomEndpointKey, "") viper.SetDefault(GitCustomEndpointKey, "") + viper.SetDefault(AlbCustomEndpoint, "") } func getConfigFilePath(configFolder string) string { diff --git a/internal/pkg/generic-client/generic_client.go b/internal/pkg/generic-client/generic_client.go new file mode 100644 index 000000000..64ede2600 --- /dev/null +++ b/internal/pkg/generic-client/generic_client.go @@ -0,0 +1,50 @@ +package genericclient + +import ( + "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" +) + +type CreateApiClient[T any] func(opts ...sdkConfig.ConfigurationOption) (T, error) + +// ConfigureClientGeneric contains the generic code which needs to be executed in order to configure the api client. +func ConfigureClientGeneric[T any](p *print.Printer, cliVersion, customEndpoint string, useRegion bool, createApiClient CreateApiClient[T]) (T, error) { + // return value if an error happens + var zero T + authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) + if err != nil { + p.Debug(print.ErrorLevel, "configure authentication: %v", err) + return zero, &errors.AuthError{} + } + cfgOptions := []sdkConfig.ConfigurationOption{ + utils.UserAgentConfigOption(cliVersion), + authCfgOption, + } + + if customEndpoint != "" { + cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) + } + + if useRegion { + cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(viper.GetString(config.RegionKey))) + } + + if p.IsVerbosityDebug() { + cfgOptions = append(cfgOptions, + sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), + ) + } + + apiClient, err := createApiClient(cfgOptions...) + if err != nil { + p.Debug(print.ErrorLevel, "create new API client: %v", err) + return zero, &errors.AuthError{} + } + + return apiClient, nil +} diff --git a/internal/pkg/services/alb/client/client.go b/internal/pkg/services/alb/client/client.go index 866a76ad5..1de12c654 100644 --- a/internal/pkg/services/alb/client/client.go +++ b/internal/pkg/services/alb/client/client.go @@ -1,44 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/alb" ) func ConfigureClient(p *print.Printer, cliVersion string) (*alb.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.IaaSCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := alb.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.AlbCustomEndpoint), true, genericclient.CreateApiClient[*alb.APIClient](alb.NewAPIClient)) } diff --git a/internal/pkg/services/authorization/client/client.go b/internal/pkg/services/authorization/client/client.go index 7deb26b12..8646a8120 100644 --- a/internal/pkg/services/authorization/client/client.go +++ b/internal/pkg/services/authorization/client/client.go @@ -1,45 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) func ConfigureClient(p *print.Printer, cliVersion string) (*authorization.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.AuthorizationCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := authorization.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.AuthorizationCustomEndpointKey), false, genericclient.CreateApiClient[*authorization.APIClient](authorization.NewAPIClient)) } diff --git a/internal/pkg/services/dns/client/client.go b/internal/pkg/services/dns/client/client.go index 15b824da3..478fa0a53 100644 --- a/internal/pkg/services/dns/client/client.go +++ b/internal/pkg/services/dns/client/client.go @@ -1,46 +1,15 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/dns" ) func ConfigureClient(p *print.Printer, cliVersion string) (*dns.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.DNSCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := dns.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.DNSCustomEndpointKey), false, genericclient.CreateApiClient[*dns.APIClient](dns.NewAPIClient)) } diff --git a/internal/pkg/services/git/client/client.go b/internal/pkg/services/git/client/client.go index dde3b7be6..3fc5b21b1 100644 --- a/internal/pkg/services/git/client/client.go +++ b/internal/pkg/services/git/client/client.go @@ -1,45 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/git" ) -func ConfigureClient(p *print.Printer) (*git.APIClient, error) { - var err error - var apiClient *git.APIClient - var cfgOptions []sdkConfig.ConfigurationOption - - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions = append(cfgOptions, authCfgOption) - - customEndpoint := viper.GetString(config.GitCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err = git.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil +func ConfigureClient(p *print.Printer, cliVersion string) (*git.APIClient, error) { + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.GitCustomEndpointKey), false, genericclient.CreateApiClient[*git.APIClient](git.NewAPIClient)) } diff --git a/internal/pkg/services/iaas/client/client.go b/internal/pkg/services/iaas/client/client.go index e32d15b4c..c9401016a 100644 --- a/internal/pkg/services/iaas/client/client.go +++ b/internal/pkg/services/iaas/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) func ConfigureClient(p *print.Printer, cliVersion string) (*iaas.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.IaaSCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := iaas.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.IaaSCustomEndpointKey), true, genericclient.CreateApiClient[*iaas.APIClient](iaas.NewAPIClient)) } diff --git a/internal/pkg/services/kms/client/client.go b/internal/pkg/services/kms/client/client.go index b2cbd8250..ecb2111a2 100644 --- a/internal/pkg/services/kms/client/client.go +++ b/internal/pkg/services/kms/client/client.go @@ -1,45 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/kms" ) func ConfigureClient(p *print.Printer, cliVersion string) (*kms.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.KMSCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := kms.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.KMSCustomEndpointKey), false, genericclient.CreateApiClient[*kms.APIClient](kms.NewAPIClient)) } diff --git a/internal/pkg/services/load-balancer/client/client.go b/internal/pkg/services/load-balancer/client/client.go index 402498c70..7234c4f88 100644 --- a/internal/pkg/services/load-balancer/client/client.go +++ b/internal/pkg/services/load-balancer/client/client.go @@ -1,44 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) func ConfigureClient(p *print.Printer, cliVersion string) (*loadbalancer.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.LoadBalancerCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := loadbalancer.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.LoadBalancerCustomEndpointKey), false, genericclient.CreateApiClient[*loadbalancer.APIClient](loadbalancer.NewAPIClient)) } diff --git a/internal/pkg/services/logme/client/client.go b/internal/pkg/services/logme/client/client.go index 71a750c7f..f65bcfb6a 100644 --- a/internal/pkg/services/logme/client/client.go +++ b/internal/pkg/services/logme/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/logme" ) func ConfigureClient(p *print.Printer, cliVersion string) (*logme.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.LogMeCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := logme.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.LogMeCustomEndpointKey), true, genericclient.CreateApiClient[*logme.APIClient](logme.NewAPIClient)) } diff --git a/internal/pkg/services/mariadb/client/client.go b/internal/pkg/services/mariadb/client/client.go index 7a7fb9f78..9952a324c 100644 --- a/internal/pkg/services/mariadb/client/client.go +++ b/internal/pkg/services/mariadb/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) func ConfigureClient(p *print.Printer, cliVersion string) (*mariadb.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.MariaDBCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := mariadb.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.MariaDBCustomEndpointKey), true, genericclient.CreateApiClient[*mariadb.APIClient](mariadb.NewAPIClient)) } diff --git a/internal/pkg/services/mongodbflex/client/client.go b/internal/pkg/services/mongodbflex/client/client.go index 216fbd9d5..58613728b 100644 --- a/internal/pkg/services/mongodbflex/client/client.go +++ b/internal/pkg/services/mongodbflex/client/client.go @@ -1,44 +1,13 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - - "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) func ConfigureClient(p *print.Printer, cliVersion string) (*mongodbflex.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.MongoDBFlexCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := mongodbflex.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.MongoDBFlexCustomEndpointKey), false, genericclient.CreateApiClient[*mongodbflex.APIClient](mongodbflex.NewAPIClient)) } diff --git a/internal/pkg/services/object-storage/client/client.go b/internal/pkg/services/object-storage/client/client.go index 5eab52238..82b2447f8 100644 --- a/internal/pkg/services/object-storage/client/client.go +++ b/internal/pkg/services/object-storage/client/client.go @@ -1,48 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" ) func ConfigureClient(p *print.Printer, cliVersion string) (*objectstorage.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ObjectStorageCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := objectstorage.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ObjectStorageCustomEndpointKey), true, genericclient.CreateApiClient[*objectstorage.APIClient](objectstorage.NewAPIClient)) } diff --git a/internal/pkg/services/observability/client/client.go b/internal/pkg/services/observability/client/client.go index 23698b5ff..83c496121 100644 --- a/internal/pkg/services/observability/client/client.go +++ b/internal/pkg/services/observability/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" ) func ConfigureClient(p *print.Printer, cliVersion string) (*observability.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ObservabilityCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := observability.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ObservabilityCustomEndpointKey), true, genericclient.CreateApiClient[*observability.APIClient](observability.NewAPIClient)) } diff --git a/internal/pkg/services/opensearch/client/client.go b/internal/pkg/services/opensearch/client/client.go index b1948a389..fb7d218a3 100644 --- a/internal/pkg/services/opensearch/client/client.go +++ b/internal/pkg/services/opensearch/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) func ConfigureClient(p *print.Printer, cliVersion string) (*opensearch.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.OpenSearchCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := opensearch.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.OpenSearchCustomEndpointKey), true, genericclient.CreateApiClient[*opensearch.APIClient](opensearch.NewAPIClient)) } diff --git a/internal/pkg/services/postgresflex/client/client.go b/internal/pkg/services/postgresflex/client/client.go index ad125cd0c..d5b77761f 100644 --- a/internal/pkg/services/postgresflex/client/client.go +++ b/internal/pkg/services/postgresflex/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) func ConfigureClient(p *print.Printer, cliVersion string) (*postgresflex.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.PostgresFlexCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := postgresflex.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.PostgresFlexCustomEndpointKey), true, genericclient.CreateApiClient[*postgresflex.APIClient](postgresflex.NewAPIClient)) } diff --git a/internal/pkg/services/rabbitmq/client/client.go b/internal/pkg/services/rabbitmq/client/client.go index 90c4df9fa..df717b305 100644 --- a/internal/pkg/services/rabbitmq/client/client.go +++ b/internal/pkg/services/rabbitmq/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) func ConfigureClient(p *print.Printer, cliVersion string) (*rabbitmq.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.RabbitMQCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := rabbitmq.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.RabbitMQCustomEndpointKey), true, genericclient.CreateApiClient[*rabbitmq.APIClient](rabbitmq.NewAPIClient)) } diff --git a/internal/pkg/services/redis/client/client.go b/internal/pkg/services/redis/client/client.go index 1966b0ad2..72c023398 100644 --- a/internal/pkg/services/redis/client/client.go +++ b/internal/pkg/services/redis/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/redis" ) func ConfigureClient(p *print.Printer, cliVersion string) (*redis.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.RedisCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := redis.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.RedisCustomEndpointKey), true, genericclient.CreateApiClient[*redis.APIClient](redis.NewAPIClient)) } diff --git a/internal/pkg/services/resourcemanager/client/client.go b/internal/pkg/services/resourcemanager/client/client.go index 5cca3a34b..199b2a2e1 100644 --- a/internal/pkg/services/resourcemanager/client/client.go +++ b/internal/pkg/services/resourcemanager/client/client.go @@ -1,45 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) func ConfigureClient(p *print.Printer, cliVersion string) (*resourcemanager.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ResourceManagerEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := resourcemanager.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ResourceManagerEndpointKey), false, genericclient.CreateApiClient[*resourcemanager.APIClient](resourcemanager.NewAPIClient)) } diff --git a/internal/pkg/services/runcommand/client/client.go b/internal/pkg/services/runcommand/client/client.go index 86f6d3d5d..1ecb49f4f 100644 --- a/internal/pkg/services/runcommand/client/client.go +++ b/internal/pkg/services/runcommand/client/client.go @@ -1,46 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) func ConfigureClient(p *print.Printer, cliVersion string) (*runcommand.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.RunCommandCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - cfgOptions = append(cfgOptions, authCfgOption) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := runcommand.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.RunCommandCustomEndpointKey), false, genericclient.CreateApiClient[*runcommand.APIClient](runcommand.NewAPIClient)) } diff --git a/internal/pkg/services/secrets-manager/client/client.go b/internal/pkg/services/secrets-manager/client/client.go index 3ef6e1402..dfedcb0e3 100644 --- a/internal/pkg/services/secrets-manager/client/client.go +++ b/internal/pkg/services/secrets-manager/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) func ConfigureClient(p *print.Printer, cliVersion string) (*secretsmanager.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - region := viper.GetString(config.RegionKey) - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - sdkConfig.WithRegion(region), - authCfgOption, - } - - customEndpoint := viper.GetString(config.SecretsManagerCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := secretsmanager.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.SecretsManagerCustomEndpointKey), true, genericclient.CreateApiClient[*secretsmanager.APIClient](secretsmanager.NewAPIClient)) } diff --git a/internal/pkg/services/serverbackup/client/client.go b/internal/pkg/services/serverbackup/client/client.go index 1184ce684..c8726b392 100644 --- a/internal/pkg/services/serverbackup/client/client.go +++ b/internal/pkg/services/serverbackup/client/client.go @@ -1,47 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) func ConfigureClient(p *print.Printer, cliVersion string) (*serverbackup.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ServerBackupCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, authCfgOption, sdkConfig.WithRegion(region)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := serverbackup.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ServerBackupCustomEndpointKey), true, genericclient.CreateApiClient[*serverbackup.APIClient](serverbackup.NewAPIClient)) } diff --git a/internal/pkg/services/serverosupdate/client/client.go b/internal/pkg/services/serverosupdate/client/client.go index ec39a5477..a3d324d90 100644 --- a/internal/pkg/services/serverosupdate/client/client.go +++ b/internal/pkg/services/serverosupdate/client/client.go @@ -1,46 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) func ConfigureClient(p *print.Printer, cliVersion string) (*serverupdate.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ServerOsUpdateCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - cfgOptions = append(cfgOptions, authCfgOption) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := serverupdate.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ServerOsUpdateCustomEndpointKey), false, genericclient.CreateApiClient[*serverupdate.APIClient](serverupdate.NewAPIClient)) } diff --git a/internal/pkg/services/service-account/client/client.go b/internal/pkg/services/service-account/client/client.go index cb35d2c4d..f7150c892 100644 --- a/internal/pkg/services/service-account/client/client.go +++ b/internal/pkg/services/service-account/client/client.go @@ -1,45 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) func ConfigureClient(p *print.Printer, cliVersion string) (*serviceaccount.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ServiceAccountCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := serviceaccount.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ServiceAccountCustomEndpointKey), false, genericclient.CreateApiClient[*serviceaccount.APIClient](serviceaccount.NewAPIClient)) } diff --git a/internal/pkg/services/service-enablement/client/client.go b/internal/pkg/services/service-enablement/client/client.go index 66b952376..e0bced744 100644 --- a/internal/pkg/services/service-enablement/client/client.go +++ b/internal/pkg/services/service-enablement/client/client.go @@ -2,46 +2,13 @@ package client import ( "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" ) func ConfigureClient(p *print.Printer, cliVersion string) (*serviceenablement.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.ServiceEnablementCustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - region := viper.GetString(config.RegionKey) - cfgOptions = append(cfgOptions, sdkConfig.WithRegion(region)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := serviceenablement.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ServiceEnablementCustomEndpointKey), true, genericclient.CreateApiClient[*serviceenablement.APIClient](serviceenablement.NewAPIClient)) } diff --git a/internal/pkg/services/ske/client/client.go b/internal/pkg/services/ske/client/client.go index 1495ba7bf..5b4b69f38 100644 --- a/internal/pkg/services/ske/client/client.go +++ b/internal/pkg/services/ske/client/client.go @@ -1,46 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/ske" ) func ConfigureClient(p *print.Printer, cliVersion string) (*ske.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.SKECustomEndpointKey) - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } else { - cfgOptions = append(cfgOptions, authCfgOption) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := ske.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.SKECustomEndpointKey), false, genericclient.CreateApiClient[*ske.APIClient](ske.NewAPIClient)) } diff --git a/internal/pkg/services/sqlserverflex/client/client.go b/internal/pkg/services/sqlserverflex/client/client.go index 30e937f59..25bbb4ec3 100644 --- a/internal/pkg/services/sqlserverflex/client/client.go +++ b/internal/pkg/services/sqlserverflex/client/client.go @@ -1,45 +1,14 @@ package client import ( - "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/viper" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) func ConfigureClient(p *print.Printer, cliVersion string) (*sqlserverflex.APIClient, error) { - authCfgOption, err := auth.AuthenticationConfig(p, auth.AuthorizeUser) - if err != nil { - p.Debug(print.ErrorLevel, "configure authentication: %v", err) - return nil, &errors.AuthError{} - } - cfgOptions := []sdkConfig.ConfigurationOption{ - utils.UserAgentConfigOption(cliVersion), - authCfgOption, - } - - customEndpoint := viper.GetString(config.SQLServerFlexCustomEndpointKey) - - if customEndpoint != "" { - cfgOptions = append(cfgOptions, sdkConfig.WithEndpoint(customEndpoint)) - } - - if p.IsVerbosityDebug() { - cfgOptions = append(cfgOptions, - sdkConfig.WithMiddleware(print.RequestResponseCapturer(p, nil)), - ) - } - - apiClient, err := sqlserverflex.NewAPIClient(cfgOptions...) - if err != nil { - p.Debug(print.ErrorLevel, "create new API client: %v", err) - return nil, &errors.AuthError{} - } - - return apiClient, nil + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.SQLServerFlexCustomEndpointKey), false, genericclient.CreateApiClient[*sqlserverflex.APIClient](sqlserverflex.NewAPIClient)) } From b11890db516454e394f0ec88cbe70b24b731ca53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 11:35:33 +0100 Subject: [PATCH 189/422] chore(deps): bump renovatebot/github-action from 43.0.19 to 43.0.20 (#1067) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 8dab86076..fc34b9b41 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.19 + uses: renovatebot/github-action@v43.0.20 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 3fdc40650aa5be01701c6774eac2d2d5ce8047ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:42:17 +0000 Subject: [PATCH 190/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/core (#1066) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ba1fee414..6eff66cae 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.17.3 + github.com/stackitcloud/stackit-sdk-go/core v0.18.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 diff --git a/go.sum b/go.sum index 989b9de14..b9e0a5002 100644 --- a/go.sum +++ b/go.sum @@ -561,8 +561,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.17.3 h1:GsZGmRRc/3GJLmCUnsZswirr5wfLRrwavbnL/renOqg= -github.com/stackitcloud/stackit-sdk-go/core v0.17.3/go.mod h1:HBCXJGPgdRulplDzhrmwC+Dak9B/x0nzNtmOpu+1Ahg= +github.com/stackitcloud/stackit-sdk-go/core v0.18.0 h1:+4v8sjQpQXPihO3crgTp0Kz/XRIi5p7oKV28dw6jsEQ= +github.com/stackitcloud/stackit-sdk-go/core v0.18.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 h1:UM/HvewAgELEvZ4zk++Ykd6jUTSL+asRqtK+DszDOzE= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0/go.mod h1:mOmGoNLPXLJ5tKLnhOnhKW7wL9Giy/4DowiDZNLlQCY= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= From 52ad9528bc64415431d4845147803194f424e30f Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 4 Nov 2025 15:39:33 +0100 Subject: [PATCH 191/422] feat(iaas): Region adjustments and migration to v2 API (#1056) relates to STACKITCLI-227 --- docs/stackit_network-area.md | 1 + docs/stackit_network-area_create.md | 28 +- docs/stackit_network-area_region.md | 38 ++ docs/stackit_network-area_region_create.md | 58 +++ docs/stackit_network-area_region_delete.md | 46 ++ docs/stackit_network-area_region_describe.md | 46 ++ docs/stackit_network-area_region_list.md | 42 ++ docs/stackit_network-area_region_update.md | 56 ++ docs/stackit_network-area_route_create.md | 15 +- docs/stackit_network-area_update.md | 12 +- docs/stackit_network_create.md | 2 +- go.mod | 2 +- go.sum | 4 +- internal/cmd/affinity-groups/create/create.go | 2 +- .../cmd/affinity-groups/create/create_test.go | 17 +- internal/cmd/affinity-groups/delete/delete.go | 4 +- .../cmd/affinity-groups/delete/delete_test.go | 10 +- .../cmd/affinity-groups/describe/describe.go | 2 +- .../affinity-groups/describe/describe_test.go | 12 +- internal/cmd/affinity-groups/list/list.go | 2 +- .../cmd/affinity-groups/list/list_test.go | 15 +- internal/cmd/image/create/create.go | 2 +- internal/cmd/image/create/create_test.go | 114 +++-- internal/cmd/image/delete/delete.go | 4 +- internal/cmd/image/delete/delete_test.go | 21 +- internal/cmd/image/describe/describe.go | 2 +- internal/cmd/image/describe/describe_test.go | 23 +- internal/cmd/image/list/list.go | 2 +- internal/cmd/image/list/list_test.go | 26 +- internal/cmd/image/update/update.go | 4 +- internal/cmd/image/update/update_test.go | 35 +- internal/cmd/network-area/create/create.go | 230 ++++++--- .../cmd/network-area/create/create_test.go | 361 +++++++++++-- internal/cmd/network-area/delete/delete.go | 43 +- .../cmd/network-area/describe/describe.go | 55 +- internal/cmd/network-area/list/list.go | 13 +- .../network-range/create/create.go | 4 +- .../network-range/create/create_test.go | 9 +- .../network-range/delete/delete.go | 4 +- .../network-range/delete/delete_test.go | 9 +- .../network-range/describe/describe.go | 4 +- .../network-range/describe/describe_test.go | 10 +- .../network-area/network-range/list/list.go | 4 +- .../network-range/list/list_test.go | 9 +- internal/cmd/network-area/network_area.go | 2 + .../cmd/network-area/region/create/create.go | 195 +++++++ .../network-area/region/create/create_test.go | 307 +++++++++++ .../cmd/network-area/region/delete/delete.go | 129 +++++ .../network-area/region/delete/delete_test.go | 168 ++++++ .../network-area/region/describe/describe.go | 169 ++++++ .../region/describe/describe_test.go | 214 ++++++++ internal/cmd/network-area/region/list/list.go | 153 ++++++ .../cmd/network-area/region/list/list_test.go | 221 ++++++++ internal/cmd/network-area/region/region.go | 34 ++ .../cmd/network-area/region/update/update.go | 165 ++++++ .../network-area/region/update/update_test.go | 265 ++++++++++ .../cmd/network-area/route/create/create.go | 205 +++++++- .../network-area/route/create/create_test.go | 68 ++- .../cmd/network-area/route/delete/delete.go | 2 +- .../network-area/route/delete/delete_test.go | 9 +- .../network-area/route/describe/describe.go | 39 +- .../route/describe/describe_test.go | 9 +- internal/cmd/network-area/route/list/list.go | 36 +- .../cmd/network-area/route/list/list_test.go | 27 +- .../cmd/network-area/route/update/update.go | 4 +- .../network-area/route/update/update_test.go | 9 +- internal/cmd/network-area/update/update.go | 138 ++++- .../cmd/network-area/update/update_test.go | 256 ++++++++-- .../cmd/network-interface/create/create.go | 6 +- .../network-interface/create/create_test.go | 14 +- .../cmd/network-interface/delete/delete.go | 6 +- .../network-interface/delete/delete_test.go | 16 +- .../network-interface/describe/describe.go | 6 +- .../describe/describe_test.go | 16 +- internal/cmd/network-interface/list/list.go | 12 +- .../cmd/network-interface/list/list_test.go | 19 +- .../cmd/network-interface/update/update.go | 6 +- .../network-interface/update/update_test.go | 13 +- internal/cmd/network/create/create.go | 117 ++++- internal/cmd/network/create/create_test.go | 483 +++++++++++++----- internal/cmd/network/delete/delete.go | 6 +- internal/cmd/network/delete/delete_test.go | 16 +- internal/cmd/network/describe/describe.go | 83 +-- .../cmd/network/describe/describe_test.go | 34 +- internal/cmd/network/list/list.go | 13 +- internal/cmd/network/list/list_test.go | 19 +- internal/cmd/network/update/update.go | 27 +- internal/cmd/network/update/update_test.go | 33 +- internal/cmd/public-ip/associate/associate.go | 4 +- .../cmd/public-ip/associate/associate_test.go | 17 +- internal/cmd/public-ip/create/create.go | 2 +- internal/cmd/public-ip/create/create_test.go | 17 +- internal/cmd/public-ip/delete/delete.go | 4 +- internal/cmd/public-ip/delete/delete_test.go | 16 +- internal/cmd/public-ip/describe/describe.go | 2 +- .../cmd/public-ip/describe/describe_test.go | 16 +- .../public-ip/disassociate/disassociate.go | 4 +- .../disassociate/disassociate_test.go | 16 +- internal/cmd/public-ip/list/list.go | 2 +- internal/cmd/public-ip/list/list_test.go | 17 +- internal/cmd/public-ip/update/update.go | 4 +- internal/cmd/public-ip/update/update_test.go | 19 +- internal/cmd/quota/list/list.go | 2 +- internal/cmd/quota/list/list_test.go | 21 +- internal/cmd/security-group/create/create.go | 2 +- .../cmd/security-group/create/create_test.go | 30 +- internal/cmd/security-group/delete/delete.go | 4 +- .../cmd/security-group/delete/delete_test.go | 19 +- .../cmd/security-group/describe/describe.go | 2 +- .../security-group/describe/describe_test.go | 21 +- internal/cmd/security-group/list/list.go | 2 +- internal/cmd/security-group/list/list_test.go | 24 +- .../cmd/security-group/rule/create/create.go | 4 +- .../security-group/rule/create/create_test.go | 20 +- .../cmd/security-group/rule/delete/delete.go | 12 +- .../security-group/rule/delete/delete_test.go | 27 +- .../security-group/rule/describe/describe.go | 6 +- .../rule/describe/describe_test.go | 20 +- internal/cmd/security-group/rule/list/list.go | 10 +- .../cmd/security-group/rule/list/list_test.go | 19 +- internal/cmd/security-group/update/update.go | 4 +- .../cmd/security-group/update/update_test.go | 24 +- internal/cmd/server/backup/create/create.go | 2 +- internal/cmd/server/backup/disable/disable.go | 2 +- internal/cmd/server/backup/enable/enable.go | 2 +- internal/cmd/server/backup/list/list.go | 2 +- .../server/backup/schedule/create/create.go | 2 +- .../server/backup/schedule/delete/delete.go | 2 +- .../cmd/server/backup/schedule/list/list.go | 2 +- internal/cmd/server/command/create/create.go | 2 +- internal/cmd/server/command/list/list.go | 2 +- internal/cmd/server/console/console.go | 4 +- internal/cmd/server/console/console_test.go | 14 +- internal/cmd/server/create/create.go | 9 +- internal/cmd/server/create/create_test.go | 26 +- internal/cmd/server/deallocate/deallocate.go | 6 +- .../cmd/server/deallocate/deallocate_test.go | 14 +- internal/cmd/server/delete/delete.go | 6 +- internal/cmd/server/delete/delete_test.go | 16 +- internal/cmd/server/describe/describe.go | 2 +- internal/cmd/server/describe/describe_test.go | 16 +- internal/cmd/server/list/list.go | 2 +- internal/cmd/server/list/list_test.go | 17 +- internal/cmd/server/log/log.go | 4 +- internal/cmd/server/log/log_test.go | 15 +- .../server/machine-type/describe/describe.go | 2 +- .../machine-type/describe/describe_test.go | 16 +- internal/cmd/server/machine-type/list/list.go | 2 +- .../cmd/server/machine-type/list/list_test.go | 19 +- .../server/network-interface/attach/attach.go | 8 +- .../network-interface/attach/attach_test.go | 19 +- .../server/network-interface/detach/detach.go | 8 +- .../network-interface/detach/detach_test.go | 19 +- .../cmd/server/network-interface/list/list.go | 16 +- .../network-interface/list/list_test.go | 27 +- .../cmd/server/os-update/create/create.go | 2 +- .../cmd/server/os-update/disable/disable.go | 2 +- .../cmd/server/os-update/enable/enable.go | 2 +- internal/cmd/server/os-update/list/list.go | 2 +- .../os-update/schedule/create/create.go | 2 +- .../server/os-update/schedule/list/list.go | 2 +- .../cmd/server/public-ip/attach/attach.go | 14 +- .../server/public-ip/attach/attach_test.go | 29 +- .../cmd/server/public-ip/detach/detach.go | 14 +- .../server/public-ip/detach/detach_test.go | 21 +- internal/cmd/server/reboot/reboot.go | 4 +- internal/cmd/server/reboot/reboot_test.go | 15 +- internal/cmd/server/rescue/rescue.go | 6 +- internal/cmd/server/rescue/rescue_test.go | 19 +- internal/cmd/server/resize/resize.go | 6 +- internal/cmd/server/resize/resize_test.go | 17 +- .../server/service-account/attach/attach.go | 12 +- .../service-account/attach/attach_test.go | 22 +- .../server/service-account/detach/detach.go | 12 +- .../service-account/detach/detach_test.go | 22 +- .../cmd/server/service-account/list/list.go | 14 +- .../server/service-account/list/list_test.go | 23 +- internal/cmd/server/start/start.go | 6 +- internal/cmd/server/start/start_test.go | 14 +- internal/cmd/server/stop/stop.go | 6 +- internal/cmd/server/stop/stop_test.go | 14 +- internal/cmd/server/unrescue/unrescue.go | 6 +- internal/cmd/server/unrescue/unrescue_test.go | 14 +- internal/cmd/server/update/update.go | 4 +- internal/cmd/server/update/update_test.go | 21 +- internal/cmd/server/volume/attach/attach.go | 14 +- .../cmd/server/volume/attach/attach_test.go | 19 +- .../cmd/server/volume/describe/describe.go | 14 +- .../server/volume/describe/describe_test.go | 29 +- internal/cmd/server/volume/detach/detach.go | 14 +- .../cmd/server/volume/detach/detach_test.go | 29 +- internal/cmd/server/volume/list/list.go | 14 +- internal/cmd/server/volume/list/list_test.go | 29 +- internal/cmd/server/volume/update/update.go | 14 +- .../cmd/server/volume/update/update_test.go | 19 +- internal/cmd/volume/backup/create/create.go | 12 +- .../cmd/volume/backup/create/create_test.go | 18 +- internal/cmd/volume/backup/delete/delete.go | 6 +- .../cmd/volume/backup/delete/delete_test.go | 8 +- .../cmd/volume/backup/describe/describe.go | 2 +- .../volume/backup/describe/describe_test.go | 8 +- internal/cmd/volume/backup/list/list.go | 2 +- internal/cmd/volume/backup/list/list_test.go | 13 +- internal/cmd/volume/backup/restore/restore.go | 10 +- .../cmd/volume/backup/restore/restore_test.go | 8 +- internal/cmd/volume/backup/update/update.go | 4 +- .../cmd/volume/backup/update/update_test.go | 19 +- internal/cmd/volume/create/create.go | 4 +- internal/cmd/volume/create/create_test.go | 20 +- internal/cmd/volume/delete/delete.go | 6 +- internal/cmd/volume/delete/delete_test.go | 16 +- internal/cmd/volume/describe/describe.go | 2 +- internal/cmd/volume/describe/describe_test.go | 16 +- internal/cmd/volume/list/list.go | 2 +- internal/cmd/volume/list/list_test.go | 17 +- .../performance-class/describe/describe.go | 2 +- .../describe/describe_test.go | 16 +- .../cmd/volume/performance-class/list/list.go | 2 +- .../performance-class/list/list_test.go | 17 +- internal/cmd/volume/resize/resize.go | 4 +- internal/cmd/volume/resize/resize_test.go | 19 +- internal/cmd/volume/snapshot/create/create.go | 6 +- .../cmd/volume/snapshot/create/create_test.go | 14 +- internal/cmd/volume/snapshot/delete/delete.go | 6 +- .../cmd/volume/snapshot/delete/delete_test.go | 8 +- .../cmd/volume/snapshot/describe/describe.go | 2 +- .../volume/snapshot/describe/describe_test.go | 8 +- internal/cmd/volume/snapshot/list/list.go | 4 +- .../cmd/volume/snapshot/list/list_test.go | 21 +- internal/cmd/volume/snapshot/update/update.go | 4 +- .../cmd/volume/snapshot/update/update_test.go | 19 +- internal/cmd/volume/update/update.go | 4 +- internal/cmd/volume/update/update_test.go | 17 +- internal/pkg/errors/errors.go | 49 ++ internal/pkg/services/iaas/client/client.go | 2 +- internal/pkg/services/iaas/utils/utils.go | 109 ++-- .../pkg/services/iaas/utils/utils_test.go | 270 ++++++++-- internal/pkg/utils/utils.go | 46 +- 238 files changed, 5740 insertions(+), 1533 deletions(-) create mode 100644 docs/stackit_network-area_region.md create mode 100644 docs/stackit_network-area_region_create.md create mode 100644 docs/stackit_network-area_region_delete.md create mode 100644 docs/stackit_network-area_region_describe.md create mode 100644 docs/stackit_network-area_region_list.md create mode 100644 docs/stackit_network-area_region_update.md create mode 100644 internal/cmd/network-area/region/create/create.go create mode 100644 internal/cmd/network-area/region/create/create_test.go create mode 100644 internal/cmd/network-area/region/delete/delete.go create mode 100644 internal/cmd/network-area/region/delete/delete_test.go create mode 100644 internal/cmd/network-area/region/describe/describe.go create mode 100644 internal/cmd/network-area/region/describe/describe_test.go create mode 100644 internal/cmd/network-area/region/list/list.go create mode 100644 internal/cmd/network-area/region/list/list_test.go create mode 100644 internal/cmd/network-area/region/region.go create mode 100644 internal/cmd/network-area/region/update/update.go create mode 100644 internal/cmd/network-area/region/update/update_test.go diff --git a/docs/stackit_network-area.md b/docs/stackit_network-area.md index d9ba1ecda..6f2d751f8 100644 --- a/docs/stackit_network-area.md +++ b/docs/stackit_network-area.md @@ -35,6 +35,7 @@ stackit network-area [flags] * [stackit network-area describe](./stackit_network-area_describe.md) - Shows details of a STACKIT Network Area * [stackit network-area list](./stackit_network-area_list.md) - Lists all STACKIT Network Areas (SNA) of an organization * [stackit network-area network-range](./stackit_network-area_network-range.md) - Provides functionality for network ranges in STACKIT Network Areas +* [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) * [stackit network-area route](./stackit_network-area_route.md) - Provides functionality for static routes in STACKIT Network Areas * [stackit network-area update](./stackit_network-area_update.md) - Updates a STACKIT Network Area (SNA) diff --git a/docs/stackit_network-area_create.md b/docs/stackit_network-area_create.md index 7dc278927..e9a28231d 100644 --- a/docs/stackit_network-area_create.md +++ b/docs/stackit_network-area_create.md @@ -13,32 +13,20 @@ stackit network-area create [flags] ### Examples ``` - Create a network area with name "network-area-1" in organization with ID "xxx" with network ranges and a transfer network - $ stackit network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" + Create a network area with name "network-area-1" in organization with ID "xxx" + $ stackit network-area create --name network-area-1 --organization-id xxx" - Create a network area with name "network-area-2" in organization with ID "xxx" with network ranges, transfer network and DNS name server - $ stackit network-area create --name network-area-2 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --dns-name-servers "1.1.1.1" - - Create a network area with name "network-area-3" in organization with ID "xxx" with network ranges, transfer network and additional options - $ stackit network-area create --name network-area-3 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --default-prefix-length 25 --max-prefix-length 29 --min-prefix-length 24 - - Create a network area with name "network-area-1" in organization with ID "xxx" with network ranges and a transfer network and labels "key=value,key1=value1" - $ stackit network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --labels key=value,key1=value1 + Create a network area with name "network-area-1" in organization with ID "xxx" with labels "key=value,key1=value1" + $ stackit network-area create --name network-area-1 --organization-id xxx --labels key=value,key1=value1 ``` ### Options ``` - --default-prefix-length int The default prefix length for networks in the network area - --dns-name-servers strings List of DNS name server IPs - -h, --help Help for "stackit network-area create" - --labels stringToString Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...' (default []) - --max-prefix-length int The maximum prefix length for networks in the network area - --min-prefix-length int The minimum prefix length for networks in the network area - -n, --name string Network area name - --network-ranges strings List of network ranges (default []) - --organization-id string Organization ID - --transfer-network string Transfer network in CIDR notation + -h, --help Help for "stackit network-area create" + --labels stringToString Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...' (default []) + -n, --name string Network area name + --organization-id string Organization ID ``` ### Options inherited from parent commands diff --git a/docs/stackit_network-area_region.md b/docs/stackit_network-area_region.md new file mode 100644 index 000000000..07fd820eb --- /dev/null +++ b/docs/stackit_network-area_region.md @@ -0,0 +1,38 @@ +## stackit network-area region + +Provides functionality for regional configuration of STACKIT Network Area (SNA) + +### Synopsis + +Provides functionality for regional configuration of STACKIT Network Area (SNA). + +``` +stackit network-area region [flags] +``` + +### Options + +``` + -h, --help Help for "stackit network-area region" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area](./stackit_network-area.md) - Provides functionality for STACKIT Network Area (SNA) +* [stackit network-area region create](./stackit_network-area_region_create.md) - Creates a new regional configuration for a STACKIT Network Area (SNA) +* [stackit network-area region delete](./stackit_network-area_region_delete.md) - Deletes a regional configuration for a STACKIT Network Area (SNA) +* [stackit network-area region describe](./stackit_network-area_region_describe.md) - Describes a regional configuration for a STACKIT Network Area (SNA) +* [stackit network-area region list](./stackit_network-area_region_list.md) - Lists all configured regions for a STACKIT Network Area (SNA) +* [stackit network-area region update](./stackit_network-area_region_update.md) - Updates a existing regional configuration for a STACKIT Network Area (SNA) + diff --git a/docs/stackit_network-area_region_create.md b/docs/stackit_network-area_region_create.md new file mode 100644 index 000000000..55632632f --- /dev/null +++ b/docs/stackit_network-area_region_create.md @@ -0,0 +1,58 @@ +## stackit network-area region create + +Creates a new regional configuration for a STACKIT Network Area (SNA) + +### Synopsis + +Creates a new regional configuration for a STACKIT Network Area (SNA). + +``` +stackit network-area region create [flags] +``` + +### Examples + +``` + Create a new regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24" and ipv4 transfer network "192.168.1.0/24" + $ stackit network-area region create --network-area-id xxx --region eu02 --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 + + Create a new regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", using the set region config + $ stackit config set --region eu02 + $ stackit network-area region create --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 + + Create a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20" + $ stackit network-area region create --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20 + + Create a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20" + $ stackit network-area region create --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20 +``` + +### Options + +``` + -h, --help Help for "stackit network-area region create" + --ipv4-default-nameservers strings List of default DNS name server IPs + --ipv4-default-prefix-length int The default prefix length for networks in the network area + --ipv4-max-prefix-length int The maximum prefix length for networks in the network area + --ipv4-min-prefix-length int The minimum prefix length for networks in the network area + --ipv4-network-ranges strings Network range to create in CIDR notation (default []) + --ipv4-transfer-network string Transfer network in CIDR notation + --network-area-id string STACKIT Network Area (SNA) ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) + diff --git a/docs/stackit_network-area_region_delete.md b/docs/stackit_network-area_region_delete.md new file mode 100644 index 000000000..6f2193e5e --- /dev/null +++ b/docs/stackit_network-area_region_delete.md @@ -0,0 +1,46 @@ +## stackit network-area region delete + +Deletes a regional configuration for a STACKIT Network Area (SNA) + +### Synopsis + +Deletes a regional configuration for a STACKIT Network Area (SNA). + +``` +stackit network-area region delete [flags] +``` + +### Examples + +``` + Delete a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" + $ stackit network-area region delete --network-area-id xxx --region eu02 --organization-id yyy + + Delete a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", using the set region config + $ stackit config set --region eu02 + $ stackit network-area region delete --network-area-id xxx --organization-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit network-area region delete" + --network-area-id string STACKIT Network Area (SNA) ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) + diff --git a/docs/stackit_network-area_region_describe.md b/docs/stackit_network-area_region_describe.md new file mode 100644 index 000000000..e97ee813a --- /dev/null +++ b/docs/stackit_network-area_region_describe.md @@ -0,0 +1,46 @@ +## stackit network-area region describe + +Describes a regional configuration for a STACKIT Network Area (SNA) + +### Synopsis + +Describes a regional configuration for a STACKIT Network Area (SNA). + +``` +stackit network-area region describe [flags] +``` + +### Examples + +``` + Describe a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" + $ stackit network-area region describe --network-area-id xxx --region eu02 --organization-id yyy + + Describe a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", using the set region config + $ stackit config set --region eu02 + $ stackit network-area region describe --network-area-id xxx --organization-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit network-area region describe" + --network-area-id string STACKIT Network Area (SNA) ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) + diff --git a/docs/stackit_network-area_region_list.md b/docs/stackit_network-area_region_list.md new file mode 100644 index 000000000..2b6eaf673 --- /dev/null +++ b/docs/stackit_network-area_region_list.md @@ -0,0 +1,42 @@ +## stackit network-area region list + +Lists all configured regions for a STACKIT Network Area (SNA) + +### Synopsis + +Lists all configured regions for a STACKIT Network Area (SNA). + +``` +stackit network-area region list [flags] +``` + +### Examples + +``` + List all configured region for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" + $ stackit network-area region list --network-area-id xxx --organization-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit network-area region list" + --network-area-id string STACKIT Network Area (SNA) ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) + diff --git a/docs/stackit_network-area_region_update.md b/docs/stackit_network-area_region_update.md new file mode 100644 index 000000000..400d85bc7 --- /dev/null +++ b/docs/stackit_network-area_region_update.md @@ -0,0 +1,56 @@ +## stackit network-area region update + +Updates a existing regional configuration for a STACKIT Network Area (SNA) + +### Synopsis + +Updates a existing regional configuration for a STACKIT Network Area (SNA). + +``` +stackit network-area region update [flags] +``` + +### Examples + +``` + Update a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" with new ipv4-default-nameservers "8.8.8.8" + $ stackit network-area region update --network-area-id xxx --region eu02 --organization-id yyy --ipv4-default-nameservers 8.8.8.8 + + Update a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" with new ipv4-default-nameservers "8.8.8.8", using the set region config + $ stackit config set --region eu02 + $ stackit network-area region update --network-area-id xxx --organization-id yyy --ipv4-default-nameservers 8.8.8.8 + + Update a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20" + $ stackit network-area region update --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20 + + Update a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20" + $ stackit network-area region update --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20 +``` + +### Options + +``` + -h, --help Help for "stackit network-area region update" + --ipv4-default-nameservers strings List of default DNS name server IPs + --ipv4-default-prefix-length int The default prefix length for networks in the network area + --ipv4-max-prefix-length int The maximum prefix length for networks in the network area + --ipv4-min-prefix-length int The minimum prefix length for networks in the network area + --network-area-id string STACKIT Network Area (SNA) ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) + diff --git a/docs/stackit_network-area_route_create.md b/docs/stackit_network-area_route_create.md index 79d239fee..ff697f896 100644 --- a/docs/stackit_network-area_route_create.md +++ b/docs/stackit_network-area_route_create.md @@ -15,22 +15,25 @@ stackit network-area route create [flags] ### Examples ``` - Create a static route with prefix "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy" - $ stackit network-area route create --organization-id yyy --network-area-id xxx --prefix 1.1.1.0/24 --next-hop 1.1.1.1 + Create a static route with destination "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy" + $ stackit network-area route create --organization-id yyy --network-area-id xxx --destination 1.1.1.0/24 --next-hop 1.1.1.1 - Create a static route with labels "key:value" and "foo:bar" with prefix "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy" - $ stackit network-area route create --labels key=value,foo=bar --organization-id yyy --network-area-id xxx --prefix 1.1.1.0/24 --next-hop 1.1.1.1 + Create a static route with labels "key:value" and "foo:bar" with destination "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy" + $ stackit network-area route create --labels key=value,foo=bar --organization-id yyy --network-area-id xxx --destination 1.1.1.0/24 --next-hop 1.1.1.1 ``` ### Options ``` + --destination string Destination route. Must be a valid IPv4 or IPv6 CIDR -h, --help Help for "stackit network-area route create" --labels stringToString Labels are key-value string pairs which can be attached to a route. A label can be provided with the format key=value and the flag can be used multiple times to provide a list of labels (default []) --network-area-id string STACKIT Network Area ID - --next-hop string Next hop IP address. Must be a valid IPv4 + --next-hop-ipv4 string Next hop IPv4 address + --next-hop-ipv6 string Next hop IPv6 address + --nexthop-blackhole Sets next hop to black hole + --nexthop-internet Sets next hop to internet --organization-id string Organization ID - --prefix string Static route prefix ``` ### Options inherited from parent commands diff --git a/docs/stackit_network-area_update.md b/docs/stackit_network-area_update.md index 57b32a662..77665f0e8 100644 --- a/docs/stackit_network-area_update.md +++ b/docs/stackit_network-area_update.md @@ -20,14 +20,10 @@ stackit network-area update AREA_ID [flags] ### Options ``` - --default-prefix-length int The default prefix length for networks in the network area - --dns-name-servers strings List of DNS name server IPs - -h, --help Help for "stackit network-area update" - --labels stringToString Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...' (default []) - --max-prefix-length int The maximum prefix length for networks in the network area - --min-prefix-length int The minimum prefix length for networks in the network area - -n, --name string Network area name - --organization-id string Organization ID + -h, --help Help for "stackit network-area update" + --labels stringToString Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...' (default []) + -n, --name string Network area name + --organization-id string Organization ID ``` ### Options inherited from parent commands diff --git a/docs/stackit_network_create.md b/docs/stackit_network_create.md index 21d9e863c..146264977 100644 --- a/docs/stackit_network_create.md +++ b/docs/stackit_network_create.md @@ -26,7 +26,7 @@ stackit network create [flags] $ stackit network create --name network-1 --labels key=value,key1=value1 Create an IPv4 network with name "network-1" with DNS name servers, a prefix and a gateway - $ stackit network create --name network-1 --ipv4-dns-name-servers "1.1.1.1,8.8.8.8,9.9.9.9" --ipv4-prefix "10.1.2.0/24" --ipv4-gateway "10.1.2.3" + $ stackit network create --name network-1 --non-routed --ipv4-dns-name-servers "1.1.1.1,8.8.8.8,9.9.9.9" --ipv4-prefix "10.1.2.0/24" --ipv4-gateway "10.1.2.3" Create an IPv6 network with name "network-1" with DNS name servers, a prefix and a gateway $ stackit network create --name network-1 --ipv6-dns-name-servers "2001:4860:4860::8888,2001:4860:4860::8844" --ipv6-prefix "2001:4860:4860::8888" --ipv6-gateway "2001:4860:4860::8888" diff --git a/go.mod b/go.mod index 6eff66cae..1d4e8ac4f 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.0.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index b9e0a5002..850d60dfe 100644 --- a/go.sum +++ b/go.sum @@ -571,8 +571,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7gUXYzrN0Ip5NXj+6LFBp1EO6cg= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0 h1:dnEjyapuv8WwRN5vE2z6+4/+ZqQTBx+bX27x2nOF7Jw= -github.com/stackitcloud/stackit-sdk-go/services/iaas v0.31.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.0.0 h1:qLMpd5whPMLnaLEdFQjK51q/o9V6eMFMORBDSsyGyNI= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.0.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0/go.mod h1:KEPVoO21pC4bjy5l0nyhjUJ0+uVwVWb+k2TYrzJ8xYw= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index 89e7659bb..311115644 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -88,7 +88,7 @@ func configureFlags(cmd *cobra.Command) { } func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClient) iaas.ApiCreateAffinityGroupRequest { - req := apiClient.CreateAffinityGroup(ctx, model.ProjectId) + req := apiClient.CreateAffinityGroup(ctx, model.ProjectId, model.Region) req = req.CreateAffinityGroupPayload( iaas.CreateAffinityGroupPayload{ Name: utils.Ptr(model.Name), diff --git a/internal/cmd/affinity-groups/create/create_test.go b/internal/cmd/affinity-groups/create/create_test.go index ba70232d0..6876da538 100644 --- a/internal/cmd/affinity-groups/create/create_test.go +++ b/internal/cmd/affinity-groups/create/create_test.go @@ -15,7 +15,11 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -const projectIdFlag = globalflags.ProjectIdFlag +const ( + testName = "test-name" + testPolicy = "test-policy" + testRegion = "eu01" +) type testCtxKey struct{} @@ -25,14 +29,10 @@ var ( testProjectId = uuid.NewString() ) -const ( - testName = "test-name" - testPolicy = "test-policy" -) - func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, nameFlag: testName, policyFlag: testPolicy, @@ -48,6 +48,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Name: testName, Policy: testPolicy, @@ -59,7 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateAffinityGroupRequest)) iaas.ApiCreateAffinityGroupRequest { - request := testClient.CreateAffinityGroup(testCtx, testProjectId) + request := testClient.CreateAffinityGroup(testCtx, testProjectId, testRegion) request = request.CreateAffinityGroupPayload(fixturePayload()) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index 59532f96d..fdfb68c1a 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - affinityGroupLabel, err := iaasUtils.GetAffinityGroupName(ctx, apiClient, model.ProjectId, model.AffinityGroupId) + affinityGroupLabel, err := iaasUtils.GetAffinityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.AffinityGroupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get affinity group name: %v", err) affinityGroupLabel = model.AffinityGroupId @@ -87,7 +87,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteAffinityGroupRequest { - return apiClient.DeleteAffinityGroup(ctx, model.ProjectId, model.AffinityGroupId) + return apiClient.DeleteAffinityGroup(ctx, model.ProjectId, model.Region, model.AffinityGroupId) } func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { diff --git a/internal/cmd/affinity-groups/delete/delete_test.go b/internal/cmd/affinity-groups/delete/delete_test.go index e3df49cbb..d66437d2f 100644 --- a/internal/cmd/affinity-groups/delete/delete_test.go +++ b/internal/cmd/affinity-groups/delete/delete_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -const projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +39,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -50,6 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, AffinityGroupId: testAffinityGroupId, } @@ -60,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteAffinityGroupRequest)) iaas.ApiDeleteAffinityGroupRequest { - request := testClient.DeleteAffinityGroup(testCtx, testProjectId, testAffinityGroupId) + request := testClient.DeleteAffinityGroup(testCtx, testProjectId, testRegion, testAffinityGroupId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 7af292d74..5510a439d 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClient) iaas.ApiGetAffinityGroupRequest { - return apiClient.GetAffinityGroup(ctx, model.ProjectId, model.AffinityGroupId) + return apiClient.GetAffinityGroup(ctx, model.ProjectId, model.Region, model.AffinityGroupId) } func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputModel, error) { diff --git a/internal/cmd/affinity-groups/describe/describe_test.go b/internal/cmd/affinity-groups/describe/describe_test.go index 530319c96..01c0d3eac 100644 --- a/internal/cmd/affinity-groups/describe/describe_test.go +++ b/internal/cmd/affinity-groups/describe/describe_test.go @@ -13,12 +13,14 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -const projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} var ( - testCtx = context.WithValue(context.Background(), &testCtxKey{}, projectIdFlag) + testCtx = context.WithValue(context.Background(), &testCtxKey{}, "test") testClient = &iaas.APIClient{} testProjectId = uuid.NewString() @@ -37,7 +39,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -50,6 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, AffinityGroupId: testAffinityGroupId, } @@ -60,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetAffinityGroupRequest)) iaas.ApiGetAffinityGroupRequest { - request := testClient.GetAffinityGroup(testCtx, testProjectId, testAffinityGroupId) + request := testClient.GetAffinityGroup(testCtx, testProjectId, testRegion, testAffinityGroupId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 75d0e667e..3752106e0 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -82,7 +82,7 @@ func configureFlags(cmd *cobra.Command) { } func buildRequest(ctx context.Context, model inputModel, apiClient *iaas.APIClient) iaas.ApiListAffinityGroupsRequest { - return apiClient.ListAffinityGroups(ctx, model.ProjectId) + return apiClient.ListAffinityGroups(ctx, model.ProjectId, model.Region) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { diff --git a/internal/cmd/affinity-groups/list/list_test.go b/internal/cmd/affinity-groups/list/list_test.go index 23c643f1b..5c792a299 100644 --- a/internal/cmd/affinity-groups/list/list_test.go +++ b/internal/cmd/affinity-groups/list/list_test.go @@ -16,7 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -const projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" + testLimit = 10 +) type testCtxKey struct{} @@ -26,13 +29,10 @@ var ( testProjectId = uuid.NewString() ) -const ( - testLimit = 10 -) - func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -45,6 +45,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, } for _, mod := range mods { @@ -54,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListAffinityGroupsRequest)) iaas.ApiListAffinityGroupsRequest { - request := testClient.ListAffinityGroups(testCtx, testProjectId) + request := testClient.ListAffinityGroups(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 9ad653d18..06a270b11 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -332,7 +332,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateImageRequest { - request := apiClient.CreateImage(ctx, model.ProjectId). + request := apiClient.CreateImage(ctx, model.ProjectId, model.Region). CreateImagePayload(createPayload(ctx, model)) return request } diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index 545586502..2b28c7676 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -17,15 +17,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag - -type testCtxKey struct{} - -var ( - testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") - testClient = &iaas.APIClient{} - testProjectId = uuid.NewString() - +const ( + testRegion = "eu01" testLocalImagePath = "/does/not/exist" testDiskFormat = "raw" testDiskSize int64 = 16 * 1024 * 1024 * 1024 @@ -49,9 +42,18 @@ var ( testLabels = "foo=FOO,bar=BAR,baz=BAZ" ) +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() +) + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, nameFlag: testName, diskFormatFlag: testDiskFormat, @@ -93,30 +95,34 @@ func parseLabels(labelstring string) map[string]string { func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - Name: testName, - DiskFormat: testDiskFormat, - LocalFilePath: testLocalImagePath, - Labels: utils.Ptr(parseLabels(testLabels)), + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Name: testName, + DiskFormat: testDiskFormat, + LocalFilePath: testLocalImagePath, + Labels: utils.Ptr(parseLabels(testLabels)), Config: &imageConfig{ - Architecture: &testArchitecture, - BootMenu: &testBootmenu, - CdromBus: &testCdRomBus, - DiskBus: &testDiskBus, - NicModel: &testNicModel, - OperatingSystem: &testOperatingSystem, - OperatingSystemDistro: &testOperatingSystemDistro, - OperatingSystemVersion: &testOperatingSystemVersion, - RescueBus: &testRescueBus, - RescueDevice: &testRescueDevice, - SecureBoot: &testSecureBoot, + Architecture: utils.Ptr(testArchitecture), + BootMenu: utils.Ptr(testBootmenu), + CdromBus: utils.Ptr(testCdRomBus), + DiskBus: utils.Ptr(testDiskBus), + NicModel: utils.Ptr(testNicModel), + OperatingSystem: utils.Ptr(testOperatingSystem), + OperatingSystemDistro: utils.Ptr(testOperatingSystemDistro), + OperatingSystemVersion: utils.Ptr(testOperatingSystemVersion), + RescueBus: utils.Ptr(testRescueBus), + RescueDevice: utils.Ptr(testRescueDevice), + SecureBoot: utils.Ptr(testSecureBoot), Uefi: testUefi, - VideoModel: &testVideoModel, - VirtioScsi: &testVirtioScsi, + VideoModel: utils.Ptr(testVideoModel), + VirtioScsi: utils.Ptr(testVirtioScsi), }, - MinDiskSize: &testDiskSize, - MinRam: &testRamSize, - Protected: &testProtected, + MinDiskSize: utils.Ptr(testDiskSize), + MinRam: utils.Ptr(testRamSize), + Protected: utils.Ptr(testProtected), } for _, mod := range mods { mod(model) @@ -127,31 +133,31 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixtureCreatePayload(mods ...func(payload *iaas.CreateImagePayload)) (payload iaas.CreateImagePayload) { payload = iaas.CreateImagePayload{ Config: &iaas.ImageConfig{ - Architecture: &testArchitecture, - BootMenu: &testBootmenu, - CdromBus: iaas.NewNullableString(&testCdRomBus), - DiskBus: iaas.NewNullableString(&testDiskBus), - NicModel: iaas.NewNullableString(&testNicModel), - OperatingSystem: &testOperatingSystem, - OperatingSystemDistro: iaas.NewNullableString(&testOperatingSystemDistro), - OperatingSystemVersion: iaas.NewNullableString(&testOperatingSystemVersion), - RescueBus: iaas.NewNullableString(&testRescueBus), - RescueDevice: iaas.NewNullableString(&testRescueDevice), - SecureBoot: &testSecureBoot, - Uefi: &testUefi, - VideoModel: iaas.NewNullableString(&testVideoModel), - VirtioScsi: &testVirtioScsi, + Architecture: utils.Ptr(testArchitecture), + BootMenu: utils.Ptr(testBootmenu), + CdromBus: iaas.NewNullableString(utils.Ptr(testCdRomBus)), + DiskBus: iaas.NewNullableString(utils.Ptr(testDiskBus)), + NicModel: iaas.NewNullableString(utils.Ptr(testNicModel)), + OperatingSystem: utils.Ptr(testOperatingSystem), + OperatingSystemDistro: iaas.NewNullableString(utils.Ptr(testOperatingSystemDistro)), + OperatingSystemVersion: iaas.NewNullableString(utils.Ptr(testOperatingSystemVersion)), + RescueBus: iaas.NewNullableString(utils.Ptr(testRescueBus)), + RescueDevice: iaas.NewNullableString(utils.Ptr(testRescueDevice)), + SecureBoot: utils.Ptr(testSecureBoot), + Uefi: utils.Ptr(testUefi), + VideoModel: iaas.NewNullableString(utils.Ptr(testVideoModel)), + VirtioScsi: utils.Ptr(testVirtioScsi), }, - DiskFormat: &testDiskFormat, + DiskFormat: utils.Ptr(testDiskFormat), Labels: &map[string]interface{}{ "foo": "FOO", "bar": "BAR", "baz": "BAZ", }, - MinDiskSize: &testDiskSize, - MinRam: &testRamSize, - Name: &testName, - Protected: &testProtected, + MinDiskSize: utils.Ptr(testDiskSize), + MinRam: utils.Ptr(testRamSize), + Name: utils.Ptr(testName), + Protected: utils.Ptr(testProtected), } for _, mod := range mods { mod(&payload) @@ -160,7 +166,7 @@ func fixtureCreatePayload(mods ...func(payload *iaas.CreateImagePayload)) (paylo } func fixtureRequest(mods ...func(request *iaas.ApiCreateImageRequest)) iaas.ApiCreateImageRequest { - request := testClient.CreateImage(testCtx, testProjectId) + request := testClient.CreateImage(testCtx, testProjectId, testRegion) request = request.CreateImagePayload(fixtureCreatePayload()) @@ -192,21 +198,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index 80f7f2dc8..d394c0bfd 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - imageName, err := iaasUtils.GetImageName(ctx, apiClient, model.ProjectId, model.ImageId) + imageName, err := iaasUtils.GetImageName(ctx, apiClient, model.ProjectId, model.Region, model.ImageId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get image name: %v", err) imageName = model.ImageId @@ -98,6 +98,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteImageRequest { - request := apiClient.DeleteImage(ctx, model.ProjectId, model.ImageId) + request := apiClient.DeleteImage(ctx, model.ProjectId, model.Region, model.ImageId) return request } diff --git a/internal/cmd/image/delete/delete_test.go b/internal/cmd/image/delete/delete_test.go index 2b4f74c1e..cd1179f41 100644 --- a/internal/cmd/image/delete/delete_test.go +++ b/internal/cmd/image/delete/delete_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,8 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -37,8 +40,12 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - ImageId: testImageId, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ImageId: testImageId, } for _, mod := range mods { mod(model) @@ -47,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteImageRequest)) iaas.ApiDeleteImageRequest { - request := testClient.DeleteImage(testCtx, testProjectId, testImageId) + request := testClient.DeleteImage(testCtx, testProjectId, testRegion, testImageId) for _, mod := range mods { mod(&request) } @@ -73,14 +80,14 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index b6d81e06d..516fa9c99 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -67,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetImageRequest { - request := apiClient.GetImage(ctx, model.ProjectId, model.ImageId) + request := apiClient.GetImage(ctx, model.ProjectId, model.Region, model.ImageId) return request } diff --git a/internal/cmd/image/describe/describe_test.go b/internal/cmd/image/describe/describe_test.go index 076010d69..6a76a3200 100644 --- a/internal/cmd/image/describe/describe_test.go +++ b/internal/cmd/image/describe/describe_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,8 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -37,8 +40,12 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - ImageId: testImageId[0], + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ImageId: testImageId[0], } for _, mod := range mods { mod(model) @@ -47,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetImageRequest)) iaas.ApiGetImageRequest { - request := testClient.GetImage(testCtx, testProjectId, testImageId[0]) + request := testClient.GetImage(testCtx, testProjectId, testRegion, testImageId[0]) for _, mod := range mods { mod(&request) } @@ -79,7 +86,7 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), args: testImageId, isValid: false, @@ -87,7 +94,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), args: testImageId, isValid: false, @@ -95,7 +102,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), args: testImageId, isValid: false, diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index a0949187f..0ebdf9e95 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -128,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListImagesRequest { - request := apiClient.ListImages(ctx, model.ProjectId) + request := apiClient.ListImages(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { request = request.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/image/list/list_test.go b/internal/cmd/image/list/list_test.go index bdfc4c6ed..6dbdb119f 100644 --- a/internal/cmd/image/list/list_test.go +++ b/internal/cmd/image/list/list_test.go @@ -17,7 +17,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -31,7 +33,9 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + labelSelectorFlag: testLabels, limitFlag: strconv.Itoa(int(testLimit)), } @@ -43,9 +47,13 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - LabelSelector: utils.Ptr(testLabels), - Limit: &testLimit, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + LabelSelector: utils.Ptr(testLabels), + Limit: &testLimit, } for _, mod := range mods { mod(model) @@ -54,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListImagesRequest)) iaas.ApiListImagesRequest { - request := testClient.ListImages(testCtx, testProjectId) + request := testClient.ListImages(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabels) for _, mod := range mods { mod(&request) @@ -84,21 +92,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index 434fc0ea8..799b594b6 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -132,7 +132,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - imageLabel, err := iaasUtils.GetImageName(ctx, apiClient, model.ProjectId, model.Id) + imageLabel, err := iaasUtils.GetImageName(ctx, apiClient, model.ProjectId, model.Region, model.Id) if err != nil { params.Printer.Debug(print.WarningLevel, "cannot retrieve image name: %v", err) imageLabel = model.Id @@ -238,7 +238,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateImageRequest { - request := apiClient.UpdateImage(ctx, model.ProjectId, model.Id) + request := apiClient.UpdateImage(ctx, model.ProjectId, model.Region, model.Id) payload := iaas.NewUpdateImagePayload() // Config *ImageConfig `json:"config,omitempty"` diff --git a/internal/cmd/image/update/update_test.go b/internal/cmd/image/update/update_test.go index a40748f3b..9df1cf99e 100644 --- a/internal/cmd/image/update/update_test.go +++ b/internal/cmd/image/update/update_test.go @@ -17,7 +17,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -50,7 +52,8 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, nameFlag: testName, diskFormatFlag: testDiskFormat, @@ -90,11 +93,15 @@ func parseLabels(labelstring string) map[string]string { func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - Id: testImageId[0], - Name: &testName, - DiskFormat: &testDiskFormat, - Labels: utils.Ptr(parseLabels(testLabels)), + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Id: testImageId[0], + Name: &testName, + DiskFormat: &testDiskFormat, + Labels: utils.Ptr(parseLabels(testLabels)), Config: &imageConfig{ BootMenu: &testBootmenu, CdromBus: &testCdRomBus, @@ -155,7 +162,7 @@ func fixtureCreatePayload(mods ...func(payload *iaas.UpdateImagePayload)) (paylo } func fixtureRequest(mods ...func(*iaas.ApiUpdateImageRequest)) iaas.ApiUpdateImageRequest { - request := testClient.UpdateImage(testCtx, testProjectId, testImageId[0]) + request := testClient.UpdateImage(testCtx, testProjectId, testRegion, testImageId[0]) request = request.UpdateImagePayload(fixtureCreatePayload()) @@ -184,7 +191,7 @@ func TestParseInput(t *testing.T) { { description: "no values but valid image id", flagValues: map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, }, args: testImageId, isValid: false, @@ -196,7 +203,7 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), args: testImageId, isValid: false, @@ -204,7 +211,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), args: testImageId, isValid: false, @@ -212,7 +219,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), args: testImageId, isValid: false, @@ -302,8 +309,8 @@ func TestParseInput(t *testing.T) { { description: "update only name", flagValues: map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "foo", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "foo", }, args: testImageId, isValid: true, diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index fa97908d9..7268d0a2d 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -3,9 +3,12 @@ package create import ( "context" "fmt" + "os" + "strings" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -13,35 +16,58 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) const ( - nameFlag = "name" - organizationIdFlag = "organization-id" - dnsNameServersFlag = "dns-name-servers" - networkRangesFlag = "network-ranges" - transferNetworkFlag = "transfer-network" + nameFlag = "name" + organizationIdFlag = "organization-id" + // Deprecated: dnsNameServersFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + dnsNameServersFlag = "dns-name-servers" + // Deprecated: networkRangesFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + networkRangesFlag = "network-ranges" + // Deprecated: transferNetworkFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + transferNetworkFlag = "transfer-network" + // Deprecated: defaultPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. defaultPrefixLengthFlag = "default-prefix-length" - maxPrefixLengthFlag = "max-prefix-length" - minPrefixLengthFlag = "min-prefix-length" - labelFlag = "labels" + // Deprecated: maxPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + maxPrefixLengthFlag = "max-prefix-length" + // Deprecated: minPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + minPrefixLengthFlag = "min-prefix-length" + labelFlag = "labels" + + deprecationMessage = "Deprecated and will be removed after April 2026. Use instead the new command `$ stackit network-area region` to configure these options for a network area." ) type inputModel struct { *globalflags.GlobalFlagModel - Name *string - OrganizationId *string - DnsNameServers *[]string - NetworkRanges *[]string - TransferNetwork *string + Name *string + OrganizationId string + // Deprecated: DnsNameServers is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + DnsNameServers *[]string + // Deprecated: NetworkRanges is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + NetworkRanges *[]string + // Deprecated: TransferNetwork is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + TransferNetwork *string + // Deprecated: DefaultPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. DefaultPrefixLength *int64 - MaxPrefixLength *int64 - MinPrefixLength *int64 - Labels *map[string]string + // Deprecated: MaxPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + MaxPrefixLength *int64 + // Deprecated: MinPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + MinPrefixLength *int64 + Labels *map[string]string +} + +// NetworkAreaResponses is a workaround, to keep the two responses of the iaas v2 api together for the json and yaml output +// Should be removed when the deprecated flags are removed +type NetworkAreaResponses struct { + NetworkArea iaas.NetworkArea `json:"network_area"` + RegionalArea *iaas.RegionalArea `json:"regional_area"` } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -52,20 +78,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Args: args.NoArgs, Example: examples.Build( examples.NewExample( - `Create a network area with name "network-area-1" in organization with ID "xxx" with network ranges and a transfer network`, - `$ stackit network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24"`, - ), - examples.NewExample( - `Create a network area with name "network-area-2" in organization with ID "xxx" with network ranges, transfer network and DNS name server`, - `$ stackit network-area create --name network-area-2 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --dns-name-servers "1.1.1.1"`, - ), - examples.NewExample( - `Create a network area with name "network-area-3" in organization with ID "xxx" with network ranges, transfer network and additional options`, - `$ stackit network-area create --name network-area-3 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --default-prefix-length 25 --max-prefix-length 29 --min-prefix-length 24`, + `Create a network area with name "network-area-1" in organization with ID "xxx"`, + `$ stackit network-area create --name network-area-1 --organization-id xxx"`, ), examples.NewExample( - `Create a network area with name "network-area-1" in organization with ID "xxx" with network ranges and a transfer network and labels "key=value,key1=value1"`, - `$ stackit network-area create --name network-area-1 --organization-id xxx --network-ranges "1.1.1.0/24,192.123.1.0/24" --transfer-network "192.160.0.0/24" --labels key=value,key1=value1`, + `Create a network area with name "network-area-1" in organization with ID "xxx" with labels "key=value,key1=value1"`, + `$ stackit network-area create --name network-area-1 --organization-id xxx --labels key=value,key1=value1`, ), ), RunE: func(cmd *cobra.Command, args []string) error { @@ -84,12 +102,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { var orgLabel string rmApiClient, err := rmClient.ConfigureClient(params.Printer, params.CliVersion) if err == nil { - orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, *model.OrganizationId) + orgLabel, err = rmUtils.GetOrganizationName(ctx, rmApiClient, model.OrganizationId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get organization name: %v", err) - orgLabel = *model.OrganizationId + orgLabel = model.OrganizationId } else if orgLabel == "" { - orgLabel = *model.OrganizationId + orgLabel = model.OrganizationId } } else { params.Printer.Debug(print.ErrorLevel, "configure resource manager client: %v", err) @@ -109,8 +127,38 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create network area: %w", err) } + if resp == nil || resp.Id == nil { + return fmt.Errorf("create network area: empty response") + } + + responses := &NetworkAreaResponses{ + NetworkArea: *resp, + } - return outputResult(params.Printer, model.OutputFormat, orgLabel, resp) + if hasDeprecatedFlagsSet(model) { + deprecatedFlags := getConfiguredDeprecatedFlags(model) + params.Printer.Warn("the flags %q are deprecated and will be removed after April 2026. Use `$ stackit network-area region` to configure these options for a network area.\n", strings.Join(deprecatedFlags, ",")) + if resp == nil || resp.Id == nil { + return fmt.Errorf("create network area: empty response") + } + reqNetworkArea := buildRequestNetworkAreaRegion(ctx, model, *resp.Id, apiClient) + respNetworkArea, err := reqNetworkArea.Execute() + if err != nil { + return fmt.Errorf("create network area region: %w", err) + } + if !model.AssumeYes { + s := spinner.New(params.Printer) + s.Start("Create network area region") + _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, *resp.Id, model.Region).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for creating network area region %w", err) + } + s.Stop() + } + responses.RegionalArea = respNetworkArea + } + + return outputResult(params.Printer, model.OutputFormat, orgLabel, responses) }, } configureFlags(cmd) @@ -120,25 +168,64 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(nameFlag, "n", "", "Network area name") cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...'") cmd.Flags().StringSlice(dnsNameServersFlag, nil, "List of DNS name server IPs") cmd.Flags().Var(flags.CIDRSliceFlag(), networkRangesFlag, "List of network ranges") cmd.Flags().Var(flags.CIDRFlag(), transferNetworkFlag, "Transfer network in CIDR notation") cmd.Flags().Int64(defaultPrefixLengthFlag, 0, "The default prefix length for networks in the network area") cmd.Flags().Int64(maxPrefixLengthFlag, 0, "The maximum prefix length for networks in the network area") cmd.Flags().Int64(minPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area") - cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...'") - err := flags.MarkFlagsRequired(cmd, nameFlag, organizationIdFlag, networkRangesFlag, transferNetworkFlag) + cobra.CheckErr(cmd.Flags().MarkDeprecated(dnsNameServersFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(networkRangesFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(transferNetworkFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(defaultPrefixLengthFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(maxPrefixLengthFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(minPrefixLengthFlag, deprecationMessage)) + // Set the output for deprecation warnings to stderr + cmd.Flags().SetOutput(os.Stderr) + + cmd.MarkFlagsRequiredTogether(networkRangesFlag, transferNetworkFlag) + + err := flags.MarkFlagsRequired(cmd, nameFlag, organizationIdFlag) cobra.CheckErr(err) } +func hasDeprecatedFlagsSet(model *inputModel) bool { + deprecatedFlags := getConfiguredDeprecatedFlags(model) + return len(deprecatedFlags) > 0 +} + +func getConfiguredDeprecatedFlags(model *inputModel) []string { + var result []string + if model.DnsNameServers != nil { + result = append(result, dnsNameServersFlag) + } + if model.NetworkRanges != nil { + result = append(result, networkRangesFlag) + } + if model.TransferNetwork != nil { + result = append(result, transferNetworkFlag) + } + if model.DefaultPrefixLength != nil { + result = append(result, defaultPrefixLengthFlag) + } + if model.MaxPrefixLength != nil { + result = append(result, maxPrefixLengthFlag) + } + if model.MinPrefixLength != nil { + result = append(result, minPrefixLengthFlag) + } + return result +} + func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) model := inputModel{ GlobalFlagModel: globalFlags, Name: flags.FlagToStringPointer(p, cmd, nameFlag), - OrganizationId: flags.FlagToStringPointer(p, cmd, organizationIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), DnsNameServers: flags.FlagToStringSlicePointer(p, cmd, dnsNameServersFlag), NetworkRanges: flags.FlagToStringSlicePointer(p, cmd, networkRangesFlag), TransferNetwork: flags.FlagToStringPointer(p, cmd, transferNetworkFlag), @@ -148,44 +235,71 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } + // Check if any of the deprecated **optional** fields are set and if no of the associated deprecated **required** fields is set. + hasAllRequiredRegionalAreaFieldsSet := model.NetworkRanges != nil && model.TransferNetwork != nil + hasOptionalRegionalAreaFieldsSet := model.DnsNameServers != nil || model.DefaultPrefixLength != nil || model.MaxPrefixLength != nil || model.MinPrefixLength != nil + if hasOptionalRegionalAreaFieldsSet && !hasAllRequiredRegionalAreaFieldsSet { + return nil, &cliErr.MultipleFlagsAreMissing{ + MissingFlags: []string{networkRangesFlag, transferNetworkFlag}, + SetFlags: []string{dnsNameServersFlag, defaultPrefixLengthFlag, minPrefixLengthFlag, maxPrefixLengthFlag}, + } + } + p.DebugInputModel(model) return &model, nil } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRequest { - req := apiClient.CreateNetworkArea(ctx, *model.OrganizationId) - - networkRanges := make([]iaas.NetworkRange, len(*model.NetworkRanges)) - for i, networkRange := range *model.NetworkRanges { - networkRanges[i] = iaas.NetworkRange{ - Prefix: utils.Ptr(networkRange), - } - } + req := apiClient.CreateNetworkArea(ctx, model.OrganizationId) payload := iaas.CreateNetworkAreaPayload{ Name: model.Name, Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), - AddressFamily: &iaas.CreateAreaAddressFamily{ - Ipv4: &iaas.CreateAreaIPv4{ - DefaultNameservers: model.DnsNameServers, - NetworkRanges: utils.Ptr(networkRanges), - TransferNetwork: model.TransferNetwork, - DefaultPrefixLen: model.DefaultPrefixLength, - MaxPrefixLen: model.MaxPrefixLength, - MinPrefixLen: model.MinPrefixLength, - }, - }, } return req.CreateNetworkAreaPayload(payload) } -func outputResult(p *print.Printer, outputFormat, orgLabel string, networkArea *iaas.NetworkArea) error { - if networkArea == nil { +func buildRequestNetworkAreaRegion(ctx context.Context, model *inputModel, networkAreaId string, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRegionRequest { + req := apiClient.CreateNetworkAreaRegion(ctx, model.OrganizationId, networkAreaId, model.Region) + + var networkRanges []iaas.NetworkRange + if model.NetworkRanges != nil { + networkRanges = make([]iaas.NetworkRange, len(*model.NetworkRanges)) + for i, networkRange := range *model.NetworkRanges { + networkRanges[i] = iaas.NetworkRange{ + Prefix: utils.Ptr(networkRange), + } + } + } + + payload := iaas.CreateNetworkAreaRegionPayload{ + Ipv4: &iaas.RegionalAreaIPv4{ + DefaultNameservers: model.DnsNameServers, + NetworkRanges: utils.Ptr(networkRanges), + TransferNetwork: model.TransferNetwork, + DefaultPrefixLen: model.DefaultPrefixLength, + MaxPrefixLen: model.MaxPrefixLength, + MinPrefixLen: model.MinPrefixLength, + }, + } + + return req.CreateNetworkAreaRegionPayload(payload) +} + +func outputResult(p *print.Printer, outputFormat, orgLabel string, responses *NetworkAreaResponses) error { + if responses == nil { return fmt.Errorf("network area is nil") } - return p.OutputResult(outputFormat, networkArea, func() error { - p.Outputf("Created STACKIT Network Area for organization %q.\nNetwork area ID: %s\n", orgLabel, utils.PtrString(networkArea.AreaId)) + + prettyOutputFunc := func() error { + p.Outputf("Created STACKIT Network Area for organization %q.\nNetwork area ID: %s\n", orgLabel, utils.PtrString(responses.NetworkArea.Id)) return nil - }) + } + // If RegionalArea is NOT set in the response, then no deprecated Flags were set. + // In this case, only the response of NetworkArea should be printed in JSON and yaml output, to avoid breaking changes after the deprecated fields are removed + if responses.RegionalArea == nil { + return p.OutputResult(outputFormat, responses.NetworkArea, prettyOutputFunc) + } + return p.OutputResult(outputFormat, responses, prettyOutputFunc) } diff --git a/internal/cmd/network-area/create/create_test.go b/internal/cmd/network-area/create/create_test.go index a731541fd..9bfadd260 100644 --- a/internal/cmd/network-area/create/create_test.go +++ b/internal/cmd/network-area/create/create_test.go @@ -2,6 +2,8 @@ package create import ( "context" + "strconv" + "strings" "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -16,24 +18,34 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" + testName = "example-network-area-name" + testTransferNetwork = "100.0.0.0/24" + testDefaultPrefixLength int64 = 25 + testMaxPrefixLength int64 = 26 + testMinPrefixLength int64 = 24 +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &iaas.APIClient{} -var testOrgId = uuid.NewString() +var ( + testOrgId = uuid.NewString() + testAreaId = uuid.NewString() + testDnsNameservers = []string{"1.1.1.0", "1.1.2.0"} + testNetworkRanges = []string{"192.0.0.0/24", "102.0.0.0/24"} +) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - nameFlag: "example-network-area-name", - organizationIdFlag: testOrgId, - dnsNameServersFlag: "1.1.1.0,1.1.2.0", - networkRangesFlag: "192.0.0.0/24,102.0.0.0/24", - transferNetworkFlag: "100.0.0.0/24", - defaultPrefixLengthFlag: "24", - maxPrefixLengthFlag: "24", - minPrefixLengthFlag: "24", - labelFlag: "key=value", + globalflags.RegionFlag: testRegion, + + nameFlag: testName, + organizationIdFlag: testOrgId, + labelFlag: "key=value", } for _, mod := range mods { mod(flagValues) @@ -45,15 +57,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - Name: utils.Ptr("example-network-area-name"), - OrganizationId: utils.Ptr(testOrgId), - DnsNameServers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - NetworkRanges: utils.Ptr([]string{"192.0.0.0/24", "102.0.0.0/24"}), - TransferNetwork: utils.Ptr("100.0.0.0/24"), - DefaultPrefixLength: utils.Ptr(int64(24)), - MaxPrefixLength: utils.Ptr(int64(24)), - MinPrefixLength: utils.Ptr(int64(24)), + Name: utils.Ptr("example-network-area-name"), + OrganizationId: testOrgId, Labels: utils.Ptr(map[string]string{ "key": "value", }), @@ -79,23 +86,40 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaPayload)) iaas.C Labels: utils.Ptr(map[string]interface{}{ "key": "value", }), - AddressFamily: &iaas.CreateAreaAddressFamily{ - Ipv4: &iaas.CreateAreaIPv4{ - DefaultNameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - NetworkRanges: &[]iaas.NetworkRange{ - { - Prefix: utils.Ptr("192.0.0.0/24"), - }, - { - Prefix: utils.Ptr("102.0.0.0/24"), - }, - }, - TransferNetwork: utils.Ptr("100.0.0.0/24"), - DefaultPrefixLen: utils.Ptr(int64(24)), - MaxPrefixLen: utils.Ptr(int64(24)), - MinPrefixLen: utils.Ptr(int64(24)), - }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func fixtureRequestRegionalArea(mods ...func(request *iaas.ApiCreateNetworkAreaRegionRequest)) iaas.ApiCreateNetworkAreaRegionRequest { + req := testClient.CreateNetworkAreaRegion(testCtx, testOrgId, testAreaId, testRegion) + req = req.CreateNetworkAreaRegionPayload(fixtureRegionalAreaPayload()) + for _, mod := range mods { + mod(&req) + } + return req +} + +func fixtureRegionalAreaPayload(mods ...func(request *iaas.CreateNetworkAreaRegionPayload)) iaas.CreateNetworkAreaRegionPayload { + var networkRanges []iaas.NetworkRange + for _, networkRange := range testNetworkRanges { + networkRanges = append(networkRanges, iaas.NetworkRange{ + Prefix: utils.Ptr(networkRange), + }) + } + + payload := iaas.CreateNetworkAreaRegionPayload{ + Ipv4: &iaas.RegionalAreaIPv4{ + DefaultNameservers: utils.Ptr(testDnsNameservers), + DefaultPrefixLen: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLen: utils.Ptr(testMaxPrefixLength), + MinPrefixLen: utils.Ptr(testMinPrefixLength), + NetworkRanges: utils.Ptr(networkRanges), + TransferNetwork: utils.Ptr(testTransferNetwork), }, + Status: nil, } for _, mod := range mods { mod(&payload) @@ -119,20 +143,35 @@ func TestParseInput(t *testing.T) { expectedModel: fixtureInputModel(), }, { - description: "required only", - flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, dnsNameServersFlag) - delete(flagValues, defaultPrefixLengthFlag) - delete(flagValues, maxPrefixLengthFlag) - delete(flagValues, minPrefixLengthFlag) - }), + description: "with deprecated flags", + flagValues: map[string]string{ + nameFlag: testName, + organizationIdFlag: testOrgId, + + // Deprecated flags + dnsNameServersFlag: strings.Join(testDnsNameservers, ","), + networkRangesFlag: strings.Join(testNetworkRanges, ","), + transferNetworkFlag: testTransferNetwork, + defaultPrefixLengthFlag: strconv.FormatInt(testDefaultPrefixLength, 10), + maxPrefixLengthFlag: strconv.FormatInt(testMaxPrefixLength, 10), + minPrefixLengthFlag: strconv.FormatInt(testMinPrefixLength, 10), + }, isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.DnsNameServers = nil - model.DefaultPrefixLength = nil - model.MaxPrefixLength = nil - model.MinPrefixLength = nil - }), + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: testOrgId, + + // Deprecated fields + DnsNameServers: utils.Ptr(testDnsNameservers), + NetworkRanges: utils.Ptr(testNetworkRanges), + TransferNetwork: utils.Ptr(testTransferNetwork), + DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + MinPrefixLength: utils.Ptr(testMinPrefixLength), + }, }, { description: "name missing", @@ -142,16 +181,38 @@ func TestParseInput(t *testing.T) { isValid: false, }, { - description: "network ranges missing", + description: "set deprecated network ranges - missing transfer network", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, networkRangesFlag) + flagValues[networkRangesFlag] = strings.Join(testNetworkRanges, ",") }), isValid: false, }, { - description: "transfer network missing", + description: "set deprecated transfer network - missing network ranges", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, transferNetworkFlag) + flagValues[transferNetworkFlag] = testTransferNetwork + }), + isValid: false, + }, + { + description: "set deprecated transfer network and network ranges", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkRangesFlag] = strings.Join(testNetworkRanges, ",") + flagValues[transferNetworkFlag] = testTransferNetwork + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.NetworkRanges = utils.Ptr(testNetworkRanges) + model.TransferNetwork = utils.Ptr(testTransferNetwork) + }), + }, + { + description: "set deprecated optional flags", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[dnsNameServersFlag] = strings.Join(testDnsNameservers, ",") + flagValues[defaultPrefixLengthFlag] = strconv.FormatInt(testDefaultPrefixLength, 10) + flagValues[maxPrefixLengthFlag] = strconv.FormatInt(testMaxPrefixLength, 10) + flagValues[minPrefixLengthFlag] = strconv.FormatInt(testMinPrefixLength, 10) }), isValid: false, }, @@ -228,11 +289,63 @@ func TestBuildRequest(t *testing.T) { } } +func TestBuildRequestNetworkAreaRegion(t *testing.T) { + tests := []struct { + description string + model *inputModel + areaId string + expectedRequest iaas.ApiCreateNetworkAreaRegionRequest + }{ + { + description: "base", + model: fixtureInputModel(func(model *inputModel) { + // Deprecated fields + model.DnsNameServers = utils.Ptr(testDnsNameservers) + model.NetworkRanges = utils.Ptr(testNetworkRanges) + model.TransferNetwork = utils.Ptr(testTransferNetwork) + model.DefaultPrefixLength = utils.Ptr(testDefaultPrefixLength) + model.MaxPrefixLength = utils.Ptr(testMaxPrefixLength) + model.MinPrefixLength = utils.Ptr(testMinPrefixLength) + }), + areaId: testAreaId, + expectedRequest: fixtureRequestRegionalArea(), + }, + { + description: "base without network ranges", + model: fixtureInputModel(func(model *inputModel) { + // Deprecated fields + model.DnsNameServers = utils.Ptr(testDnsNameservers) + model.NetworkRanges = utils.Ptr(testNetworkRanges) + model.TransferNetwork = utils.Ptr(testTransferNetwork) + model.DefaultPrefixLength = utils.Ptr(testDefaultPrefixLength) + model.MaxPrefixLength = utils.Ptr(testMaxPrefixLength) + model.MinPrefixLength = utils.Ptr(testMinPrefixLength) + }), + areaId: testAreaId, + expectedRequest: fixtureRequestRegionalArea(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequestNetworkAreaRegion(testCtx, tt.model, testAreaId, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + func Test_outputResult(t *testing.T) { type args struct { outputFormat string orgLabel string - networkArea *iaas.NetworkArea + responses *NetworkAreaResponses } tests := []struct { name string @@ -244,10 +357,19 @@ func Test_outputResult(t *testing.T) { args: args{}, wantErr: true, }, + { + name: "set empty response", + args: args{ + responses: &NetworkAreaResponses{}, + }, + wantErr: false, + }, { name: "set empty network area", args: args{ - networkArea: &iaas.NetworkArea{}, + responses: &NetworkAreaResponses{ + NetworkArea: iaas.NetworkArea{}, + }, }, wantErr: false, }, @@ -256,9 +378,140 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.orgLabel, tt.args.networkArea); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.orgLabel, tt.args.responses); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) } } + +func TestGetConfiguredDeprecatedFlags(t *testing.T) { + type args struct { + model *inputModel + } + tests := []struct { + name string + args args + want []string + }{ + { + name: "no deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: testOrgId, + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: nil, + NetworkRanges: nil, + TransferNetwork: nil, + DefaultPrefixLength: nil, + MaxPrefixLength: nil, + MinPrefixLength: nil, + }, + }, + want: nil, + }, + { + name: "deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: testOrgId, + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: utils.Ptr(testDnsNameservers), + NetworkRanges: utils.Ptr(testNetworkRanges), + TransferNetwork: utils.Ptr(testTransferNetwork), + DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + MinPrefixLength: utils.Ptr(testMinPrefixLength), + }, + }, + want: []string{dnsNameServersFlag, networkRangesFlag, transferNetworkFlag, defaultPrefixLengthFlag, minPrefixLengthFlag, maxPrefixLengthFlag}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getConfiguredDeprecatedFlags(tt.args.model) + + less := func(a, b string) bool { + return a < b + } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(less)); diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestHasDeprecatedFlagsSet(t *testing.T) { + type args struct { + model *inputModel + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "no deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: testOrgId, + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: nil, + NetworkRanges: nil, + TransferNetwork: nil, + DefaultPrefixLength: nil, + MaxPrefixLength: nil, + MinPrefixLength: nil, + }, + }, + want: false, + }, + { + name: "deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: testOrgId, + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: utils.Ptr(testDnsNameservers), + NetworkRanges: utils.Ptr(testNetworkRanges), + TransferNetwork: utils.Ptr(testTransferNetwork), + DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + MinPrefixLength: utils.Ptr(testMinPrefixLength), + }, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := hasDeprecatedFlagsSet(tt.args.model); got != tt.want { + t.Errorf("hasDeprecatedFlagsSet() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index d16a9e656..0e42d5883 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -12,17 +13,19 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" - - "github.com/spf13/cobra" ) const ( areaIdArg = "AREA_ID" organizationIdFlag = "organization-id" + + deprecationMessage = "The regional network area configuration %q for the area %q still exists.\n" + + "The regional configuration of the network area was moved to the new command group `$ stackit network-area region`.\n" + + "The regional area will be automatically deleted. This behavior is deprecated and will be removed after April 2026.\n" + + "Use in the future the command `$ stackit network-area region delete` to delete the regional network area and afterwards delete the network-area with the command `$ stackit network-area delete`.\n" ) type inputModel struct { @@ -73,29 +76,31 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } } - // Call API - req := buildRequest(ctx, model, apiClient) - err = req.Execute() + // Check if the network area has a regional configuration + regionalArea, err := apiClient.GetNetworkAreaRegion(ctx, *model.OrganizationId, model.AreaId, model.Region).Execute() if err != nil { - return fmt.Errorf("delete network area: %w", err) + params.Printer.Debug(print.ErrorLevel, "get regional area: %v", err) } - - // Wait for async operation, if async mode not enabled - if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting network area") - _, err = wait.DeleteNetworkAreaWaitHandler(ctx, apiClient, *model.OrganizationId, model.AreaId).WaitWithContext(ctx) + if regionalArea != nil { + params.Printer.Warn(deprecationMessage, model.Region, networkAreaLabel) + err = apiClient.DeleteNetworkAreaRegion(ctx, *model.OrganizationId, model.AreaId, model.Region).Execute() if err != nil { - return fmt.Errorf("wait for network area deletion: %w", err) + return fmt.Errorf("delete network area region: %w", err) + } + _, err := wait.DeleteNetworkAreaRegionWaitHandler(ctx, apiClient, *model.OrganizationId, model.AreaId, model.Region).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait delete network area region: %w", err) } - s.Stop() } - operationState := "Deleted" - if model.Async { - operationState = "Triggered deletion of" + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete network area: %w", err) } - params.Printer.Info("%s STACKIT Network Area %q\n", operationState, networkAreaLabel) + + params.Printer.Outputf("Deleted STACKIT Network Area %q\n", networkAreaLabel) return nil }, } diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index b6c086a4b..4fdf257c5 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -126,60 +126,11 @@ func outputResult(p *print.Printer, outputFormat string, networkArea *iaas.Netwo } return p.OutputResult(outputFormat, networkArea, func() error { - var routes []string - var networkRanges []string - - if networkArea.Ipv4 != nil { - if networkArea.Ipv4.Routes != nil { - for _, route := range *networkArea.Ipv4.Routes { - routes = append(routes, fmt.Sprintf("next hop: %s\nprefix: %s", *route.Nexthop, *route.Prefix)) - } - } - - if networkArea.Ipv4.NetworkRanges != nil { - for _, networkRange := range *networkArea.Ipv4.NetworkRanges { - networkRanges = append(networkRanges, *networkRange.Prefix) - } - } - } - table := tables.NewTable() - table.AddRow("ID", utils.PtrString(networkArea.AreaId)) + table.AddRow("ID", utils.PtrString(networkArea.Id)) table.AddSeparator() table.AddRow("NAME", utils.PtrString(networkArea.Name)) table.AddSeparator() - table.AddRow("STATE", utils.PtrString(networkArea.State)) - table.AddSeparator() - if len(networkRanges) > 0 { - table.AddRow("NETWORK RANGES", strings.Join(networkRanges, ",")) - } - table.AddSeparator() - for i, route := range routes { - table.AddRow(fmt.Sprintf("STATIC ROUTE %d", i+1), route) - table.AddSeparator() - } - if networkArea.Ipv4 != nil { - if networkArea.Ipv4.TransferNetwork != nil { - table.AddRow("TRANSFER RANGE", *networkArea.Ipv4.TransferNetwork) - table.AddSeparator() - } - if networkArea.Ipv4.DefaultNameservers != nil && len(*networkArea.Ipv4.DefaultNameservers) > 0 { - table.AddRow("DNS NAME SERVERS", strings.Join(*networkArea.Ipv4.DefaultNameservers, ",")) - table.AddSeparator() - } - if networkArea.Ipv4.DefaultPrefixLen != nil { - table.AddRow("DEFAULT PREFIX LENGTH", *networkArea.Ipv4.DefaultPrefixLen) - table.AddSeparator() - } - if networkArea.Ipv4.MaxPrefixLen != nil { - table.AddRow("MAX PREFIX LENGTH", *networkArea.Ipv4.MaxPrefixLen) - table.AddSeparator() - } - if networkArea.Ipv4.MinPrefixLen != nil { - table.AddRow("MIN PREFIX LENGTH", *networkArea.Ipv4.MinPrefixLen) - table.AddSeparator() - } - } if networkArea.Labels != nil && len(*networkArea.Labels) > 0 { var labels []string for key, value := range *networkArea.Labels { @@ -195,6 +146,10 @@ func outputResult(p *print.Printer, outputFormat string, networkArea *iaas.Netwo table.AddRow("# ATTACHED PROJECTS", utils.PtrString(networkArea.ProjectCount)) table.AddSeparator() } + table.AddRow("CREATED AT", utils.PtrString(networkArea.CreatedAt)) + table.AddSeparator() + table.AddRow("UPDATED AT", utils.PtrString(networkArea.UpdatedAt)) + table.AddSeparator() err := table.Display(p) if err != nil { diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index 6184148aa..e37822602 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -150,21 +150,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli func outputResult(p *print.Printer, outputFormat string, networkAreas []iaas.NetworkArea) error { return p.OutputResult(outputFormat, networkAreas, func() error { table := tables.NewTable() - table.SetHeader("ID", "Name", "Status", "Network Ranges", "# Attached Projects") + table.SetHeader("ID", "Name", "# Attached Projects") for _, networkArea := range networkAreas { - networkRanges := "n/a" - if ipv4 := networkArea.Ipv4; ipv4 != nil { - if netRange := ipv4.NetworkRanges; netRange != nil { - networkRanges = fmt.Sprint(len(*netRange)) - } - } - table.AddRow( - utils.PtrString(networkArea.AreaId), + utils.PtrString(networkArea.Id), utils.PtrString(networkArea.Name), - utils.PtrString(networkArea.State), - networkRanges, utils.PtrString(networkArea.ProjectCount), ) table.AddSeparator() diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index ec7f1dbcf..33610c045 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -118,7 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRangeRequest { - req := apiClient.CreateNetworkAreaRange(ctx, *model.OrganizationId, *model.NetworkAreaId) + req := apiClient.CreateNetworkAreaRange(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region) payload := iaas.CreateNetworkAreaRangePayload{ Ipv4: &[]iaas.NetworkRange{ { @@ -131,7 +131,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli func outputResult(p *print.Printer, outputFormat, networkAreaLabel string, networkRange iaas.NetworkRange) error { return p.OutputResult(outputFormat, networkRange, func() error { - p.Outputf("Created network range for SNA %q.\nNetwork range ID: %s\n", networkAreaLabel, utils.PtrString(networkRange.NetworkRangeId)) + p.Outputf("Created network range for SNA %q.\nNetwork range ID: %s\n", networkAreaLabel, utils.PtrString(networkRange.Id)) return nil }) } diff --git a/internal/cmd/network-area/network-range/create/create_test.go b/internal/cmd/network-area/network-range/create/create_test.go index 6edc6b23b..e5b01e224 100644 --- a/internal/cmd/network-area/network-range/create/create_test.go +++ b/internal/cmd/network-area/network-range/create/create_test.go @@ -16,6 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,6 +30,8 @@ var testNetworkAreaId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, networkRangeFlag: "1.1.1.0/24", @@ -40,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: utils.Ptr(testOrgId), NetworkAreaId: utils.Ptr(testNetworkAreaId), @@ -52,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkAreaRangeRequest)) iaas.ApiCreateNetworkAreaRangeRequest { - request := testClient.CreateNetworkAreaRange(testCtx, testOrgId, testNetworkAreaId) + request := testClient.CreateNetworkAreaRange(testCtx, testOrgId, testNetworkAreaId, testRegion) request = request.CreateNetworkAreaRangePayload(fixturePayload()) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index 12126917e..4d3a94c5d 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) networkAreaLabel = *model.NetworkAreaId } - networkRangeLabel, err := iaasUtils.GetNetworkRangePrefix(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId, model.NetworkRangeId) + networkRangeLabel, err := iaasUtils.GetNetworkRangePrefix(ctx, apiClient, *model.OrganizationId, *model.NetworkAreaId, model.Region, model.NetworkRangeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get network range prefix: %v", err) networkRangeLabel = model.NetworkRangeId @@ -118,6 +118,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteNetworkAreaRangeRequest { - req := apiClient.DeleteNetworkAreaRange(ctx, *model.OrganizationId, *model.NetworkAreaId, model.NetworkRangeId) + req := apiClient.DeleteNetworkAreaRange(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region, model.NetworkRangeId) return req } diff --git a/internal/cmd/network-area/network-range/delete/delete_test.go b/internal/cmd/network-area/network-range/delete/delete_test.go index 5fb112ef6..79c1ad52c 100644 --- a/internal/cmd/network-area/network-range/delete/delete_test.go +++ b/internal/cmd/network-area/network-range/delete/delete_test.go @@ -15,6 +15,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,6 +40,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, } @@ -49,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: utils.Ptr(testOrgId), NetworkAreaId: utils.Ptr(testNetworkAreaId), @@ -61,7 +68,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteNetworkAreaRangeRequest)) iaas.ApiDeleteNetworkAreaRangeRequest { - request := testClient.DeleteNetworkAreaRange(testCtx, testOrgId, testNetworkAreaId, testNetworkRangeId) + request := testClient.DeleteNetworkAreaRange(testCtx, testOrgId, testNetworkAreaId, testRegion, testNetworkRangeId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index dcc695246..ee13560b9 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -95,7 +95,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetNetworkAreaRangeRequest { - req := apiClient.GetNetworkAreaRange(ctx, *model.OrganizationId, *model.NetworkAreaId, model.NetworkRangeId) + req := apiClient.GetNetworkAreaRange(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region, model.NetworkRangeId) return req } @@ -106,7 +106,7 @@ func outputResult(p *print.Printer, outputFormat string, networkRange *iaas.Netw return p.OutputResult(outputFormat, networkRange, func() error { table := tables.NewTable() - table.AddRow("ID", utils.PtrString(networkRange.NetworkRangeId)) + table.AddRow("ID", utils.PtrString(networkRange.Id)) table.AddSeparator() table.AddRow("Network range", utils.PtrString(networkRange.Prefix)) diff --git a/internal/cmd/network-area/network-range/describe/describe_test.go b/internal/cmd/network-area/network-range/describe/describe_test.go index a314d11ee..6e519fef8 100644 --- a/internal/cmd/network-area/network-range/describe/describe_test.go +++ b/internal/cmd/network-area/network-range/describe/describe_test.go @@ -15,6 +15,11 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + projectIdFlag = globalflags.ProjectIdFlag + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,6 +41,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, } @@ -48,6 +55,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, OrganizationId: utils.Ptr(testOrgId), @@ -61,7 +69,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetNetworkAreaRangeRequest)) iaas.ApiGetNetworkAreaRangeRequest { - request := testClient.GetNetworkAreaRange(testCtx, testOrgId, testNetworkAreaId, testNetworkRangeId) + request := testClient.GetNetworkAreaRange(testCtx, testOrgId, testNetworkAreaId, testRegion, testNetworkRangeId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index 967ffbb9c..2fec7b330 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -128,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNetworkAreaRangesRequest { - return apiClient.ListNetworkAreaRanges(ctx, *model.OrganizationId, *model.NetworkAreaId) + return apiClient.ListNetworkAreaRanges(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region) } func outputResult(p *print.Printer, outputFormat string, networkRanges []iaas.NetworkRange) error { @@ -137,7 +137,7 @@ func outputResult(p *print.Printer, outputFormat string, networkRanges []iaas.Ne table.SetHeader("ID", "Network Range") for _, networkRange := range networkRanges { - table.AddRow(utils.PtrString(networkRange.NetworkRangeId), utils.PtrString(networkRange.Prefix)) + table.AddRow(utils.PtrString(networkRange.Id), utils.PtrString(networkRange.Prefix)) } p.Outputln(table.Render()) diff --git a/internal/cmd/network-area/network-range/list/list_test.go b/internal/cmd/network-area/network-range/list/list_test.go index f8525e39b..67044ee06 100644 --- a/internal/cmd/network-area/network-range/list/list_test.go +++ b/internal/cmd/network-area/network-range/list/list_test.go @@ -16,6 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -25,6 +29,8 @@ var testNetworkAreaId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrganizationId, networkAreaIdFlag: testNetworkAreaId, limitFlag: "10", @@ -38,6 +44,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, OrganizationId: &testOrganizationId, @@ -51,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreaRangesRequest)) iaas.ApiListNetworkAreaRangesRequest { - request := testClient.ListNetworkAreaRanges(testCtx, testOrganizationId, testNetworkAreaId) + request := testClient.ListNetworkAreaRanges(testCtx, testOrganizationId, testNetworkAreaId, testRegion) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-area/network_area.go b/internal/cmd/network-area/network_area.go index 0b67ea3ea..637a7af0e 100644 --- a/internal/cmd/network-area/network_area.go +++ b/internal/cmd/network-area/network_area.go @@ -6,6 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/list" networkrange "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/update" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -33,6 +34,7 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(networkrange.NewCmd(params)) + cmd.AddCommand(region.NewCmd(params)) cmd.AddCommand(route.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/network-area/region/create/create.go b/internal/cmd/network-area/region/create/create.go new file mode 100644 index 000000000..a4cda53d6 --- /dev/null +++ b/internal/cmd/network-area/region/create/create.go @@ -0,0 +1,195 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + ipv4DefaultNameservers = "ipv4-default-nameservers" + ipv4DefaultPrefixLengthFlag = "ipv4-default-prefix-length" + ipv4MaxPrefixLengthFlag = "ipv4-max-prefix-length" + ipv4MinPrefixLengthFlag = "ipv4-min-prefix-length" + ipv4NetworkRangesFlag = "ipv4-network-ranges" + ipv4TransferNetworkFlag = "ipv4-transfer-network" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string + NetworkAreaId string + + IPv4DefaultNameservers *[]string + IPv4DefaultPrefixLength *int64 + IPv4MaxPrefixLength *int64 + IPv4MinPrefixLength *int64 + IPv4NetworkRanges []string + IPv4TransferNetwork string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a new regional configuration for a STACKIT Network Area (SNA)", + Long: "Creates a new regional configuration for a STACKIT Network Area (SNA).", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a new regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24" and ipv4 transfer network "192.168.1.0/24"`, + `$ stackit network-area region create --network-area-id xxx --region eu02 --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24`, + ), + examples.NewExample( + `Create a new regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", using the set region config`, + `$ stackit config set --region eu02`, + `$ stackit network-area region create --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24`, + ), + examples.NewExample( + `Create a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20"`, + `$ stackit network-area region create --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20`, + ), + examples.NewExample( + `Create a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20"`, + `$ stackit network-area region create --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get network area label + networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) + networkAreaLabel = model.NetworkAreaId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create network area region: %w", err) + } + + if resp == nil || resp.Ipv4 == nil { + return fmt.Errorf("empty response from API") + } + + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Create network area region") + _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for network area region creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, model.Region, networkAreaLabel, *resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "STACKIT Network Area (SNA) ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.CIDRSliceFlag(), ipv4NetworkRangesFlag, "Network range to create in CIDR notation") + cmd.Flags().Var(flags.CIDRFlag(), ipv4TransferNetworkFlag, "Transfer network in CIDR notation") + cmd.Flags().StringSlice(ipv4DefaultNameservers, nil, "List of default DNS name server IPs") + cmd.Flags().Int64(ipv4DefaultPrefixLengthFlag, 0, "The default prefix length for networks in the network area") + cmd.Flags().Int64(ipv4MaxPrefixLengthFlag, 0, "The maximum prefix length for networks in the network area") + cmd.Flags().Int64(ipv4MinPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area") + + err := flags.MarkFlagsRequired(cmd, networkAreaIdFlag, organizationIdFlag, ipv4NetworkRangesFlag, ipv4TransferNetworkFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.Region == "" { + return nil, &errors.RegionError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + IPv4DefaultNameservers: flags.FlagToStringSlicePointer(p, cmd, ipv4DefaultNameservers), + IPv4DefaultPrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4DefaultPrefixLengthFlag), + IPv4MaxPrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4MaxPrefixLengthFlag), + IPv4MinPrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4MinPrefixLengthFlag), + IPv4NetworkRanges: flags.FlagToStringSliceValue(p, cmd, ipv4NetworkRangesFlag), + IPv4TransferNetwork: flags.FlagToStringValue(p, cmd, ipv4TransferNetworkFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRegionRequest { + req := apiClient.CreateNetworkAreaRegion(ctx, model.OrganizationId, model.NetworkAreaId, model.Region) + + var networkRange []iaas.NetworkRange + if len(model.IPv4NetworkRanges) > 0 { + networkRange = make([]iaas.NetworkRange, len(model.IPv4NetworkRanges)) + for i := range model.IPv4NetworkRanges { + networkRange[i] = iaas.NetworkRange{ + Prefix: utils.Ptr(model.IPv4NetworkRanges[i]), + } + } + } + + payload := iaas.CreateNetworkAreaRegionPayload{ + Ipv4: &iaas.RegionalAreaIPv4{ + DefaultNameservers: model.IPv4DefaultNameservers, + DefaultPrefixLen: model.IPv4DefaultPrefixLength, + MaxPrefixLen: model.IPv4MaxPrefixLength, + MinPrefixLen: model.IPv4MinPrefixLength, + NetworkRanges: utils.Ptr(networkRange), + TransferNetwork: utils.Ptr(model.IPv4TransferNetwork), + }, + } + return req.CreateNetworkAreaRegionPayload(payload) +} + +func outputResult(p *print.Printer, outputFormat, region, networkAreaLabel string, regionalArea iaas.RegionalArea) error { + return p.OutputResult(outputFormat, regionalArea, func() error { + p.Outputf("Create region configuration for SNA %q.\nRegion: %s\n", networkAreaLabel, region) + return nil + }) +} diff --git a/internal/cmd/network-area/region/create/create_test.go b/internal/cmd/network-area/region/create/create_test.go new file mode 100644 index 000000000..1f8cacef2 --- /dev/null +++ b/internal/cmd/network-area/region/create/create_test.go @@ -0,0 +1,307 @@ +package create + +import ( + "context" + "strconv" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + testRegion = "eu01" + testDefaultPrefixLength int64 = 25 + testMaxPrefixLength int64 = 29 + testMinPrefixLength int64 = 24 + testTransferNetwork = "192.168.2.0/24" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +var ( + testAreaId = uuid.NewString() + testOrgId = uuid.NewString() + testDefaultNameservers = []string{"8.8.8.8", "8.8.4.4"} + testNetworkRanges = []string{"192.168.0.0/24", "10.0.0.0/24"} +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + + networkAreaIdFlag: testAreaId, + organizationIdFlag: testOrgId, + ipv4DefaultNameservers: strings.Join(testDefaultNameservers, ","), + ipv4DefaultPrefixLengthFlag: strconv.FormatInt(testDefaultPrefixLength, 10), + ipv4MaxPrefixLengthFlag: strconv.FormatInt(testMaxPrefixLength, 10), + ipv4MinPrefixLengthFlag: strconv.FormatInt(testMinPrefixLength, 10), + ipv4NetworkRangesFlag: strings.Join(testNetworkRanges, ","), + ipv4TransferNetworkFlag: testTransferNetwork, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + OrganizationId: testOrgId, + NetworkAreaId: testAreaId, + IPv4DefaultNameservers: utils.Ptr(testDefaultNameservers), + IPv4DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + IPv4MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + IPv4MinPrefixLength: utils.Ptr(testMinPrefixLength), + IPv4NetworkRanges: testNetworkRanges, + IPv4TransferNetwork: testTransferNetwork, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkAreaRegionRequest)) iaas.ApiCreateNetworkAreaRegionRequest { + request := testClient.CreateNetworkAreaRegion(testCtx, testOrgId, testAreaId, testRegion) + request = request.CreateNetworkAreaRegionPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaRegionPayload)) iaas.CreateNetworkAreaRegionPayload { + var networkRange []iaas.NetworkRange + if len(testNetworkRanges) > 0 { + networkRange = make([]iaas.NetworkRange, len(testNetworkRanges)) + for i := range testNetworkRanges { + networkRange[i] = iaas.NetworkRange{ + Prefix: utils.Ptr(testNetworkRanges[i]), + } + } + } + + payload := iaas.CreateNetworkAreaRegionPayload{ + Ipv4: &iaas.RegionalAreaIPv4{ + DefaultNameservers: utils.Ptr(testDefaultNameservers), + DefaultPrefixLen: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLen: utils.Ptr(testMaxPrefixLength), + MinPrefixLen: utils.Ptr(testMinPrefixLength), + NetworkRanges: utils.Ptr(networkRange), + TransferNetwork: utils.Ptr(testTransferNetwork), + }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "area id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "area id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "area id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "org id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "org id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "org id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "network range missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipv4NetworkRangesFlag) + }), + isValid: false, + }, + { + description: "multiple network ranges", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4NetworkRangesFlag] = "192.168.2.0/24,10.0.0.0/24" + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IPv4NetworkRanges = []string{"192.168.2.0/24", "10.0.0.0/24"} + }), + isValid: true, + }, + { + description: "network range invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4NetworkRangesFlag] = "invalid-cidr" + }), + isValid: false, + }, + { + description: "transfer network missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipv4TransferNetworkFlag) + }), + isValid: false, + }, + { + description: "transfer network invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4TransferNetworkFlag] = "" + }), + isValid: false, + }, + { + description: "transfer network invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4TransferNetworkFlag] = "invalid-cidr" + }), + isValid: false, + }, + { + description: "region empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.RegionFlag] = "" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiCreateNetworkAreaRegionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func Test_outputResult(t *testing.T) { + type args struct { + outputFormat string + region string + networkAreaLabel string + regionalArea iaas.RegionalArea + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty regional area", + args: args{ + regionalArea: iaas.RegionalArea{}, + }, + wantErr: false, + }, + { + name: "output json", + args: args{ + outputFormat: print.JSONOutputFormat, + regionalArea: iaas.RegionalArea{}, + }, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/region/delete/delete.go b/internal/cmd/network-area/region/delete/delete.go new file mode 100644 index 000000000..37f1f8bb0 --- /dev/null +++ b/internal/cmd/network-area/region/delete/delete.go @@ -0,0 +1,129 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string + NetworkAreaId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete", + Short: "Deletes a regional configuration for a STACKIT Network Area (SNA)", + Long: "Deletes a regional configuration for a STACKIT Network Area (SNA).", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Delete a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, + `$ stackit network-area region delete --network-area-id xxx --region eu02 --organization-id yyy`, + ), + examples.NewExample( + `Delete a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", using the set region config`, + `$ stackit config set --region eu02`, + `$ stackit network-area region delete --network-area-id xxx --organization-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get network area label + networkAreaName, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) + networkAreaName = model.NetworkAreaId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete network area region: %w", err) + } + + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Delete network area region") + _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for network area region deletion: %w", err) + } + s.Stop() + } + + params.Printer.Outputf("Delete regional network area %q for %q\n", model.Region, networkAreaName) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "STACKIT Network Area (SNA) ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, networkAreaIdFlag, organizationIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.Region == "" { + return nil, &errors.RegionError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteNetworkAreaRegionRequest { + return apiClient.DeleteNetworkAreaRegion(ctx, model.OrganizationId, model.NetworkAreaId, model.Region) +} diff --git a/internal/cmd/network-area/region/delete/delete_test.go b/internal/cmd/network-area/region/delete/delete_test.go new file mode 100644 index 000000000..919e86cb8 --- /dev/null +++ b/internal/cmd/network-area/region/delete/delete_test.go @@ -0,0 +1,168 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +var ( + testAreaId = uuid.NewString() + testOrgId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + + networkAreaIdFlag: testAreaId, + organizationIdFlag: testOrgId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + OrganizationId: testOrgId, + NetworkAreaId: testAreaId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiDeleteNetworkAreaRegionRequest)) iaas.ApiDeleteNetworkAreaRegionRequest { + request := testClient.DeleteNetworkAreaRegion(testCtx, testOrgId, testAreaId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "area id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "area id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "area id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "org id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "org id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "org id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "region empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.RegionFlag] = "" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiDeleteNetworkAreaRegionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/network-area/region/describe/describe.go b/internal/cmd/network-area/region/describe/describe.go new file mode 100644 index 000000000..71e4f5c31 --- /dev/null +++ b/internal/cmd/network-area/region/describe/describe.go @@ -0,0 +1,169 @@ +package describe + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string + NetworkAreaId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "describe", + Short: "Describes a regional configuration for a STACKIT Network Area (SNA)", + Long: "Describes a regional configuration for a STACKIT Network Area (SNA).", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Describe a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, + `$ stackit network-area region describe --network-area-id xxx --region eu02 --organization-id yyy`, + ), + examples.NewExample( + `Describe a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", using the set region config`, + `$ stackit config set --region eu02`, + `$ stackit network-area region describe --network-area-id xxx --organization-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get network area label + networkAreaName, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) + // Set explicit the networkAreaName to empty string and not to the ID, because this is used for the table output + networkAreaName = "" + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("describe network area region: %w", err) + } + + if resp == nil || resp.Ipv4 == nil { + return fmt.Errorf("empty response from API") + } + + return outputResult(params.Printer, model.OutputFormat, model.Region, model.NetworkAreaId, networkAreaName, *resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "STACKIT Network Area (SNA) ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, networkAreaIdFlag, organizationIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.Region == "" { + return nil, &errors.RegionError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetNetworkAreaRegionRequest { + return apiClient.GetNetworkAreaRegion(ctx, model.OrganizationId, model.NetworkAreaId, model.Region) +} + +func outputResult(p *print.Printer, outputFormat, region, areaId, areaName string, regionalArea iaas.RegionalArea) error { + return p.OutputResult(outputFormat, regionalArea, func() error { + table := tables.NewTable() + table.AddRow("ID", areaId) + table.AddSeparator() + if areaName != "" { + table.AddRow("NAME", areaName) + table.AddSeparator() + } + table.AddRow("REGION", region) + table.AddSeparator() + table.AddRow("STATUS", utils.PtrString(regionalArea.Status)) + table.AddSeparator() + if ipv4 := regionalArea.Ipv4; ipv4 != nil { + if ipv4.NetworkRanges != nil { + var networkRanges []string + for _, networkRange := range *ipv4.NetworkRanges { + if networkRange.Prefix != nil { + networkRanges = append(networkRanges, *networkRange.Prefix) + } + } + table.AddRow("NETWORK RANGES", strings.Join(networkRanges, ",")) + table.AddSeparator() + } + if transferNetwork := ipv4.TransferNetwork; transferNetwork != nil { + table.AddRow("TRANSFER RANGE", utils.PtrString(transferNetwork)) + table.AddSeparator() + } + if defaultNameserver := ipv4.DefaultNameservers; defaultNameserver != nil && len(*defaultNameserver) > 0 { + table.AddRow("DNS NAME SERVERS", strings.Join(*defaultNameserver, ",")) + table.AddSeparator() + } + if defaultPrefixLength := ipv4.DefaultPrefixLen; defaultPrefixLength != nil { + table.AddRow("DEFAULT PREFIX LENGTH", utils.PtrString(defaultPrefixLength)) + table.AddSeparator() + } + if maxPrefixLength := ipv4.MaxPrefixLen; maxPrefixLength != nil { + table.AddRow("MAX PREFIX LENGTH", utils.PtrString(maxPrefixLength)) + table.AddSeparator() + } + if minPrefixLen := ipv4.MinPrefixLen; minPrefixLen != nil { + table.AddRow("MIN PREFIX LENGTH", utils.PtrString(minPrefixLen)) + table.AddSeparator() + } + } + + if err := table.Display(p); err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/network-area/region/describe/describe_test.go b/internal/cmd/network-area/region/describe/describe_test.go new file mode 100644 index 000000000..7d06c1794 --- /dev/null +++ b/internal/cmd/network-area/region/describe/describe_test.go @@ -0,0 +1,214 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +var ( + testAreaId = uuid.NewString() + testOrgId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + + networkAreaIdFlag: testAreaId, + organizationIdFlag: testOrgId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + OrganizationId: testOrgId, + NetworkAreaId: testAreaId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiGetNetworkAreaRegionRequest)) iaas.ApiGetNetworkAreaRegionRequest { + request := testClient.GetNetworkAreaRegion(testCtx, testOrgId, testAreaId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "org id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "org id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "org id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "area id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "area id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "area id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "region empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.RegionFlag] = "" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiGetNetworkAreaRegionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func Test_outputResult(t *testing.T) { + type args struct { + outputFormat string + areaId string + region string + networkAreaLabel string + regionalArea iaas.RegionalArea + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty regional area", + args: args{ + regionalArea: iaas.RegionalArea{}, + }, + wantErr: false, + }, + { + name: "output json", + args: args{ + outputFormat: print.JSONOutputFormat, + regionalArea: iaas.RegionalArea{}, + }, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.areaId, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/region/list/list.go b/internal/cmd/network-area/region/list/list.go new file mode 100644 index 000000000..44149c9af --- /dev/null +++ b/internal/cmd/network-area/region/list/list.go @@ -0,0 +1,153 @@ +package list + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string + NetworkAreaId string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all configured regions for a STACKIT Network Area (SNA)", + Long: "Lists all configured regions for a STACKIT Network Area (SNA).", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all configured region for a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, + `$ stackit network-area region list --network-area-id xxx --organization-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get network area label + networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) + networkAreaLabel = model.NetworkAreaId + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list network area region: %w", err) + } + + if resp == nil { + return fmt.Errorf("empty response from API") + } + + return outputResult(params.Printer, model.OutputFormat, networkAreaLabel, *resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "STACKIT Network Area (SNA) ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, networkAreaIdFlag, organizationIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNetworkAreaRegionsRequest { + return apiClient.ListNetworkAreaRegions(ctx, model.OrganizationId, model.NetworkAreaId) +} + +func outputResult(p *print.Printer, outputFormat, areaLabel string, regionalArea iaas.RegionalAreaListResponse) error { + return p.OutputResult(outputFormat, regionalArea, func() error { + if regionalArea.Regions == nil || len(*regionalArea.Regions) == 0 { + p.Outputf("No regions found for network area %q\n", areaLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("REGION", "STATUS", "DNS NAME SERVERS", "NETWORK RANGES", "TRANSFER NETWORK") + for region, regionConfig := range *regionalArea.Regions { + var dnsNames string + var networkRanges []string + var transferNetwork string + + if ipv4 := regionConfig.Ipv4; ipv4 != nil { + // Set dnsNames + dnsNames = utils.JoinStringPtr(ipv4.DefaultNameservers, ",") + + // Set networkRanges + if ipv4.NetworkRanges != nil && len(*ipv4.NetworkRanges) > 0 { + for _, networkRange := range *ipv4.NetworkRanges { + if networkRange.Prefix != nil { + networkRanges = append(networkRanges, *networkRange.Prefix) + } + } + } + + // Set transferNetwork + transferNetwork = utils.PtrString(ipv4.TransferNetwork) + } + + table.AddRow( + region, + utils.PtrString(regionConfig.Status), + dnsNames, + strings.Join(networkRanges, ","), + transferNetwork, + ) + } + + if err := table.Display(p); err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/network-area/region/list/list_test.go b/internal/cmd/network-area/region/list/list_test.go new file mode 100644 index 000000000..bb7b3f15b --- /dev/null +++ b/internal/cmd/network-area/region/list/list_test.go @@ -0,0 +1,221 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +var ( + testAreaId = uuid.NewString() + testOrgId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + networkAreaIdFlag: testAreaId, + organizationIdFlag: testOrgId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + OrganizationId: testOrgId, + NetworkAreaId: testAreaId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreaRegionsRequest)) iaas.ApiListNetworkAreaRegionsRequest { + request := testClient.ListNetworkAreaRegions(testCtx, testOrgId, testAreaId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "org id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "org id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "org id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "area id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "area id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "area id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiListNetworkAreaRegionsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func Test_outputResult(t *testing.T) { + type args struct { + outputFormat string + networkAreaLabel string + regionalArea iaas.RegionalAreaListResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + regionalArea: iaas.RegionalAreaListResponse{}, + }, + wantErr: false, + }, + { + name: "set nil for regions map in response", + args: args{ + regionalArea: iaas.RegionalAreaListResponse{ + Regions: nil, + }, + }, + wantErr: false, + }, + { + name: "set empty map for regions map in response", + args: args{ + regionalArea: iaas.RegionalAreaListResponse{ + Regions: utils.Ptr(map[string]iaas.RegionalArea{}), + }, + }, + wantErr: false, + }, + { + name: "set empty region in response", + args: args{ + regionalArea: iaas.RegionalAreaListResponse{ + Regions: utils.Ptr(map[string]iaas.RegionalArea{ + "eu01": {}, + }), + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/region/region.go b/internal/cmd/network-area/region/region.go new file mode 100644 index 000000000..99edcace2 --- /dev/null +++ b/internal/cmd/network-area/region/region.go @@ -0,0 +1,34 @@ +package region + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "region", + Short: "Provides functionality for regional configuration of STACKIT Network Area (SNA)", + Long: "Provides functionality for regional configuration of STACKIT Network Area (SNA).", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) +} diff --git a/internal/cmd/network-area/region/update/update.go b/internal/cmd/network-area/region/update/update.go new file mode 100644 index 000000000..9018cb175 --- /dev/null +++ b/internal/cmd/network-area/region/update/update.go @@ -0,0 +1,165 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + ipv4DefaultNameservers = "ipv4-default-nameservers" + ipv4DefaultPrefixLengthFlag = "ipv4-default-prefix-length" + ipv4MaxPrefixLengthFlag = "ipv4-max-prefix-length" + ipv4MinPrefixLengthFlag = "ipv4-min-prefix-length" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string + NetworkAreaId string + + IPv4DefaultNameservers *[]string + IPv4DefaultPrefixLength *int64 + IPv4MaxPrefixLength *int64 + IPv4MinPrefixLength *int64 +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "update", + Short: "Updates a existing regional configuration for a STACKIT Network Area (SNA)", + Long: "Updates a existing regional configuration for a STACKIT Network Area (SNA).", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Update a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" with new ipv4-default-nameservers "8.8.8.8"`, + `$ stackit network-area region update --network-area-id xxx --region eu02 --organization-id yyy --ipv4-default-nameservers 8.8.8.8`, + ), + examples.NewExample( + `Update a regional configuration "eu02" for a STACKIT Network Area with ID "xxx" in organization with ID "yyy" with new ipv4-default-nameservers "8.8.8.8", using the set region config`, + `$ stackit config set --region eu02`, + `$ stackit network-area region update --network-area-id xxx --organization-id yyy --ipv4-default-nameservers 8.8.8.8`, + ), + examples.NewExample( + `Update a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20"`, + `$ stackit network-area region update --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20`, + ), + examples.NewExample( + `Update a new regional configuration for a STACKIT Network Area with ID "xxx" in organization with ID "yyy", ipv4 network range "192.168.0.0/24", ipv4 transfer network "192.168.1.0/24", default prefix length "24", max prefix length "25" and min prefix length "20"`, + `$ stackit network-area region update --network-area-id xxx --organization-id yyy --ipv4-network-ranges 192.168.0.0/24 --ipv4-transfer-network 192.168.1.0/24 --region "eu02" --ipv4-default-prefix-length 24 --ipv4-max-prefix-length 25 --ipv4-min-prefix-length 20`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get network area label + networkAreaLabel, err := iaasUtils.GetNetworkAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get network area name: %v", err) + networkAreaLabel = model.NetworkAreaId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update network area region: %w", err) + } + + if resp == nil || resp.Ipv4 == nil { + return fmt.Errorf("empty response from API") + } + + return outputResult(params.Printer, model.OutputFormat, model.Region, networkAreaLabel, *resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "STACKIT Network Area (SNA) ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().StringSlice(ipv4DefaultNameservers, nil, "List of default DNS name server IPs") + cmd.Flags().Int64(ipv4DefaultPrefixLengthFlag, 0, "The default prefix length for networks in the network area") + cmd.Flags().Int64(ipv4MaxPrefixLengthFlag, 0, "The maximum prefix length for networks in the network area") + cmd.Flags().Int64(ipv4MinPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area") + + // At least one of the flags is required, otherwise there is nothing to update + cmd.MarkFlagsOneRequired(ipv4DefaultNameservers, ipv4MaxPrefixLengthFlag, ipv4MinPrefixLengthFlag, ipv4DefaultPrefixLengthFlag) + + err := flags.MarkFlagsRequired(cmd, networkAreaIdFlag, organizationIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.Region == "" { + return nil, &errors.RegionError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + IPv4DefaultNameservers: flags.FlagToStringSlicePointer(p, cmd, ipv4DefaultNameservers), + IPv4DefaultPrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4DefaultPrefixLengthFlag), + IPv4MaxPrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4MaxPrefixLengthFlag), + IPv4MinPrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4MinPrefixLengthFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateNetworkAreaRegionRequest { + req := apiClient.UpdateNetworkAreaRegion(ctx, model.OrganizationId, model.NetworkAreaId, model.Region) + + payload := iaas.UpdateNetworkAreaRegionPayload{ + Ipv4: &iaas.UpdateRegionalAreaIPv4{ + DefaultNameservers: model.IPv4DefaultNameservers, + DefaultPrefixLen: model.IPv4DefaultPrefixLength, + MaxPrefixLen: model.IPv4MaxPrefixLength, + MinPrefixLen: model.IPv4MinPrefixLength, + }, + } + return req.UpdateNetworkAreaRegionPayload(payload) +} + +func outputResult(p *print.Printer, outputFormat, region, networkAreaLabel string, regionalArea iaas.RegionalArea) error { + return p.OutputResult(outputFormat, regionalArea, func() error { + p.Outputf("Updated region configuration for SNA %q.\nRegion: %s\n", networkAreaLabel, region) + return nil + }) +} diff --git a/internal/cmd/network-area/region/update/update_test.go b/internal/cmd/network-area/region/update/update_test.go new file mode 100644 index 000000000..73482555d --- /dev/null +++ b/internal/cmd/network-area/region/update/update_test.go @@ -0,0 +1,265 @@ +package update + +import ( + "context" + "strconv" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + testRegion = "eu01" + testDefaultPrefixLength int64 = 25 + testMaxPrefixLength int64 = 29 + testMinPrefixLength int64 = 24 +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +var ( + testAreaId = uuid.NewString() + testOrgId = uuid.NewString() + testDefaultNameservers = []string{"8.8.8.8", "8.8.4.4"} + testNetworkRanges = []string{"192.168.0.0/24", "10.0.0.0/24"} +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + + networkAreaIdFlag: testAreaId, + organizationIdFlag: testOrgId, + ipv4DefaultNameservers: strings.Join(testDefaultNameservers, ","), + ipv4DefaultPrefixLengthFlag: strconv.FormatInt(testDefaultPrefixLength, 10), + ipv4MaxPrefixLengthFlag: strconv.FormatInt(testMaxPrefixLength, 10), + ipv4MinPrefixLengthFlag: strconv.FormatInt(testMinPrefixLength, 10), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + OrganizationId: testOrgId, + NetworkAreaId: testAreaId, + IPv4DefaultNameservers: utils.Ptr(testDefaultNameservers), + IPv4DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + IPv4MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + IPv4MinPrefixLength: utils.Ptr(testMinPrefixLength), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiUpdateNetworkAreaRegionRequest)) iaas.ApiUpdateNetworkAreaRegionRequest { + request := testClient.UpdateNetworkAreaRegion(testCtx, testOrgId, testAreaId, testRegion) + request = request.UpdateNetworkAreaRegionPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *iaas.UpdateNetworkAreaRegionPayload)) iaas.UpdateNetworkAreaRegionPayload { + var networkRange []iaas.NetworkRange + if len(testNetworkRanges) > 0 { + networkRange = make([]iaas.NetworkRange, len(testNetworkRanges)) + for i := range testNetworkRanges { + networkRange[i] = iaas.NetworkRange{ + Prefix: utils.Ptr(testNetworkRanges[i]), + } + } + } + + payload := iaas.UpdateNetworkAreaRegionPayload{ + Ipv4: &iaas.UpdateRegionalAreaIPv4{ + DefaultNameservers: utils.Ptr(testDefaultNameservers), + DefaultPrefixLen: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLen: utils.Ptr(testMaxPrefixLength), + MinPrefixLen: utils.Ptr(testMinPrefixLength), + }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "org id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "org id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "org id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "area id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "area id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "area id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "no update data is set", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipv4DefaultPrefixLengthFlag) + delete(flagValues, ipv4MaxPrefixLengthFlag) + delete(flagValues, ipv4MinPrefixLengthFlag) + delete(flagValues, ipv4DefaultNameservers) + }), + isValid: false, + }, + { + description: "region empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.RegionFlag] = "" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiUpdateNetworkAreaRegionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func Test_outputResult(t *testing.T) { + type args struct { + outputFormat string + region string + networkAreaLabel string + regionalArea iaas.RegionalArea + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty regional area", + args: args{ + regionalArea: iaas.RegionalArea{}, + }, + wantErr: false, + }, + { + name: "output json", + args: args{ + outputFormat: print.JSONOutputFormat, + regionalArea: iaas.RegionalArea{}, + }, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index f8548316c..c8950144e 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -3,6 +3,8 @@ package create import ( "context" "fmt" + "net" + "os" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -21,18 +23,39 @@ import ( const ( organizationIdFlag = "organization-id" networkAreaIdFlag = "network-area-id" - prefixFlag = "prefix" - nexthopFlag = "next-hop" - labelFlag = "labels" + // Deprecated: prefixFlag is deprecated and will be removed after April 2026. Use instead destinationFlag + prefixFlag = "prefix" + destinationFlag = "destination" + // Deprecated: nexthopFlag is deprecated and will be removed after April 2026. Use instead nexthopIPv4Flag or nexthopIPv6Flag + nexthopFlag = "next-hop" + nexthopIPv4Flag = "next-hop-ipv4" + nexthopIPv6Flag = "next-hop-ipv6" + nexthopBlackholeFlag = "nexthop-blackhole" + nexthopInternetFlag = "nexthop-internet" + labelFlag = "labels" +) + +const ( + destinationCIDRv4Type = "cidrv4" + destinationCIDRv6Type = "cidrv6" + + nexthopBlackholeType = "blackhole" + nexthopInternetType = "internet" + nexthopIPv4Type = "ipv4" + nexthopIPv6Type = "ipv6" ) type inputModel struct { *globalflags.GlobalFlagModel - OrganizationId *string - NetworkAreaId *string - Prefix *string - Nexthop *string - Labels *map[string]string + OrganizationId *string + NetworkAreaId *string + DestinationV4 *string + DestinationV6 *string + NexthopV4 *string + NexthopV6 *string + NexthopBlackhole *bool + NexthopInternet *bool + Labels *map[string]string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -46,12 +69,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { Args: args.NoArgs, Example: examples.Build( examples.NewExample( - `Create a static route with prefix "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, - "$ stackit network-area route create --organization-id yyy --network-area-id xxx --prefix 1.1.1.0/24 --next-hop 1.1.1.1", + `Create a static route with destination "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, + "$ stackit network-area route create --organization-id yyy --network-area-id xxx --destination 1.1.1.0/24 --next-hop 1.1.1.1", ), examples.NewExample( - `Create a static route with labels "key:value" and "foo:bar" with prefix "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, - "$ stackit network-area route create --labels key=value,foo=bar --organization-id yyy --network-area-id xxx --prefix 1.1.1.0/24 --next-hop 1.1.1.1", + `Create a static route with labels "key:value" and "foo:bar" with destination "1.1.1.0/24" and next hop "1.1.1.1" in a STACKIT Network Area with ID "xxx" in organization with ID "yyy"`, + "$ stackit network-area route create --labels key=value,foo=bar --organization-id yyy --network-area-id xxx --destination 1.1.1.0/24 --next-hop 1.1.1.1", ), ), RunE: func(cmd *cobra.Command, args []string) error { @@ -93,7 +116,27 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("empty response from API") } - route, err := iaasUtils.GetRouteFromAPIResponse(*model.Prefix, *model.Nexthop, resp.Items) + var destination string + var nexthop string + if model.DestinationV4 != nil { + destination = *model.DestinationV4 + } else if model.DestinationV6 != nil { + destination = *model.DestinationV6 + } + + if model.NexthopV4 != nil { + nexthop = *model.NexthopV4 + } else if model.NexthopV6 != nil { + nexthop = *model.NexthopV6 + } else if model.NexthopBlackhole != nil { + // For nexthopBlackhole the type is assigned to nexthop, because it doesn't have any value + nexthop = nexthopBlackholeType + } else if model.NexthopInternet != nil { + // For nexthopInternet the type is assigned to nexthop, because it doesn't have any value + nexthop = nexthopInternetType + } + + route, err := iaasUtils.GetRouteFromAPIResponse(destination, nexthop, resp.Items) if err != nil { return err } @@ -109,23 +152,83 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "STACKIT Network Area ID") cmd.Flags().Var(flags.CIDRFlag(), prefixFlag, "Static route prefix") - cmd.Flags().String(nexthopFlag, "", "Next hop IP address. Must be a valid IPv4") + cmd.Flags().Var(flags.CIDRFlag(), destinationFlag, "Destination route. Must be a valid IPv4 or IPv6 CIDR") + cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a route. A label can be provided with the format key=value and the flag can be used multiple times to provide a list of labels") + cmd.Flags().String(nexthopFlag, "", "Next hop IP address. Must be a valid IPv4") + cmd.Flags().String(nexthopIPv4Flag, "", "Next hop IPv4 address") + cmd.Flags().String(nexthopIPv6Flag, "", "Next hop IPv6 address") + cmd.Flags().Bool(nexthopBlackholeFlag, false, "Sets next hop to black hole") + cmd.Flags().Bool(nexthopInternetFlag, false, "Sets next hop to internet") - err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag, prefixFlag, nexthopFlag) + cobra.CheckErr(cmd.Flags().MarkDeprecated(nexthopFlag, fmt.Sprintf("The flag %q is deprecated and will be removed after April 2026. Use instead %q to configure a IPv4 next hop.", nexthopFlag, nexthopBlackholeFlag))) + cobra.CheckErr(cmd.Flags().MarkDeprecated(prefixFlag, fmt.Sprintf("The flag %q is deprecated and will be removed after April 2026. Use instead %q to configure a destination.", prefixFlag, destinationFlag))) + // Set the output for deprecation warnings to stderr + cmd.Flags().SetOutput(os.Stderr) + + destinationFlags := []string{prefixFlag, destinationFlag} + nexthopFlags := []string{nexthopFlag, nexthopIPv4Flag, nexthopIPv6Flag, nexthopBlackholeFlag, nexthopInternetFlag} + cmd.MarkFlagsMutuallyExclusive(destinationFlags...) + cmd.MarkFlagsMutuallyExclusive(nexthopFlags...) + + cmd.MarkFlagsOneRequired(destinationFlags...) + cmd.MarkFlagsOneRequired(nexthopFlags...) + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag) cobra.CheckErr(err) } +func parseDestination(input string) (destinationV4, destinationV6 *string, err error) { + ip, _, err := net.ParseCIDR(input) + if err != nil { + return nil, nil, fmt.Errorf("parse CIDR: %w", err) + } + if ip.To4() != nil { // CIDR is IPv4 + destinationV4 = utils.Ptr(input) + return destinationV4, nil, nil + } + // CIDR is IPv6 + destinationV6 = utils.Ptr(input) + return nil, destinationV6, nil +} + func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) + var destinationV4, destinationV6 *string + if destination := flags.FlagToStringPointer(p, cmd, destinationFlag); destination != nil { + var err error + destinationV4, destinationV6, err = parseDestination(*destination) + if err != nil { + return nil, err + } + } + if prefix := flags.FlagToStringPointer(p, cmd, prefixFlag); prefix != nil { + var err error + destinationV4, destinationV6, err = parseDestination(*prefix) + if err != nil { + return nil, err + } + } + + nexthopIPv4 := flags.FlagToStringPointer(p, cmd, nexthopIPv4Flag) + nexthopIPv6 := flags.FlagToStringPointer(p, cmd, nexthopIPv6Flag) + nexthopInternet := flags.FlagToBoolPointer(p, cmd, nexthopInternetFlag) + nexthopBlackhole := flags.FlagToBoolPointer(p, cmd, nexthopBlackholeFlag) + if nexthop := flags.FlagToStringPointer(p, cmd, nexthopFlag); nexthop != nil { + nexthopIPv4 = nexthop + } + model := inputModel{ - GlobalFlagModel: globalFlags, - OrganizationId: flags.FlagToStringPointer(p, cmd, organizationIdFlag), - NetworkAreaId: flags.FlagToStringPointer(p, cmd, networkAreaIdFlag), - Prefix: flags.FlagToStringPointer(p, cmd, prefixFlag), - Nexthop: flags.FlagToStringPointer(p, cmd, nexthopFlag), - Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), + GlobalFlagModel: globalFlags, + OrganizationId: flags.FlagToStringPointer(p, cmd, organizationIdFlag), + NetworkAreaId: flags.FlagToStringPointer(p, cmd, networkAreaIdFlag), + DestinationV4: destinationV4, + DestinationV6: destinationV6, + NexthopV4: nexthopIPv4, + NexthopV6: nexthopIPv6, + NexthopBlackhole: nexthopBlackhole, + NexthopInternet: nexthopInternet, + Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } p.DebugInputModel(model) @@ -133,14 +236,62 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkAreaRouteRequest { - req := apiClient.CreateNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId) + req := apiClient.CreateNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region) + + var destinationV4 *iaas.DestinationCIDRv4 + var destinationV6 *iaas.DestinationCIDRv6 + if model.DestinationV4 != nil { + destinationV4 = &iaas.DestinationCIDRv4{ + Type: utils.Ptr(destinationCIDRv4Type), + Value: model.DestinationV4, + } + } + if model.DestinationV6 != nil { + destinationV6 = &iaas.DestinationCIDRv6{ + Type: utils.Ptr(destinationCIDRv6Type), + Value: model.DestinationV6, + } + } + + var nexthopIPv4 *iaas.NexthopIPv4 + var nexthopIPv6 *iaas.NexthopIPv6 + var nexthopBlackhole *iaas.NexthopBlackhole + var nexthopInternet *iaas.NexthopInternet + + if model.NexthopV4 != nil { + nexthopIPv4 = &iaas.NexthopIPv4{ + Type: utils.Ptr(nexthopIPv4Type), + Value: model.NexthopV4, + } + } else if model.NexthopV6 != nil { + nexthopIPv6 = &iaas.NexthopIPv6{ + Type: utils.Ptr(nexthopIPv6Type), + Value: model.NexthopV6, + } + } else if model.NexthopBlackhole != nil { + nexthopBlackhole = &iaas.NexthopBlackhole{ + Type: utils.Ptr(nexthopBlackholeType), + } + } else if model.NexthopInternet != nil { + nexthopInternet = &iaas.NexthopInternet{ + Type: utils.Ptr(nexthopInternetType), + } + } payload := iaas.CreateNetworkAreaRoutePayload{ - Ipv4: &[]iaas.Route{ + Items: &[]iaas.Route{ { - Prefix: model.Prefix, - Nexthop: model.Nexthop, - Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: destinationV4, + DestinationCIDRv6: destinationV6, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: nexthopIPv4, + NexthopIPv6: nexthopIPv6, + NexthopBlackhole: nexthopBlackhole, + NexthopInternet: nexthopInternet, + }, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), }, }, } @@ -149,7 +300,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli func outputResult(p *print.Printer, outputFormat, networkAreaLabel string, route iaas.Route) error { return p.OutputResult(outputFormat, route, func() error { - p.Outputf("Created static route for SNA %q.\nStatic route ID: %s\n", networkAreaLabel, utils.PtrString(route.RouteId)) + p.Outputf("Created static route for SNA %q.\nStatic route ID: %s\n", networkAreaLabel, utils.PtrString(route.Id)) return nil }) } diff --git a/internal/cmd/network-area/route/create/create_test.go b/internal/cmd/network-area/route/create/create_test.go index 1bc7cb161..b3d577b80 100644 --- a/internal/cmd/network-area/route/create/create_test.go +++ b/internal/cmd/network-area/route/create/create_test.go @@ -16,6 +16,12 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" + testDestinationCIDRv4 = "1.1.1.0/24" + testNexthopIPv4 = "1.1.1.1" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,10 +32,12 @@ var testNetworkAreaId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, - prefixFlag: "1.1.1.0/24", - nexthopFlag: "1.1.1.1", + destinationFlag: testDestinationCIDRv4, + nexthopIPv4Flag: testNexthopIPv4, } for _, mod := range mods { mod(flagValues) @@ -41,11 +49,12 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: utils.Ptr(testOrgId), NetworkAreaId: utils.Ptr(testNetworkAreaId), - Prefix: utils.Ptr("1.1.1.0/24"), - Nexthop: utils.Ptr("1.1.1.1"), + DestinationV4: utils.Ptr(testDestinationCIDRv4), + NexthopV4: utils.Ptr(testNexthopIPv4), } for _, mod := range mods { mod(model) @@ -54,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkAreaRouteRequest)) iaas.ApiCreateNetworkAreaRouteRequest { - request := testClient.CreateNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId) + request := testClient.CreateNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRegion) request = request.CreateNetworkAreaRoutePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -64,10 +73,20 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkAreaRouteRequest) func fixturePayload(mods ...func(payload *iaas.CreateNetworkAreaRoutePayload)) iaas.CreateNetworkAreaRoutePayload { payload := iaas.CreateNetworkAreaRoutePayload{ - Ipv4: &[]iaas.Route{ + Items: &[]iaas.Route{ { - Prefix: utils.Ptr("1.1.1.0/24"), - Nexthop: utils.Ptr("1.1.1.1"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(destinationCIDRv4Type), + Value: utils.Ptr(testDestinationCIDRv4), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(nexthopIPv4Type), + Value: utils.Ptr(testNexthopIPv4), + }, + }, }, }, } @@ -96,7 +115,7 @@ func TestParseInput(t *testing.T) { { description: "next hop missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, nexthopFlag) + delete(flagValues, nexthopIPv4Flag) }), isValid: false, }, @@ -148,23 +167,23 @@ func TestParseInput(t *testing.T) { isValid: false, }, { - description: "prefix missing", + description: "destination missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, prefixFlag) + delete(flagValues, destinationFlag) }), isValid: false, }, { - description: "prefix invalid 1", + description: "destinationFlag invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[prefixFlag] = "" + flagValues[destinationFlag] = "" }), isValid: false, }, { - description: "prefix invalid 2", + description: "destinationFlag invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[prefixFlag] = "invalid-prefix" + flagValues[destinationFlag] = "invalid-destinationFlag" }), isValid: false, }, @@ -178,6 +197,23 @@ func TestParseInput(t *testing.T) { }), isValid: true, }, + { + description: "conflicting destination and prefix set", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[prefixFlag] = testDestinationCIDRv4 + }), + isValid: false, + }, + { + description: "conflicting nexthop and nexthop-ipv4 set", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nexthopFlag] = testNexthopIPv4 + }), + isValid: false, + }, + { + description: "conflicting nexthop and nexthop-ipv4 set", + }, } for _, tt := range tests { @@ -205,7 +241,7 @@ func TestBuildRequest(t *testing.T) { }), expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkAreaRouteRequest) { *request = (*request).CreateNetworkAreaRoutePayload(fixturePayload(func(payload *iaas.CreateNetworkAreaRoutePayload) { - (*payload.Ipv4)[0].Labels = utils.Ptr(map[string]interface{}{"key": "value"}) + (*payload.Items)[0].Labels = utils.Ptr(map[string]interface{}{"key": "value"}) })) }), }, diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index 254e7fb7a..b888fb6d5 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -110,6 +110,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteNetworkAreaRouteRequest { - req := apiClient.DeleteNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.RouteId) + req := apiClient.DeleteNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region, model.RouteId) return req } diff --git a/internal/cmd/network-area/route/delete/delete_test.go b/internal/cmd/network-area/route/delete/delete_test.go index 0358eba8c..d34c268a7 100644 --- a/internal/cmd/network-area/route/delete/delete_test.go +++ b/internal/cmd/network-area/route/delete/delete_test.go @@ -15,6 +15,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,6 +40,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, } @@ -49,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: utils.Ptr(testOrgId), NetworkAreaId: utils.Ptr(testNetworkAreaId), @@ -61,7 +68,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteNetworkAreaRouteRequest)) iaas.ApiDeleteNetworkAreaRouteRequest { - request := testClient.DeleteNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRouteId) + request := testClient.DeleteNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRegion, testRouteId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index 2e54ac4c8..b650e5964 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -100,18 +100,47 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetNetworkAreaRouteRequest { - req := apiClient.GetNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.RouteId) + req := apiClient.GetNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region, model.RouteId) return req } func outputResult(p *print.Printer, outputFormat string, route iaas.Route) error { return p.OutputResult(outputFormat, route, func() error { table := tables.NewTable() - table.AddRow("ID", utils.PtrString(route.RouteId)) + table.AddRow("ID", utils.PtrString(route.Id)) table.AddSeparator() - table.AddRow("PREFIX", utils.PtrString(route.Prefix)) - table.AddSeparator() - table.AddRow("NEXTHOP", utils.PtrString(route.Nexthop)) + if destination := route.Destination; destination != nil { + if destination.DestinationCIDRv4 != nil { + table.AddRow("DESTINATION TYPE", utils.PtrString(destination.DestinationCIDRv4.Type)) + table.AddSeparator() + table.AddRow("DESTINATION", utils.PtrString(destination.DestinationCIDRv4.Value)) + table.AddSeparator() + } else if destination.DestinationCIDRv6 != nil { + table.AddRow("DESTINATION TYPE", utils.PtrString(destination.DestinationCIDRv6.Type)) + table.AddSeparator() + table.AddRow("DESTINATION", utils.PtrString(destination.DestinationCIDRv6.Value)) + table.AddSeparator() + } + } + if nexthop := route.Nexthop; nexthop != nil { + if nexthop.NexthopIPv4 != nil { + table.AddRow("NEXTHOP", utils.PtrString(nexthop.NexthopIPv4.Value)) + table.AddSeparator() + table.AddRow("NEXTHOP TYPE", utils.PtrString(nexthop.NexthopIPv4.Type)) + table.AddSeparator() + } else if nexthop.NexthopIPv6 != nil { + table.AddRow("NEXTHOP", utils.PtrString(nexthop.NexthopIPv6.Value)) + table.AddSeparator() + table.AddRow("NEXTHOP TYPE", utils.PtrString(nexthop.NexthopIPv6.Type)) + table.AddSeparator() + } else if nexthop.NexthopBlackhole != nil { + table.AddRow("NEXTHOP TYPE", utils.PtrString(nexthop.NexthopBlackhole.Type)) + table.AddSeparator() + } else if nexthop.NexthopInternet != nil { + table.AddRow("NEXTHOP TYPE", utils.PtrString(nexthop.NexthopInternet.Type)) + table.AddSeparator() + } + } if route.Labels != nil && len(*route.Labels) > 0 { labels := []string{} for key, value := range *route.Labels { diff --git a/internal/cmd/network-area/route/describe/describe_test.go b/internal/cmd/network-area/route/describe/describe_test.go index 0c674de81..67345ccae 100644 --- a/internal/cmd/network-area/route/describe/describe_test.go +++ b/internal/cmd/network-area/route/describe/describe_test.go @@ -15,6 +15,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,6 +40,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, } @@ -49,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: utils.Ptr(testOrgId), NetworkAreaId: utils.Ptr(testNetworkAreaId), @@ -61,7 +68,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetNetworkAreaRouteRequest)) iaas.ApiGetNetworkAreaRouteRequest { - request := testClient.GetNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRouteId) + request := testClient.GetNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRegion, testRouteId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index 2af24763a..9ea4f6159 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -127,19 +127,45 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNetworkAreaRoutesRequest { - return apiClient.ListNetworkAreaRoutes(ctx, *model.OrganizationId, *model.NetworkAreaId) + return apiClient.ListNetworkAreaRoutes(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region) } func outputResult(p *print.Printer, outputFormat string, routes []iaas.Route) error { return p.OutputResult(outputFormat, routes, func() error { table := tables.NewTable() - table.SetHeader("Static Route ID", "Next Hop", "Prefix") + table.SetHeader("Static Route ID", "Next Hop", "Next Hop Type", "Destination") for _, route := range routes { + var nextHop string + var nextHopType string + var destination string + if routeDest := route.Destination; routeDest != nil { + if routeDest.DestinationCIDRv4 != nil { + destination = *routeDest.DestinationCIDRv4.Value + } + if routeDest.DestinationCIDRv6 != nil { + destination = *routeDest.DestinationCIDRv6.Value + } + } + if routeNexthop := route.Nexthop; routeNexthop != nil { + if routeNexthop.NexthopIPv4 != nil { + nextHop = *routeNexthop.NexthopIPv4.Value + nextHopType = *routeNexthop.NexthopIPv4.Type + } else if routeNexthop.NexthopIPv6 != nil { + nextHop = *routeNexthop.NexthopIPv6.Value + nextHopType = *routeNexthop.NexthopIPv6.Type + } else if routeNexthop.NexthopBlackhole != nil { + nextHopType = *routeNexthop.NexthopBlackhole.Type + } else if routeNexthop.NexthopInternet != nil { + nextHopType = *routeNexthop.NexthopInternet.Type + } + } + table.AddRow( - utils.PtrString(route.RouteId), - utils.PtrString(route.Nexthop), - utils.PtrString(route.Prefix), + utils.PtrString(route.Id), + nextHop, + nextHopType, + destination, ) } diff --git a/internal/cmd/network-area/route/list/list_test.go b/internal/cmd/network-area/route/list/list_test.go index 8681aa87d..365249370 100644 --- a/internal/cmd/network-area/route/list/list_test.go +++ b/internal/cmd/network-area/route/list/list_test.go @@ -16,6 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -25,6 +29,8 @@ var testNetworkAreaId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrganizationId, networkAreaIdFlag: testNetworkAreaId, limitFlag: "10", @@ -39,6 +45,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: &testOrganizationId, NetworkAreaId: &testNetworkAreaId, @@ -51,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListNetworkAreaRoutesRequest)) iaas.ApiListNetworkAreaRoutesRequest { - request := testClient.ListNetworkAreaRoutes(testCtx, testOrganizationId, testNetworkAreaId) + request := testClient.ListNetworkAreaRoutes(testCtx, testOrganizationId, testNetworkAreaId, testRegion) for _, mod := range mods { mod(&request) } @@ -204,6 +211,24 @@ func TestOutputResult(t *testing.T) { }, wantErr: false, }, + { + name: "empty destination in route", + args: args{ + routes: []iaas.Route{{ + Destination: &iaas.RouteDestination{}, + }}, + }, + wantErr: false, + }, + { + name: "empty nexthop in route", + args: args{ + routes: []iaas.Route{{ + Nexthop: &iaas.RouteNexthop{}, + }}, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index 23e6391ff..92ca244a9 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -116,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateNetworkAreaRouteRequest { - req := apiClient.UpdateNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.RouteId) + req := apiClient.UpdateNetworkAreaRoute(ctx, *model.OrganizationId, *model.NetworkAreaId, model.Region, model.RouteId) payload := iaas.UpdateNetworkAreaRoutePayload{ Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), @@ -128,7 +128,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli func outputResult(p *print.Printer, outputFormat, networkAreaLabel string, route iaas.Route) error { return p.OutputResult(outputFormat, route, func() error { - p.Outputf("Updated static route for SNA %q.\nStatic route ID: %s\n", networkAreaLabel, utils.PtrString(route.RouteId)) + p.Outputf("Updated static route for SNA %q.\nStatic route ID: %s\n", networkAreaLabel, utils.PtrString(route.Id)) return nil }) } diff --git a/internal/cmd/network-area/route/update/update_test.go b/internal/cmd/network-area/route/update/update_test.go index 03bdf6da2..da6c6e03a 100644 --- a/internal/cmd/network-area/route/update/update_test.go +++ b/internal/cmd/network-area/route/update/update_test.go @@ -14,6 +14,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -35,6 +39,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, networkAreaIdFlag: testNetworkAreaId, labelFlag: "value=key", @@ -74,6 +80,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, OrganizationId: utils.Ptr(testOrgId), NetworkAreaId: utils.Ptr(testNetworkAreaId), @@ -87,7 +94,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateNetworkAreaRouteRequest)) iaas.ApiUpdateNetworkAreaRouteRequest { - request := testClient.UpdateNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRouteId) + request := testClient.UpdateNetworkAreaRoute(testCtx, testOrgId, testNetworkAreaId, testRegion, testRouteId) request = request.UpdateNetworkAreaRoutePayload(fixturePayload()) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 855da9f10..20f426d89 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -3,8 +3,8 @@ package update import ( "context" "fmt" - - rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" + "os" + "strings" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -13,6 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -23,26 +24,43 @@ import ( const ( areaIdArg = "AREA_ID" - nameFlag = "name" - organizationIdFlag = "organization-id" - areaIdFlag = "area-id" - dnsNameServersFlag = "dns-name-servers" + nameFlag = "name" + organizationIdFlag = "organization-id" + areaIdFlag = "area-id" + // Deprecated: dnsNameServersFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + dnsNameServersFlag = "dns-name-servers" + // Deprecated: defaultPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. defaultPrefixLengthFlag = "default-prefix-length" - maxPrefixLengthFlag = "max-prefix-length" - minPrefixLengthFlag = "min-prefix-length" - labelFlag = "labels" + // Deprecated: maxPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + maxPrefixLengthFlag = "max-prefix-length" + // Deprecated: minPrefixLengthFlag is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + minPrefixLengthFlag = "min-prefix-length" + labelFlag = "labels" + + deprecationMessage = "Deprecated and will be removed after April 2026. Use instead the new command `$ stackit network-area region` to configure these options for a network area." ) +// NetworkAreaResponses is a workaround, to keep the two responses of the iaas v2 api together for the json and yaml output +// Should be removed when the deprecated flags are removed +type NetworkAreaResponses struct { + NetworkArea iaas.NetworkArea `json:"network_area"` + RegionalArea *iaas.RegionalArea `json:"regional_area"` +} + type inputModel struct { *globalflags.GlobalFlagModel - AreaId string - Name *string - OrganizationId *string - DnsNameServers *[]string + AreaId string + Name *string + OrganizationId *string + // Deprecated: DnsNameServers is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + DnsNameServers *[]string + // Deprecated: DefaultPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. DefaultPrefixLength *int64 - MaxPrefixLength *int64 - MinPrefixLength *int64 - Labels *map[string]string + // Deprecated: MaxPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + MaxPrefixLength *int64 + // Deprecated: MinPrefixLength is deprecated, because with iaas v2 the create endpoint for network area was separated, remove this after April 2026. + MinPrefixLength *int64 + Labels *map[string]string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -99,7 +117,26 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("update network area: %w", err) } - return outputResult(params.Printer, model.OutputFormat, orgLabel, *resp) + if resp == nil || resp.Id == nil { + return fmt.Errorf("update network area: empty response") + } + + responses := NetworkAreaResponses{ + NetworkArea: *resp, + } + + if hasDeprecatedFlagsSet(model) { + deprecatedFlags := getConfiguredDeprecatedFlags(model) + params.Printer.Warn("the flags %q are deprecated and will be removed after April 2026. Use `$ stackit network-area region` to configure these options for a network area.\n", strings.Join(deprecatedFlags, ",")) + reqNetworkArea := buildRequestNetworkAreaRegion(ctx, model, apiClient) + respNetworkArea, err := reqNetworkArea.Execute() + if err != nil { + return fmt.Errorf("create network area region: %w", err) + } + responses.RegionalArea = respNetworkArea + } + + return outputResult(params.Printer, model.OutputFormat, orgLabel, responses) }, } configureFlags(cmd) @@ -115,6 +152,13 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(minPrefixLengthFlag, 0, "The minimum prefix length for networks in the network area") cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network-area. E.g. '--labels key1=value1,key2=value2,...'") + cobra.CheckErr(cmd.Flags().MarkDeprecated(dnsNameServersFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(defaultPrefixLengthFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(maxPrefixLengthFlag, deprecationMessage)) + cobra.CheckErr(cmd.Flags().MarkDeprecated(minPrefixLengthFlag, deprecationMessage)) + // Set the output for deprecation warnings to stderr + cmd.Flags().SetOutput(os.Stderr) + err := flags.MarkFlagsRequired(cmd, organizationIdFlag) cobra.CheckErr(err) } @@ -140,27 +184,67 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } +func hasDeprecatedFlagsSet(model *inputModel) bool { + deprecatedFlags := getConfiguredDeprecatedFlags(model) + return len(deprecatedFlags) > 0 +} + +func getConfiguredDeprecatedFlags(model *inputModel) []string { + var result []string + if model.DnsNameServers != nil { + result = append(result, dnsNameServersFlag) + } + if model.DefaultPrefixLength != nil { + result = append(result, defaultPrefixLengthFlag) + } + if model.MaxPrefixLength != nil { + result = append(result, maxPrefixLengthFlag) + } + if model.MinPrefixLength != nil { + result = append(result, minPrefixLengthFlag) + } + return result +} + func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiPartialUpdateNetworkAreaRequest { req := apiClient.PartialUpdateNetworkArea(ctx, *model.OrganizationId, model.AreaId) payload := iaas.PartialUpdateNetworkAreaPayload{ Name: model.Name, Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), - AddressFamily: &iaas.UpdateAreaAddressFamily{ - Ipv4: &iaas.UpdateAreaIPv4{ - DefaultNameservers: model.DnsNameServers, - DefaultPrefixLen: model.DefaultPrefixLength, - MaxPrefixLen: model.MaxPrefixLength, - MinPrefixLen: model.MinPrefixLength, - }, - }, } return req.PartialUpdateNetworkAreaPayload(payload) } -func outputResult(p *print.Printer, outputFormat, projectLabel string, networkArea iaas.NetworkArea) error { - return p.OutputResult(outputFormat, networkArea, func() error { +func buildRequestNetworkAreaRegion(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateNetworkAreaRegionRequest { + req := apiClient.UpdateNetworkAreaRegion(ctx, *model.OrganizationId, model.AreaId, model.Region) + + payload := iaas.UpdateNetworkAreaRegionPayload{ + Ipv4: &iaas.UpdateRegionalAreaIPv4{ + DefaultNameservers: model.DnsNameServers, + DefaultPrefixLen: model.DefaultPrefixLength, + MaxPrefixLen: model.MaxPrefixLength, + MinPrefixLen: model.MinPrefixLength, + }, + } + + return req.UpdateNetworkAreaRegionPayload(payload) +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, responses NetworkAreaResponses) error { + prettyOutputFunc := func() error { + p.Outputf("Updated STACKIT Network Area for project %q.\n", projectLabel) + return nil + } + + // If RegionalArea is NOT set in the reponses, then no deprecated Flags were set. + // In this case, only the response of NetworkArea should be printed in JSON and yaml output, to avoid breaking changes after the deprecated fields are removed + if responses.RegionalArea == nil { + return p.OutputResult(outputFormat, responses.NetworkArea, prettyOutputFunc) + } + + return p.OutputResult(outputFormat, responses, func() error { p.Outputf("Updated STACKIT Network Area for project %q.\n", projectLabel) return nil }) diff --git a/internal/cmd/network-area/update/update_test.go b/internal/cmd/network-area/update/update_test.go index f25018286..b46b66aab 100644 --- a/internal/cmd/network-area/update/update_test.go +++ b/internal/cmd/network-area/update/update_test.go @@ -2,6 +2,8 @@ package update import ( "context" + "strconv" + "strings" "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -15,13 +17,25 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" + testName = "example-network-area-name" + testDefaultPrefixLength int64 = 25 + testMinPrefixLength int64 = 24 + testMaxPrefixLength int64 = 26 +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &iaas.APIClient{} -var testOrgId = uuid.NewString() -var testAreaId = uuid.NewString() +var ( + testOrgId = uuid.NewString() + testAreaId = uuid.NewString() + + testDnsNameservers = []string{"1.1.1.0", "1.1.2.0"} +) func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -35,13 +49,11 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - nameFlag: "example-network-area-name", - organizationIdFlag: testOrgId, - dnsNameServersFlag: "1.1.1.0,1.1.2.0", - defaultPrefixLengthFlag: "24", - maxPrefixLengthFlag: "24", - minPrefixLengthFlag: "24", - labelFlag: "key=value", + globalflags.RegionFlag: testRegion, + + nameFlag: testName, + organizationIdFlag: testOrgId, + labelFlag: "key=value", } for _, mod := range mods { mod(flagValues) @@ -53,14 +65,11 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - Name: utils.Ptr("example-network-area-name"), - OrganizationId: utils.Ptr(testOrgId), - AreaId: testAreaId, - DnsNameServers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - DefaultPrefixLength: utils.Ptr(int64(24)), - MaxPrefixLength: utils.Ptr(int64(24)), - MinPrefixLength: utils.Ptr(int64(24)), + Name: utils.Ptr(testName), + OrganizationId: utils.Ptr(testOrgId), + AreaId: testAreaId, Labels: utils.Ptr(map[string]string{ "key": "value", }), @@ -82,17 +91,33 @@ func fixtureRequest(mods ...func(request *iaas.ApiPartialUpdateNetworkAreaReques func fixturePayload(mods ...func(payload *iaas.PartialUpdateNetworkAreaPayload)) iaas.PartialUpdateNetworkAreaPayload { payload := iaas.PartialUpdateNetworkAreaPayload{ - Name: utils.Ptr("example-network-area-name"), + Name: utils.Ptr(testName), Labels: utils.Ptr(map[string]interface{}{ "key": "value", }), - AddressFamily: &iaas.UpdateAreaAddressFamily{ - Ipv4: &iaas.UpdateAreaIPv4{ - DefaultNameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - DefaultPrefixLen: utils.Ptr(int64(24)), - MaxPrefixLen: utils.Ptr(int64(24)), - MinPrefixLen: utils.Ptr(int64(24)), - }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func fixtureRequestRegionalArea(mods ...func(request *iaas.ApiUpdateNetworkAreaRegionRequest)) iaas.ApiUpdateNetworkAreaRegionRequest { + request := testClient.UpdateNetworkAreaRegion(testCtx, testOrgId, testAreaId, testRegion) + request = request.UpdateNetworkAreaRegionPayload(fixturePayloadRegionalArea()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayloadRegionalArea(mods ...func(payload *iaas.UpdateNetworkAreaRegionPayload)) iaas.UpdateNetworkAreaRegionPayload { + payload := iaas.UpdateNetworkAreaRegionPayload{ + Ipv4: &iaas.UpdateRegionalAreaIPv4{ + DefaultNameservers: utils.Ptr(testDnsNameservers), + DefaultPrefixLen: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLen: utils.Ptr(testMaxPrefixLength), + MinPrefixLen: utils.Ptr(testMinPrefixLength), }, } for _, mod := range mods { @@ -118,20 +143,20 @@ func TestParseInput(t *testing.T) { expectedModel: fixtureInputModel(), }, { - description: "required only", + description: "with deprecated flags", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, dnsNameServersFlag) - delete(flagValues, defaultPrefixLengthFlag) - delete(flagValues, maxPrefixLengthFlag) - delete(flagValues, minPrefixLengthFlag) + flagValues[dnsNameServersFlag] = strings.Join(testDnsNameservers, ",") + flagValues[defaultPrefixLengthFlag] = strconv.FormatInt(testDefaultPrefixLength, 10) + flagValues[maxPrefixLengthFlag] = strconv.FormatInt(testMaxPrefixLength, 10) + flagValues[minPrefixLengthFlag] = strconv.FormatInt(testMinPrefixLength, 10) }), isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.DnsNameServers = nil - model.DefaultPrefixLength = nil - model.MaxPrefixLength = nil - model.MinPrefixLength = nil + model.DnsNameServers = utils.Ptr(testDnsNameservers) + model.DefaultPrefixLength = utils.Ptr(testDefaultPrefixLength) + model.MaxPrefixLength = utils.Ptr(testMaxPrefixLength) + model.MinPrefixLength = utils.Ptr(testMinPrefixLength) }), }, @@ -286,11 +311,44 @@ func TestBuildRequest(t *testing.T) { } } +func TestBuildRequestNetworkAreaRegion(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiUpdateNetworkAreaRegionRequest + }{ + { + description: "base", + model: fixtureInputModel(func(model *inputModel) { + model.DnsNameServers = utils.Ptr(testDnsNameservers) + model.DefaultPrefixLength = utils.Ptr(testDefaultPrefixLength) + model.MaxPrefixLength = utils.Ptr(testMaxPrefixLength) + model.MinPrefixLength = utils.Ptr(testMinPrefixLength) + }), + expectedRequest: fixtureRequestRegionalArea(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequestNetworkAreaRegion(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + func TestOutputResult(t *testing.T) { type args struct { outputFormat string projectLabel string - networkArea iaas.NetworkArea + responses NetworkAreaResponses } tests := []struct { name string @@ -305,7 +363,10 @@ func TestOutputResult(t *testing.T) { { name: "empty network area", args: args{ - networkArea: iaas.NetworkArea{}, + responses: NetworkAreaResponses{ + NetworkArea: iaas.NetworkArea{}, + RegionalArea: nil, + }, }, wantErr: false, }, @@ -314,9 +375,132 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.networkArea); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.responses); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) } } + +func TestGetConfiguredDeprecatedFlags(t *testing.T) { + type args struct { + model *inputModel + } + tests := []struct { + name string + args args + want []string + }{ + { + name: "no deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: utils.Ptr(testOrgId), + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: nil, + DefaultPrefixLength: nil, + MaxPrefixLength: nil, + MinPrefixLength: nil, + }, + }, + want: nil, + }, + { + name: "deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: utils.Ptr(testOrgId), + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: utils.Ptr(testDnsNameservers), + DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + MinPrefixLength: utils.Ptr(testMinPrefixLength), + }, + }, + want: []string{dnsNameServersFlag, defaultPrefixLengthFlag, minPrefixLengthFlag, maxPrefixLengthFlag}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getConfiguredDeprecatedFlags(tt.args.model) + + less := func(a, b string) bool { + return a < b + } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(less)); diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestHasDeprecatedFlagsSet(t *testing.T) { + type args struct { + model *inputModel + } + tests := []struct { + name string + args args + want bool + }{ + { + name: "no deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: utils.Ptr(testOrgId), + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: nil, + DefaultPrefixLength: nil, + MaxPrefixLength: nil, + MinPrefixLength: nil, + }, + }, + want: false, + }, + { + name: "deprecated flags", + args: args{ + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Name: utils.Ptr(testName), + OrganizationId: utils.Ptr(testOrgId), + Labels: utils.Ptr(map[string]string{ + "key": "value", + }), + DnsNameServers: utils.Ptr(testDnsNameservers), + DefaultPrefixLength: utils.Ptr(testDefaultPrefixLength), + MaxPrefixLength: utils.Ptr(testMaxPrefixLength), + MinPrefixLength: utils.Ptr(testMinPrefixLength), + }, + }, + want: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := hasDeprecatedFlagsSet(tt.args.model); got != tt.want { + t.Errorf("hasDeprecatedFlagsSet() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index 1fc368ffa..ad945e81d 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -38,7 +38,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - NetworkId *string + NetworkId string AllowedAddresses *[]iaas.AllowedAddressesInner Ipv4 *string Ipv6 *string @@ -177,7 +177,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, - NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), + NetworkId: flags.FlagToStringValue(p, cmd, networkIdFlag), Ipv4: flags.FlagToStringPointer(p, cmd, ipv4Flag), Ipv6: flags.FlagToStringPointer(p, cmd, ipv6Flag), Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), @@ -195,7 +195,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNicRequest { - req := apiClient.CreateNic(ctx, model.ProjectId, *model.NetworkId) + req := apiClient.CreateNic(ctx, model.ProjectId, model.Region, model.NetworkId) payload := iaas.CreateNicPayload{ AllowedAddresses: model.AllowedAddresses, diff --git a/internal/cmd/network-interface/create/create_test.go b/internal/cmd/network-interface/create/create_test.go index 82e5b628a..fd584b84e 100644 --- a/internal/cmd/network-interface/create/create_test.go +++ b/internal/cmd/network-interface/create/create_test.go @@ -15,19 +15,24 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &iaas.APIClient{} -var projectIdFlag = globalflags.ProjectIdFlag var testProjectId = uuid.NewString() var testNetworkId = uuid.NewString() var testSecurityGroup = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + networkIdFlag: testNetworkId, allowedAddressesFlag: "1.1.1.1,8.8.8.8,9.9.9.9", ipv4Flag: "1.2.3.4", @@ -52,9 +57,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, - NetworkId: utils.Ptr(testNetworkId), + NetworkId: testNetworkId, AllowedAddresses: utils.Ptr(allowedAddresses), Ipv4: utils.Ptr("1.2.3.4"), Ipv6: utils.Ptr("2001:0db8:85a3:08d3::0370:7344"), @@ -72,7 +78,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateNicRequest)) iaas.ApiCreateNicRequest { - request := testClient.CreateNic(testCtx, testProjectId, testNetworkId) + request := testClient.CreateNic(testCtx, testProjectId, testRegion, testNetworkId) request = request.CreateNicPayload(fixturePayload()) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index 043e41217..c5d9d61e0 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -24,7 +24,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - NetworkId *string + NetworkId string NicId string } @@ -90,7 +90,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), + NetworkId: flags.FlagToStringValue(p, cmd, networkIdFlag), NicId: nicId, } @@ -99,6 +99,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteNicRequest { - req := apiClient.DeleteNic(ctx, model.ProjectId, *model.NetworkId, model.NicId) + req := apiClient.DeleteNic(ctx, model.ProjectId, model.Region, model.NetworkId, model.NicId) return req } diff --git a/internal/cmd/network-interface/delete/delete_test.go b/internal/cmd/network-interface/delete/delete_test.go index ac03d45f6..c0170eab1 100644 --- a/internal/cmd/network-interface/delete/delete_test.go +++ b/internal/cmd/network-interface/delete/delete_test.go @@ -10,16 +10,18 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &iaas.APIClient{} -var projectIdFlag = globalflags.ProjectIdFlag var testProjectId = uuid.NewString() var testNetworkId = uuid.NewString() var testNicId = uuid.NewString() @@ -36,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - networkIdFlag: testNetworkId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + networkIdFlag: testNetworkId, } for _, mod := range mods { mod(flagValues) @@ -50,8 +53,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - NetworkId: utils.Ptr(testNetworkId), + NetworkId: testNetworkId, NicId: testNicId, } for _, mod := range mods { @@ -61,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteNicRequest)) iaas.ApiDeleteNicRequest { - request := testClient.DeleteNic(testCtx, testProjectId, testNetworkId, testNicId) + request := testClient.DeleteNic(testCtx, testProjectId, testRegion, testNetworkId, testNicId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index 4c1fc6d7d..128c333fa 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -27,7 +27,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - NetworkId *string + NetworkId string NicId string } @@ -94,7 +94,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), + NetworkId: flags.FlagToStringValue(p, cmd, networkIdFlag), NicId: nicId, } @@ -103,7 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetNicRequest { - req := apiClient.GetNic(ctx, model.ProjectId, *model.NetworkId, model.NicId) + req := apiClient.GetNic(ctx, model.ProjectId, model.Region, model.NetworkId, model.NicId) return req } diff --git a/internal/cmd/network-interface/describe/describe_test.go b/internal/cmd/network-interface/describe/describe_test.go index 24163ac87..2f802bf0e 100644 --- a/internal/cmd/network-interface/describe/describe_test.go +++ b/internal/cmd/network-interface/describe/describe_test.go @@ -10,16 +10,18 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &iaas.APIClient{} -var projectIdFlag = globalflags.ProjectIdFlag var testProjectId = uuid.NewString() var testNetworkId = uuid.NewString() var testNicId = uuid.NewString() @@ -36,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - networkIdFlag: testNetworkId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + networkIdFlag: testNetworkId, } for _, mod := range mods { mod(flagValues) @@ -50,8 +53,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - NetworkId: utils.Ptr(testNetworkId), + NetworkId: testNetworkId, NicId: testNicId, } for _, mod := range mods { @@ -61,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetNicRequest)) iaas.ApiGetNicRequest { - request := testClient.GetNic(testCtx, testProjectId, testNetworkId, testNicId) + request := testClient.GetNic(testCtx, testProjectId, testRegion, testNetworkId, testNicId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index cd683883a..23fe3aa4d 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -29,7 +29,7 @@ type inputModel struct { *globalflags.GlobalFlagModel Limit *int64 LabelSelector *string - NetworkId *string + NetworkId string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -77,12 +77,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, *model.NetworkId) + networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) - networkLabel = *model.NetworkId + networkLabel = model.NetworkId } else if networkLabel == "" { - networkLabel = *model.NetworkId + networkLabel = model.NetworkId } params.Printer.Info("No network interfaces found for network %q\n", networkLabel) return nil @@ -128,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, GlobalFlagModel: globalFlags, Limit: limit, LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), - NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), + NetworkId: flags.FlagToStringValue(p, cmd, networkIdFlag), } p.DebugInputModel(model) @@ -136,7 +136,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNicsRequest { - req := apiClient.ListNics(ctx, model.ProjectId, *model.NetworkId) + req := apiClient.ListNics(ctx, model.ProjectId, model.Region, model.NetworkId) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/network-interface/list/list_test.go b/internal/cmd/network-interface/list/list_test.go index 68df78a25..56eb5435d 100644 --- a/internal/cmd/network-interface/list/list_test.go +++ b/internal/cmd/network-interface/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -28,7 +30,9 @@ var testLabelSelector = "label" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + networkIdFlag: testNetworkId, limitFlag: "10", labelSelectorFlag: testLabelSelector, @@ -44,10 +48,11 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), - NetworkId: utils.Ptr(testNetworkId), + NetworkId: testNetworkId, } for _, mod := range mods { mod(model) @@ -56,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListNicsRequest)) iaas.ApiListNicsRequest { - request := testClient.ListNics(testCtx, testProjectId, testNetworkId) + request := testClient.ListNics(testCtx, testProjectId, testRegion, testNetworkId) request = request.LabelSelector(testLabelSelector) for _, mod := range mods { mod(&request) @@ -91,21 +96,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 190946bd7..3b1902bb4 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -38,7 +38,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel NicId string - NetworkId *string + NetworkId string AllowedAddresses *[]iaas.AllowedAddressesInner Labels *map[string]string Name *string // <= 63 characters + regex ^[A-Za-z0-9]+((-|_|\s|\.)[A-Za-z0-9]+)*$ @@ -171,7 +171,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, NicId: nicId, - NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), + NetworkId: flags.FlagToStringValue(p, cmd, networkIdFlag), Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), Name: name, NicSecurity: flags.FlagToBoolPointer(p, cmd, nicSecurityFlag), @@ -187,7 +187,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateNicRequest { - req := apiClient.UpdateNic(ctx, model.ProjectId, *model.NetworkId, model.NicId) + req := apiClient.UpdateNic(ctx, model.ProjectId, model.Region, model.NetworkId, model.NicId) payload := iaas.UpdateNicPayload{ AllowedAddresses: model.AllowedAddresses, diff --git a/internal/cmd/network-interface/update/update_test.go b/internal/cmd/network-interface/update/update_test.go index 03faa73ad..3f1382dab 100644 --- a/internal/cmd/network-interface/update/update_test.go +++ b/internal/cmd/network-interface/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -38,7 +40,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + networkIdFlag: testNetworkId, allowedAddressesFlag: "1.1.1.1,8.8.8.8,9.9.9.9", labelFlag: "key=value", @@ -62,8 +66,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - NetworkId: utils.Ptr(testNetworkId), + NetworkId: testNetworkId, AllowedAddresses: utils.Ptr(allowedAddresses), Labels: utils.Ptr(map[string]string{ "key": "value", @@ -80,7 +85,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateNicRequest)) iaas.ApiUpdateNicRequest { - request := testClient.UpdateNic(testCtx, testProjectId, testNetworkId, testNicId) + request := testClient.UpdateNic(testCtx, testProjectId, testRegion, testNetworkId, testNicId) request = request.UpdateNicPayload(fixturePayload()) for _, mod := range mods { mod(&request) diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index acb1bc7e1..9877e4477 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -79,7 +79,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { ), examples.NewExample( `Create an IPv4 network with name "network-1" with DNS name servers, a prefix and a gateway`, - `$ stackit network create --name network-1 --ipv4-dns-name-servers "1.1.1.1,8.8.8.8,9.9.9.9" --ipv4-prefix "10.1.2.0/24" --ipv4-gateway "10.1.2.3"`, + `$ stackit network create --name network-1 --non-routed --ipv4-dns-name-servers "1.1.1.1,8.8.8.8,9.9.9.9" --ipv4-prefix "10.1.2.0/24" --ipv4-gateway "10.1.2.3"`, ), examples.NewExample( `Create an IPv6 network with name "network-1" with DNS name servers, a prefix and a gateway`, @@ -121,13 +121,17 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create network : %w", err) } - networkId := *resp.NetworkId + + if resp == nil || resp.Id == nil { + return fmt.Errorf("create network : empty response") + } + networkId := *resp.Id // Wait for async operation, if async mode not enabled if !model.Async { s := spinner.New(params.Printer) s.Start("Creating network") - _, err = wait.CreateNetworkWaitHandler(ctx, apiClient, model.ProjectId, networkId).WaitWithContext(ctx) + _, err = wait.CreateNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, networkId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for network creation: %w", err) } @@ -156,6 +160,17 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(noIpv6GatewayFlag, false, "If set to true, the network doesn't have an IPv6 gateway") cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network. E.g. '--labels key1=value1,key2=value2,...'") + // IPv4 checks + cmd.MarkFlagsMutuallyExclusive(ipv4PrefixFlag, ipv4PrefixLengthFlag) + cmd.MarkFlagsMutuallyExclusive(ipv4GatewayFlag, ipv4PrefixLengthFlag) + cmd.MarkFlagsMutuallyExclusive(ipv4GatewayFlag, noIpv4GatewayFlag) + cmd.MarkFlagsMutuallyExclusive(noIpv4GatewayFlag, ipv4PrefixLengthFlag) + + // IPv6 checks + cmd.MarkFlagsMutuallyExclusive(ipv6PrefixFlag, ipv6PrefixLengthFlag) + cmd.MarkFlagsMutuallyExclusive(ipv6GatewayFlag, ipv6PrefixLengthFlag) + cmd.MarkFlagsMutuallyExclusive(ipv6GatewayFlag, noIpv6GatewayFlag) + err := flags.MarkFlagsRequired(cmd, nameFlag) cobra.CheckErr(err) } @@ -173,6 +188,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, IPv4PrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv4PrefixLengthFlag), IPv4Prefix: flags.FlagToStringPointer(p, cmd, ipv4PrefixFlag), IPv4Gateway: flags.FlagToStringPointer(p, cmd, ipv4GatewayFlag), + IPv6DnsNameServers: flags.FlagToStringSlicePointer(p, cmd, ipv6DnsNameServersFlag), IPv6PrefixLength: flags.FlagToInt64Pointer(p, cmd, ipv6PrefixLengthFlag), IPv6Prefix: flags.FlagToStringPointer(p, cmd, ipv6PrefixFlag), @@ -183,39 +199,92 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } + // IPv4 nameserver can not be set alone. IPv4 Prefix || IPv4 Prefix length must be set as well + isIPv4NameserverSet := model.IPv4DnsNameServers != nil && len(*model.IPv4DnsNameServers) > 0 + isIPv4PrefixOrPrefixLengthSet := model.IPv4Prefix != nil || model.IPv4PrefixLength != nil + if isIPv4NameserverSet && !isIPv4PrefixOrPrefixLengthSet { + return nil, &cliErr.OneOfFlagsIsMissing{ + MissingFlags: []string{ipv4PrefixLengthFlag, ipv4PrefixFlag}, + SetFlag: ipv4DnsNameServersFlag, + } + } + isIPv4GatewaySet := model.IPv4Gateway != nil + isIPv4PrefixSet := model.IPv4Prefix != nil + if isIPv4GatewaySet && !isIPv4PrefixSet { + return nil, &cliErr.DependingFlagIsMissing{ + MissingFlag: ipv4PrefixFlag, + SetFlag: ipv4GatewayFlag, + } + } + + // IPv6 nameserver can not be set alone. IPv6 Prefix || IPv6 Prefix length must be set as well + isIPv6NameserverSet := model.IPv6DnsNameServers != nil && len(*model.IPv6DnsNameServers) > 0 + isIPv6PrefixOrPrefixLengthSet := model.IPv6Prefix != nil || model.IPv6PrefixLength != nil + if isIPv6NameserverSet && !isIPv6PrefixOrPrefixLengthSet { + return nil, &cliErr.OneOfFlagsIsMissing{ + MissingFlags: []string{ipv6PrefixLengthFlag, ipv6PrefixFlag}, + SetFlag: ipv6DnsNameServersFlag, + } + } + isIPv6GatewaySet := model.IPv6Gateway != nil + isIPv6PrefixSet := model.IPv6Prefix != nil + if isIPv6GatewaySet && !isIPv6PrefixSet { + return nil, &cliErr.DependingFlagIsMissing{ + MissingFlag: ipv6PrefixFlag, + SetFlag: ipv6GatewayFlag, + } + } + p.DebugInputModel(model) return &model, nil } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateNetworkRequest { - req := apiClient.CreateNetwork(ctx, model.ProjectId) - addressFamily := &iaas.CreateNetworkAddressFamily{} - - if model.IPv6DnsNameServers != nil || model.IPv6PrefixLength != nil || model.IPv6Prefix != nil || model.NoIPv6Gateway || model.IPv6Gateway != nil { - addressFamily.Ipv6 = &iaas.CreateNetworkIPv6Body{ - Nameservers: model.IPv6DnsNameServers, - PrefixLength: model.IPv6PrefixLength, - Prefix: model.IPv6Prefix, + req := apiClient.CreateNetwork(ctx, model.ProjectId, model.Region) + var ipv4Network *iaas.CreateNetworkIPv4 + var ipv6Network *iaas.CreateNetworkIPv6 + + if model.IPv6Prefix != nil { + ipv6Network = &iaas.CreateNetworkIPv6{ + CreateNetworkIPv6WithPrefix: &iaas.CreateNetworkIPv6WithPrefix{ + Prefix: model.IPv6Prefix, + Nameservers: model.IPv6DnsNameServers, + }, } if model.NoIPv6Gateway { - addressFamily.Ipv6.Gateway = iaas.NewNullableString(nil) + ipv6Network.CreateNetworkIPv6WithPrefix.Gateway = iaas.NewNullableString(nil) } else if model.IPv6Gateway != nil { - addressFamily.Ipv6.Gateway = iaas.NewNullableString(model.IPv6Gateway) + ipv6Network.CreateNetworkIPv6WithPrefix.Gateway = iaas.NewNullableString(model.IPv6Gateway) + } + } else if model.IPv6PrefixLength != nil { + ipv6Network = &iaas.CreateNetworkIPv6{ + CreateNetworkIPv6WithPrefixLength: &iaas.CreateNetworkIPv6WithPrefixLength{ + PrefixLength: model.IPv6PrefixLength, + Nameservers: model.IPv6DnsNameServers, + }, } } - if model.IPv4DnsNameServers != nil || model.IPv4PrefixLength != nil || model.IPv4Prefix != nil || model.NoIPv4Gateway || model.IPv4Gateway != nil { - addressFamily.Ipv4 = &iaas.CreateNetworkIPv4Body{ - Nameservers: model.IPv4DnsNameServers, - PrefixLength: model.IPv4PrefixLength, - Prefix: model.IPv4Prefix, + if model.IPv4Prefix != nil { + ipv4Network = &iaas.CreateNetworkIPv4{ + CreateNetworkIPv4WithPrefix: &iaas.CreateNetworkIPv4WithPrefix{ + Prefix: model.IPv4Prefix, + Nameservers: model.IPv4DnsNameServers, + }, } if model.NoIPv4Gateway { - addressFamily.Ipv4.Gateway = iaas.NewNullableString(nil) + ipv4Network.CreateNetworkIPv4WithPrefix.Gateway = iaas.NewNullableString(nil) } else if model.IPv4Gateway != nil { - addressFamily.Ipv4.Gateway = iaas.NewNullableString(model.IPv4Gateway) + ipv4Network.CreateNetworkIPv4WithPrefix.Gateway = iaas.NewNullableString(model.IPv4Gateway) + } + } else if model.IPv4PrefixLength != nil { + ipv4Network = &iaas.CreateNetworkIPv4{ + CreateNetworkIPv4WithPrefixLength: &iaas.CreateNetworkIPv4WithPrefixLength{ + PrefixLength: model.IPv4PrefixLength, + Nameservers: model.IPv4DnsNameServers, + }, } } @@ -228,10 +297,8 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli Name: model.Name, Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), Routed: &routed, - } - - if addressFamily.Ipv4 != nil || addressFamily.Ipv6 != nil { - payload.AddressFamily = addressFamily + Ipv4: ipv4Network, + Ipv6: ipv6Network, } return req.CreateNetworkPayload(payload) @@ -246,7 +313,7 @@ func outputResult(p *print.Printer, outputFormat string, async bool, projectLabe if async { operationState = "Triggered creation of" } - p.Outputf("%s network for project %q.\nNetwork ID: %s\n", operationState, projectLabel, utils.PtrString(network.NetworkId)) + p.Outputf("%s network for project %q.\nNetwork ID: %s\n", operationState, projectLabel, utils.PtrString(network.Id)) return nil }) } diff --git a/internal/cmd/network/create/create_test.go b/internal/cmd/network/create/create_test.go index 6fd5c6a9a..a73f7d07a 100644 --- a/internal/cmd/network/create/create_test.go +++ b/internal/cmd/network/create/create_test.go @@ -2,6 +2,8 @@ package create import ( "context" + "strconv" + "strings" "testing" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -16,30 +18,71 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" -type testCtxKey struct{} + testNetworkName = "example-network-name" + testIPv4PrefixLength int64 = 24 + testIPv4Prefix = "10.1.2.0/24" + testIPv4Gateway = "10.1.2.3" + testIPv6PrefixLength int64 = 24 + testIPv6Prefix = "2001:4860:4860::/64" + testIPv6Gateway = "2001:db8:0:8d3:0:8a2e:70:1" + testNonRouted = false +) + +var ( + testIPv4NameServers = []string{"1.1.1.0", "1.1.2.0"} + testIPv6NameServers = []string{"2001:4860:4860::8888", "2001:4860:4860::8844"} +) -var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &iaas.APIClient{} +type testCtxKey struct{} -var testProjectId = uuid.NewString() +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() +) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "example-network-name", - ipv4DnsNameServersFlag: "1.1.1.0,1.1.2.0", - ipv4PrefixLengthFlag: "24", - ipv4PrefixFlag: "10.1.2.0/24", - ipv4GatewayFlag: "10.1.2.3", - ipv6DnsNameServersFlag: "2001:4860:4860::8888,2001:4860:4860::8844", - ipv6PrefixLengthFlag: "24", - ipv6PrefixFlag: "2001:4860:4860::8888", - ipv6GatewayFlag: "2001:4860:4860::8888", - nonRoutedFlag: "false", - labelFlag: "key=value", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + nameFlag: testNetworkName, + nonRoutedFlag: strconv.FormatBool(testNonRouted), + labelFlag: "key=value", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureFlagValuesWithPrefix(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4DnsNameServersFlag] = strings.Join(testIPv4NameServers, ",") + flagValues[ipv4PrefixFlag] = testIPv4Prefix + flagValues[ipv4GatewayFlag] = testIPv4Gateway + + flagValues[ipv6DnsNameServersFlag] = strings.Join(testIPv6NameServers, ",") + flagValues[ipv6PrefixFlag] = testIPv6Prefix + flagValues[ipv6GatewayFlag] = testIPv6Gateway + }) + for _, mod := range mods { + mod(flagValues) } + return flagValues +} + +func fixtureFlagValuesWithPrefixLength(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4PrefixLengthFlag] = strconv.FormatInt(testIPv4PrefixLength, 10) + flagValues[ipv4DnsNameServersFlag] = strings.Join(testIPv4NameServers, ",") + + flagValues[ipv6PrefixLengthFlag] = strconv.FormatInt(testIPv6PrefixLength, 10) + flagValues[ipv6DnsNameServersFlag] = strings.Join(testIPv6NameServers, ",") + }) for _, mod := range mods { mod(flagValues) } @@ -51,17 +94,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - Name: utils.Ptr("example-network-name"), - IPv4DnsNameServers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - IPv4PrefixLength: utils.Ptr(int64(24)), - IPv4Prefix: utils.Ptr("10.1.2.0/24"), - IPv4Gateway: utils.Ptr("10.1.2.3"), - IPv6DnsNameServers: utils.Ptr([]string{"2001:4860:4860::8888", "2001:4860:4860::8844"}), - IPv6PrefixLength: utils.Ptr(int64(24)), - IPv6Prefix: utils.Ptr("2001:4860:4860::8888"), - IPv6Gateway: utils.Ptr("2001:4860:4860::8888"), - NonRouted: false, + Name: utils.Ptr(testNetworkName), + NonRouted: testNonRouted, Labels: utils.Ptr(map[string]string{ "key": "value", }), @@ -72,8 +108,40 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { return model } +func fixtureInputModelWithPrefix(mods ...func(model *inputModel)) *inputModel { + model := fixtureInputModel() + + model.IPv4DnsNameServers = utils.Ptr(testIPv4NameServers) + model.IPv4Prefix = utils.Ptr(testIPv4Prefix) + model.IPv4Gateway = utils.Ptr(testIPv4Gateway) + + model.IPv6DnsNameServers = utils.Ptr(testIPv6NameServers) + model.IPv6Prefix = utils.Ptr(testIPv6Prefix) + model.IPv6Gateway = utils.Ptr(testIPv6Gateway) + + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureInputModelWithPrefixLength(mods ...func(model *inputModel)) *inputModel { + model := fixtureInputModel() + + model.IPv4DnsNameServers = utils.Ptr(testIPv4NameServers) + model.IPv4PrefixLength = utils.Ptr(testIPv4PrefixLength) + + model.IPv6DnsNameServers = utils.Ptr(testIPv6NameServers) + model.IPv6PrefixLength = utils.Ptr(testIPv6PrefixLength) + + for _, mod := range mods { + mod(model) + } + return model +} + func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkRequest)) iaas.ApiCreateNetworkRequest { - request := testClient.CreateNetwork(testCtx, testProjectId) + request := testClient.CreateNetwork(testCtx, testProjectId, testRegion) request = request.CreateNetworkPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -82,9 +150,9 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateNetworkRequest)) iaas.Ap } func fixtureRequiredRequest(mods ...func(request *iaas.ApiCreateNetworkRequest)) iaas.ApiCreateNetworkRequest { - request := testClient.CreateNetwork(testCtx, testProjectId) + request := testClient.CreateNetwork(testCtx, testProjectId, testRegion) request = request.CreateNetworkPayload(iaas.CreateNetworkPayload{ - Name: utils.Ptr("example-network-name"), + Name: utils.Ptr(testNetworkName), Routed: utils.Ptr(true), }) for _, mod := range mods { @@ -100,19 +168,47 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkPayload)) iaas.Creat Labels: utils.Ptr(map[string]interface{}{ "key": "value", }), - AddressFamily: &iaas.CreateNetworkAddressFamily{ - Ipv4: &iaas.CreateNetworkIPv4Body{ - Nameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - PrefixLength: utils.Ptr(int64(24)), - Prefix: utils.Ptr("10.1.2.0/24"), - Gateway: iaas.NewNullableString(utils.Ptr("10.1.2.3")), - }, - Ipv6: &iaas.CreateNetworkIPv6Body{ - Nameservers: utils.Ptr([]string{"2001:4860:4860::8888", "2001:4860:4860::8844"}), - PrefixLength: utils.Ptr(int64(24)), - Prefix: utils.Ptr("2001:4860:4860::8888"), - Gateway: iaas.NewNullableString(utils.Ptr("2001:4860:4860::8888")), - }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func fixturePayloadWithPrefix(mods ...func(payload *iaas.CreateNetworkPayload)) iaas.CreateNetworkPayload { + payload := fixturePayload() + payload.Ipv4 = &iaas.CreateNetworkIPv4{ + CreateNetworkIPv4WithPrefix: &iaas.CreateNetworkIPv4WithPrefix{ + Gateway: iaas.NewNullableString(utils.Ptr(testIPv4Gateway)), + Nameservers: utils.Ptr(testIPv4NameServers), + Prefix: utils.Ptr(testIPv4Prefix), + }, + } + payload.Ipv6 = &iaas.CreateNetworkIPv6{ + CreateNetworkIPv6WithPrefix: &iaas.CreateNetworkIPv6WithPrefix{ + Nameservers: utils.Ptr(testIPv6NameServers), + Prefix: utils.Ptr(testIPv6Prefix), + Gateway: iaas.NewNullableString(utils.Ptr(testIPv6Gateway)), + }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func fixturePayloadWithPrefixLength(mods ...func(payload *iaas.CreateNetworkPayload)) iaas.CreateNetworkPayload { + payload := fixturePayload() + payload.Ipv4 = &iaas.CreateNetworkIPv4{ + CreateNetworkIPv4WithPrefixLength: &iaas.CreateNetworkIPv4WithPrefixLength{ + PrefixLength: utils.Ptr(testIPv4PrefixLength), + Nameservers: utils.Ptr(testIPv4NameServers), + }, + } + payload.Ipv6 = &iaas.CreateNetworkIPv6{ + CreateNetworkIPv6WithPrefixLength: &iaas.CreateNetworkIPv6WithPrefixLength{ + PrefixLength: utils.Ptr(testIPv6PrefixLength), + Nameservers: utils.Ptr(testIPv6NameServers), }, } for _, mod := range mods { @@ -137,15 +233,21 @@ func TestParseInput(t *testing.T) { }, { description: "required only", - flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, ipv4DnsNameServersFlag) - delete(flagValues, ipv4PrefixLengthFlag) - }), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + nameFlag: testNetworkName, + }, isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.IPv4DnsNameServers = nil - model.IPv4PrefixLength = nil - }), + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Name: utils.Ptr(testNetworkName), + }, }, { description: "name missing", @@ -162,66 +264,110 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, { - description: "use dns servers, prefix, gateway and prefix length", - flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[ipv4DnsNameServersFlag] = "1.1.1.1" - flagValues[ipv4PrefixLengthFlag] = "25" - flagValues[ipv4PrefixFlag] = "10.1.2.0/24" - flagValues[ipv4GatewayFlag] = "10.1.2.3" + description: "use with prefix", + flagValues: fixtureFlagValuesWithPrefix(), + isValid: true, + expectedModel: fixtureInputModelWithPrefix(), + }, + { + description: "use with prefix only ipv4", + flagValues: fixtureFlagValuesWithPrefix(func(flagValues map[string]string) { + delete(flagValues, ipv6GatewayFlag) + delete(flagValues, ipv6PrefixFlag) + delete(flagValues, ipv6PrefixLengthFlag) + delete(flagValues, ipv6DnsNameServersFlag) }), isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.IPv4DnsNameServers = utils.Ptr([]string{"1.1.1.1"}) - model.IPv4PrefixLength = utils.Ptr(int64(25)) - model.IPv4Prefix = utils.Ptr("10.1.2.0/24") - model.IPv4Gateway = utils.Ptr("10.1.2.3") + expectedModel: fixtureInputModelWithPrefix(func(model *inputModel) { + model.IPv6PrefixLength = nil + model.IPv6Prefix = nil + model.IPv6DnsNameServers = nil + model.IPv6Gateway = nil }), }, { - description: "use ipv4 gateway nil", - flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[noIpv4GatewayFlag] = "true" + description: "use with prefix only ipv6", + flagValues: fixtureFlagValuesWithPrefix(func(flagValues map[string]string) { delete(flagValues, ipv4GatewayFlag) + delete(flagValues, ipv4PrefixFlag) + delete(flagValues, ipv4PrefixLengthFlag) + delete(flagValues, ipv4DnsNameServersFlag) }), isValid: true, - expectedModel: fixtureInputModel(func(model *inputModel) { - model.NoIPv4Gateway = true + expectedModel: fixtureInputModelWithPrefix(func(model *inputModel) { + model.IPv4PrefixLength = nil + model.IPv4Prefix = nil + model.IPv4DnsNameServers = nil + model.IPv4Gateway = nil + }), + }, + { + description: "use with prefixLength", + flagValues: fixtureFlagValuesWithPrefixLength(), + isValid: true, + expectedModel: fixtureInputModelWithPrefixLength(), + }, + { + description: "use with prefixLength only ipv4", + flagValues: fixtureFlagValuesWithPrefixLength(func(flagValues map[string]string) { + delete(flagValues, ipv6GatewayFlag) + delete(flagValues, ipv6PrefixFlag) + delete(flagValues, ipv6PrefixLengthFlag) + delete(flagValues, ipv6DnsNameServersFlag) + }), + isValid: true, + expectedModel: fixtureInputModelWithPrefixLength(func(model *inputModel) { + model.IPv6PrefixLength = nil + model.IPv6Prefix = nil + model.IPv6DnsNameServers = nil + model.IPv6Gateway = nil + }), + }, + { + description: "use with prefixLength only ipv6", + flagValues: fixtureFlagValuesWithPrefixLength(func(flagValues map[string]string) { + delete(flagValues, ipv4GatewayFlag) + delete(flagValues, ipv4PrefixFlag) + delete(flagValues, ipv4PrefixLengthFlag) + delete(flagValues, ipv4DnsNameServersFlag) + }), + isValid: true, + expectedModel: fixtureInputModelWithPrefixLength(func(model *inputModel) { + model.IPv4PrefixLength = nil + model.IPv4Prefix = nil + model.IPv4DnsNameServers = nil model.IPv4Gateway = nil }), }, { - description: "use ipv6 dns servers, prefix, gateway and prefix length", + description: "use ipv4 gateway nil", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[ipv6DnsNameServersFlag] = "2001:4860:4860::8888" - flagValues[ipv6PrefixLengthFlag] = "25" - flagValues[ipv6PrefixFlag] = "2001:4860:4860::8888" - flagValues[ipv6GatewayFlag] = "2001:4860:4860::8888" + flagValues[noIpv4GatewayFlag] = "true" + delete(flagValues, ipv4GatewayFlag) }), isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.IPv6DnsNameServers = utils.Ptr([]string{"2001:4860:4860::8888"}) - model.IPv6PrefixLength = utils.Ptr(int64(25)) - model.IPv6Prefix = utils.Ptr("2001:4860:4860::8888") - model.IPv6Gateway = utils.Ptr("2001:4860:4860::8888") + model.NoIPv4Gateway = true + model.IPv4Gateway = nil }), }, { @@ -236,6 +382,72 @@ func TestParseInput(t *testing.T) { model.IPv6Gateway = nil }), }, + { + description: "ipv4 prefix length and prefix conflict", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4PrefixFlag] = testIPv4Prefix + flagValues[ipv4PrefixLengthFlag] = strconv.FormatInt(testIPv4PrefixLength, 10) + }), + isValid: false, + expectedModel: nil, + }, + { + description: "ipv6 prefix length and prefix conflict", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv6PrefixFlag] = testIPv6Prefix + flagValues[ipv6PrefixLengthFlag] = strconv.FormatInt(testIPv6PrefixLength, 10) + }), + isValid: false, + expectedModel: nil, + }, + { + description: "ipv4 nameserver with missing prefix or prefix length", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4DnsNameServersFlag] = strings.Join(testIPv4NameServers, ",") + }), + isValid: false, + expectedModel: nil, + }, + { + description: "ipv6 nameserver with missing prefix or prefix length", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv6DnsNameServersFlag] = strings.Join(testIPv6NameServers, ",") + }), + isValid: false, + expectedModel: nil, + }, + { + description: "ipv4 gateway and no-gateway flag conflict", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4GatewayFlag] = testIPv4Gateway + flagValues[noIpv4GatewayFlag] = "true" + }), + isValid: false, + }, + { + description: "ipv6 gateway and no-gateway flag conflict", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv6GatewayFlag] = testIPv4Gateway + flagValues[noIpv6GatewayFlag] = "true" + }), + isValid: false, + }, + { + description: "ipv4 gateway and prefixLength flag conflict", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv4GatewayFlag] = testIPv4Gateway + flagValues[ipv4PrefixLengthFlag] = strconv.FormatInt(testIPv4PrefixLength, 10) + }), + isValid: false, + }, + { + description: "ipv6 gateway and prefixLength flag conflict", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipv6GatewayFlag] = testIPv6Gateway + flagValues[ipv6PrefixLengthFlag] = strconv.FormatInt(testIPv6PrefixLength, 10) + }), + isValid: false, + }, { description: "non-routed network", flagValues: fixtureFlagValues(func(flagValues map[string]string) { @@ -282,107 +494,98 @@ func TestBuildRequest(t *testing.T) { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - Name: utils.Ptr("example-network-name"), + Name: utils.Ptr(testNetworkName), }, expectedRequest: fixtureRequiredRequest(), }, + { + description: "use prefix length", + model: fixtureInputModelWithPrefixLength(), + expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkRequest) { + *request = (*request).CreateNetworkPayload(fixturePayloadWithPrefixLength()) + }), + }, + { + description: "use prefix", + model: fixtureInputModelWithPrefix(), + expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkRequest) { + *request = (*request).CreateNetworkPayload(fixturePayloadWithPrefix()) + }), + }, { description: "non-routed network", model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, - Name: utils.Ptr("example-network-name"), + Name: utils.Ptr(testNetworkName), NonRouted: true, }, - expectedRequest: testClient.CreateNetwork(testCtx, testProjectId).CreateNetworkPayload(iaas.CreateNetworkPayload{ - Name: utils.Ptr("example-network-name"), + expectedRequest: testClient.CreateNetwork(testCtx, testProjectId, testRegion).CreateNetworkPayload(iaas.CreateNetworkPayload{ + Name: utils.Ptr(testNetworkName), Routed: utils.Ptr(false), }), }, { - description: "use dns servers, prefix, gateway and prefix length", + description: "use ipv4 dns servers and prefix length", model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, IPv4DnsNameServers: utils.Ptr([]string{"1.1.1.1"}), IPv4PrefixLength: utils.Ptr(int64(25)), - IPv4Prefix: utils.Ptr("10.1.2.0/24"), - IPv4Gateway: utils.Ptr("10.1.2.3"), }, - expectedRequest: testClient.CreateNetwork(testCtx, testProjectId).CreateNetworkPayload(iaas.CreateNetworkPayload{ - AddressFamily: &iaas.CreateNetworkAddressFamily{ - Ipv4: &iaas.CreateNetworkIPv4Body{ - Nameservers: utils.Ptr([]string{"1.1.1.1"}), - PrefixLength: utils.Ptr(int64(25)), - Prefix: utils.Ptr("10.1.2.0/24"), - Gateway: iaas.NewNullableString(utils.Ptr("10.1.2.3")), + expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkRequest) { + *request = (*request).CreateNetworkPayload(iaas.CreateNetworkPayload{ + Ipv4: &iaas.CreateNetworkIPv4{ + CreateNetworkIPv4WithPrefixLength: &iaas.CreateNetworkIPv4WithPrefixLength{ + Nameservers: utils.Ptr([]string{"1.1.1.1"}), + PrefixLength: utils.Ptr(int64(25)), + }, }, - }, - Routed: utils.Ptr(true), + Routed: utils.Ptr(true), + }) }), }, { - description: "use ipv4 gateway nil", - model: &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ - ProjectId: testProjectId, - Verbosity: globalflags.VerbosityDefault, - }, - NoIPv4Gateway: true, - IPv4Gateway: nil, - }, - expectedRequest: testClient.CreateNetwork(testCtx, testProjectId).CreateNetworkPayload(iaas.CreateNetworkPayload{ - AddressFamily: &iaas.CreateNetworkAddressFamily{ - Ipv4: &iaas.CreateNetworkIPv4Body{ - Gateway: iaas.NewNullableString(nil), - }, - }, - Routed: utils.Ptr(true), + description: "use prefix with no gateway", + model: fixtureInputModelWithPrefix(func(model *inputModel) { + model.NoIPv4Gateway = true + model.NoIPv6Gateway = true + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiCreateNetworkRequest) { + *request = (*request).CreateNetworkPayload( + fixturePayloadWithPrefix(func(payload *iaas.CreateNetworkPayload) { + payload.Ipv4.CreateNetworkIPv4WithPrefix.Gateway = iaas.NewNullableString(nil) + payload.Ipv6.CreateNetworkIPv6WithPrefix.Gateway = iaas.NewNullableString(nil) + }), + ) }), }, { - description: "use ipv6 dns servers, prefix, gateway and prefix length", + description: "use ipv6 dns servers, prefix and gateway", model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, IPv6DnsNameServers: utils.Ptr([]string{"2001:4860:4860::8888"}), - IPv6PrefixLength: utils.Ptr(int64(25)), IPv6Prefix: utils.Ptr("2001:4860:4860::8888"), IPv6Gateway: utils.Ptr("2001:4860:4860::8888"), }, - expectedRequest: testClient.CreateNetwork(testCtx, testProjectId).CreateNetworkPayload(iaas.CreateNetworkPayload{ - AddressFamily: &iaas.CreateNetworkAddressFamily{ - Ipv6: &iaas.CreateNetworkIPv6Body{ - Nameservers: utils.Ptr([]string{"2001:4860:4860::8888"}), - PrefixLength: utils.Ptr(int64(25)), - Prefix: utils.Ptr("2001:4860:4860::8888"), - Gateway: iaas.NewNullableString(utils.Ptr("2001:4860:4860::8888")), - }, - }, - Routed: utils.Ptr(true), - }), - }, - { - description: "use ipv6 gateway nil", - model: &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ - ProjectId: testProjectId, - Verbosity: globalflags.VerbosityDefault, - }, - NoIPv6Gateway: true, - IPv6Gateway: nil, - }, - expectedRequest: testClient.CreateNetwork(testCtx, testProjectId).CreateNetworkPayload(iaas.CreateNetworkPayload{ - AddressFamily: &iaas.CreateNetworkAddressFamily{ - Ipv6: &iaas.CreateNetworkIPv6Body{ - Gateway: iaas.NewNullableString(nil), + expectedRequest: testClient.CreateNetwork(testCtx, testProjectId, testRegion).CreateNetworkPayload(iaas.CreateNetworkPayload{ + Ipv6: &iaas.CreateNetworkIPv6{ + CreateNetworkIPv6WithPrefix: &iaas.CreateNetworkIPv6WithPrefix{ + Nameservers: utils.Ptr([]string{"2001:4860:4860::8888"}), + Prefix: utils.Ptr("2001:4860:4860::8888"), + Gateway: iaas.NewNullableString(utils.Ptr("2001:4860:4860::8888")), }, }, Routed: utils.Ptr(true), @@ -393,7 +596,7 @@ func TestBuildRequest(t *testing.T) { t.Run(tt.description, func(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) - diff := cmp.Diff(request, tt.expectedRequest, + diff := cmp.Diff(tt.expectedRequest, request, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), cmp.AllowUnexported(iaas.NullableString{}), diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index 473edf34b..e101edf0a 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.NetworkId) + networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId @@ -84,7 +84,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting network") - _, err = wait.DeleteNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.NetworkId).WaitWithContext(ctx) + _, err = wait.DeleteNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for network deletion: %w", err) } @@ -120,5 +120,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteNetworkRequest { - return apiClient.DeleteNetwork(ctx, model.ProjectId, model.NetworkId) + return apiClient.DeleteNetwork(ctx, model.ProjectId, model.Region, model.NetworkId) } diff --git a/internal/cmd/network/delete/delete_test.go b/internal/cmd/network/delete/delete_test.go index 20c5eed47..76627b697 100644 --- a/internal/cmd/network/delete/delete_test.go +++ b/internal/cmd/network/delete/delete_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, NetworkId: testNetworkId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteNetworkRequest)) iaas.ApiDeleteNetworkRequest { - request := testClient.DeleteNetwork(testCtx, testProjectId, testNetworkId) + request := testClient.DeleteNetwork(testCtx, testProjectId, testRegion, testNetworkId) for _, mod := range mods { mod(&request) } @@ -101,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index e7315519a..c7f0d08bc 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -88,7 +88,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetNetworkRequest { - return apiClient.GetNetwork(ctx, model.ProjectId, model.NetworkId) + return apiClient.GetNetwork(ctx, model.ProjectId, model.Region, model.NetworkId) } func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) error { @@ -96,36 +96,49 @@ func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) return fmt.Errorf("network cannot be nil") } return p.OutputResult(outputFormat, network, func() error { - var ipv4nameservers []string - if network.Nameservers != nil { - ipv4nameservers = append(ipv4nameservers, *network.Nameservers...) - } - - var ipv4prefixes []string - if network.Prefixes != nil { - ipv4prefixes = append(ipv4prefixes, *network.Prefixes...) - } - - var ipv6nameservers []string - if network.NameserversV6 != nil { - ipv6nameservers = append(ipv6nameservers, *network.NameserversV6...) + // IPv4 + var ipv4Nameservers, ipv4Prefixes []string + var publicIp, ipv4Gateway *string + if ipv4 := network.Ipv4; ipv4 != nil { + if ipv4.Nameservers != nil { + ipv4Nameservers = append(ipv4Nameservers, *ipv4.Nameservers...) + } + if ipv4.Prefixes != nil { + ipv4Prefixes = append(ipv4Prefixes, *ipv4.Prefixes...) + } + if ipv4.PublicIp != nil { + publicIp = ipv4.PublicIp + } + if ipv4.Gateway != nil && ipv4.Gateway.IsSet() { + ipv4Gateway = ipv4.Gateway.Get() + } } - var ipv6prefixes []string - if network.PrefixesV6 != nil { - ipv6prefixes = append(ipv6prefixes, *network.PrefixesV6...) + // IPv6 + var ipv6Nameservers, ipv6Prefixes []string + var ipv6Gateway *string + if ipv6 := network.Ipv6; ipv6 != nil { + if ipv6.Nameservers != nil { + ipv6Nameservers = append(ipv6Nameservers, *ipv6.Nameservers...) + } + if ipv6.Prefixes != nil { + ipv6Prefixes = append(ipv6Prefixes, *ipv6.Prefixes...) + } + if ipv6.Gateway != nil && ipv6.Gateway.IsSet() { + ipv6Gateway = ipv6.Gateway.Get() + } } table := tables.NewTable() - table.AddRow("ID", utils.PtrString(network.NetworkId)) + table.AddRow("ID", utils.PtrString(network.Id)) table.AddSeparator() table.AddRow("NAME", utils.PtrString(network.Name)) table.AddSeparator() - table.AddRow("STATE", utils.PtrString(network.State)) + table.AddRow("STATE", utils.PtrString(network.Status)) table.AddSeparator() - if network.PublicIp != nil { - table.AddRow("PUBLIC IP", *network.PublicIp) + if publicIp != nil { + table.AddRow("PUBLIC IP", *publicIp) table.AddSeparator() } @@ -137,33 +150,33 @@ func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) table.AddRow("ROUTED", routed) table.AddSeparator() - if network.Gateway != nil { - table.AddRow("IPv4 GATEWAY", *network.Gateway.Get()) + if ipv4Gateway != nil { + table.AddRow("IPv4 GATEWAY", *ipv4Gateway) table.AddSeparator() } - if len(ipv4nameservers) > 0 { - table.AddRow("IPv4 NAME SERVERS", strings.Join(ipv4nameservers, ", ")) + if len(ipv4Nameservers) > 0 { + table.AddRow("IPv4 NAME SERVERS", strings.Join(ipv4Nameservers, ", ")) } table.AddSeparator() - if len(ipv4prefixes) > 0 { - table.AddRow("IPv4 PREFIXES", strings.Join(ipv4prefixes, ", ")) + if len(ipv4Prefixes) > 0 { + table.AddRow("IPv4 PREFIXES", strings.Join(ipv4Prefixes, ", ")) } table.AddSeparator() - if network.Gatewayv6 != nil { - table.AddRow("IPv6 GATEWAY", *network.Gatewayv6.Get()) + if ipv6Gateway != nil { + table.AddRow("IPv6 GATEWAY", *ipv6Gateway) table.AddSeparator() } - if len(ipv6nameservers) > 0 { - table.AddRow("IPv6 NAME SERVERS", strings.Join(ipv6nameservers, ", ")) + if len(ipv6Nameservers) > 0 { + table.AddRow("IPv6 NAME SERVERS", strings.Join(ipv6Nameservers, ", ")) + table.AddSeparator() } - table.AddSeparator() - if len(ipv6prefixes) > 0 { - table.AddRow("IPv6 PREFIXES", strings.Join(ipv6prefixes, ", ")) + if len(ipv6Prefixes) > 0 { + table.AddRow("IPv6 PREFIXES", strings.Join(ipv6Prefixes, ", ")) + table.AddSeparator() } - table.AddSeparator() if network.Labels != nil && len(*network.Labels) > 0 { var labels []string for key, value := range *network.Labels { diff --git a/internal/cmd/network/describe/describe_test.go b/internal/cmd/network/describe/describe_test.go index 098baa905..5a9015489 100644 --- a/internal/cmd/network/describe/describe_test.go +++ b/internal/cmd/network/describe/describe_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,7 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -49,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, NetworkId: testNetworkId, } @@ -59,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetNetworkRequest)) iaas.ApiGetNetworkRequest { - request := testClient.GetNetwork(testCtx, testProjectId, testNetworkId) + request := testClient.GetNetwork(testCtx, testProjectId, testRegion, testNetworkId) for _, mod := range mods { mod(&request) } @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -111,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -119,7 +123,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -194,6 +198,24 @@ func TestOutputResult(t *testing.T) { }, wantErr: false, }, + { + name: "set empty ipv4", + args: args{ + network: &iaas.Network{ + Ipv4: &iaas.NetworkIPv4{}, + }, + }, + wantErr: false, + }, + { + name: "set empty ipv6", + args: args{ + network: &iaas.Network{ + Ipv6: &iaas.NetworkIPv6{}, + }, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index a0c871466..e92ab31cc 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -130,7 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNetworksRequest { - req := apiClient.ListNetworks(ctx, model.ProjectId) + req := apiClient.ListNetworks(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } @@ -143,18 +143,21 @@ func outputResult(p *print.Printer, outputFormat string, networks []iaas.Network table.SetHeader("ID", "NAME", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED") for _, network := range networks { - publicIp := utils.PtrString(network.PublicIp) + var publicIp, prefixes string + if ipv4 := network.Ipv4; ipv4 != nil { + publicIp = utils.PtrString(ipv4.PublicIp) + prefixes = utils.JoinStringPtr(ipv4.Prefixes, ", ") + } routed := false if network.Routed != nil { routed = *network.Routed } - prefixes := utils.JoinStringPtr(network.Prefixes, ", ") table.AddRow( - utils.PtrString(network.NetworkId), + utils.PtrString(network.Id), utils.PtrString(network.Name), - utils.PtrString(network.State), + utils.PtrString(network.Status), publicIp, prefixes, routed, diff --git a/internal/cmd/network/list/list_test.go b/internal/cmd/network/list/list_test.go index f408eeb78..d753ab11d 100644 --- a/internal/cmd/network/list/list_test.go +++ b/internal/cmd/network/list/list_test.go @@ -16,18 +16,22 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" + testLabelSelector = "foo=bar" +) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &iaas.APIClient{} var testProjectId = uuid.NewString() -var testLabelSelector = "foo=bar" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", labelSelectorFlag: testLabelSelector, } @@ -42,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), @@ -53,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListNetworksRequest)) iaas.ApiListNetworksRequest { - request := testClient.ListNetworks(testCtx, testProjectId) + request := testClient.ListNetworks(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabelSelector) for _, mod := range mods { mod(&request) @@ -88,21 +93,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 8527a901f..b1891fd34 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -84,7 +84,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.NetworkId) + networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = model.NetworkId @@ -112,7 +112,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Updating network") - _, err = wait.UpdateNetworkWaitHandler(ctx, apiClient, model.ProjectId, networkId).WaitWithContext(ctx) + _, err = wait.UpdateNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, networkId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for network update: %w", err) } @@ -168,41 +168,40 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiPartialUpdateNetworkRequest { - req := apiClient.PartialUpdateNetwork(ctx, model.ProjectId, model.NetworkId) - addressFamily := &iaas.UpdateNetworkAddressFamily{} + req := apiClient.PartialUpdateNetwork(ctx, model.ProjectId, model.Region, model.NetworkId) + var payloadIPv4 *iaas.UpdateNetworkIPv4Body + var payloadIPv6 *iaas.UpdateNetworkIPv6Body if model.IPv6DnsNameServers != nil || model.NoIPv6Gateway || model.IPv6Gateway != nil { - addressFamily.Ipv6 = &iaas.UpdateNetworkIPv6Body{ + payloadIPv6 = &iaas.UpdateNetworkIPv6Body{ Nameservers: model.IPv6DnsNameServers, } if model.NoIPv6Gateway { - addressFamily.Ipv6.Gateway = iaas.NewNullableString(nil) + payloadIPv6.Gateway = iaas.NewNullableString(nil) } else if model.IPv6Gateway != nil { - addressFamily.Ipv6.Gateway = iaas.NewNullableString(model.IPv6Gateway) + payloadIPv6.Gateway = iaas.NewNullableString(model.IPv6Gateway) } } if model.IPv4DnsNameServers != nil || model.NoIPv4Gateway || model.IPv4Gateway != nil { - addressFamily.Ipv4 = &iaas.UpdateNetworkIPv4Body{ + payloadIPv4 = &iaas.UpdateNetworkIPv4Body{ Nameservers: model.IPv4DnsNameServers, } if model.NoIPv4Gateway { - addressFamily.Ipv4.Gateway = iaas.NewNullableString(nil) + payloadIPv4.Gateway = iaas.NewNullableString(nil) } else if model.IPv4Gateway != nil { - addressFamily.Ipv4.Gateway = iaas.NewNullableString(model.IPv4Gateway) + payloadIPv4.Gateway = iaas.NewNullableString(model.IPv4Gateway) } } payload := iaas.PartialUpdateNetworkPayload{ Name: model.Name, + Ipv4: payloadIPv4, + Ipv6: payloadIPv6, Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), } - if addressFamily.Ipv4 != nil || addressFamily.Ipv6 != nil { - payload.AddressFamily = addressFamily - } - return req.PartialUpdateNetworkPayload(payload) } diff --git a/internal/cmd/network/update/update_test.go b/internal/cmd/network/update/update_test.go index d05624840..236fbcd8b 100644 --- a/internal/cmd/network/update/update_test.go +++ b/internal/cmd/network/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +39,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + nameFlag: "example-network-name", - projectIdFlag: testProjectId, ipv4DnsNameServersFlag: "1.1.1.0,1.1.2.0", ipv4GatewayFlag: "10.1.2.3", ipv6DnsNameServersFlag: "2001:4860:4860::8888,2001:4860:4860::8844", @@ -56,6 +60,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, Name: utils.Ptr("example-network-name"), NetworkId: testNetworkId, @@ -74,7 +79,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiPartialUpdateNetworkRequest)) iaas.ApiPartialUpdateNetworkRequest { - request := testClient.PartialUpdateNetwork(testCtx, testProjectId, testNetworkId) + request := testClient.PartialUpdateNetwork(testCtx, testProjectId, testRegion, testNetworkId) request = request.PartialUpdateNetworkPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -88,15 +93,13 @@ func fixturePayload(mods ...func(payload *iaas.PartialUpdateNetworkPayload)) iaa Labels: utils.Ptr(map[string]interface{}{ "key": "value", }), - AddressFamily: &iaas.UpdateNetworkAddressFamily{ - Ipv4: &iaas.UpdateNetworkIPv4Body{ - Nameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), - Gateway: iaas.NewNullableString(utils.Ptr("10.1.2.3")), - }, - Ipv6: &iaas.UpdateNetworkIPv6Body{ - Nameservers: utils.Ptr([]string{"2001:4860:4860::8888", "2001:4860:4860::8844"}), - Gateway: iaas.NewNullableString(utils.Ptr("2001:4860:4860::8888")), - }, + Ipv4: &iaas.UpdateNetworkIPv4Body{ + Nameservers: utils.Ptr([]string{"1.1.1.0", "1.1.2.0"}), + Gateway: iaas.NewNullableString(utils.Ptr("10.1.2.3")), + }, + Ipv6: &iaas.UpdateNetworkIPv6Body{ + Nameservers: utils.Ptr([]string{"2001:4860:4860::8888", "2001:4860:4860::8844"}), + Gateway: iaas.NewNullableString(utils.Ptr("2001:4860:4860::8888")), }, } for _, mod := range mods { @@ -142,7 +145,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -150,7 +153,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -158,7 +161,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index e2398fe08..ec2ac72c3 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) + publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.Region, model.PublicIpId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId @@ -113,7 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdatePublicIPRequest { - req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.PublicIpId) + req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.Region, model.PublicIpId) payload := iaas.UpdatePublicIPPayload{ NetworkInterface: iaas.NewNullableString(model.AssociatedResourceId), diff --git a/internal/cmd/public-ip/associate/associate_test.go b/internal/cmd/public-ip/associate/associate_test.go index bc2b890e7..18084731d 100644 --- a/internal/cmd/public-ip/associate/associate_test.go +++ b/internal/cmd/public-ip/associate/associate_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +39,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + associatedResourceIdFlag: testAssociatedResourceId, } for _, mod := range mods { @@ -51,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, PublicIpId: testPublicIpId, AssociatedResourceId: utils.Ptr(testAssociatedResourceId), @@ -62,7 +67,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdatePublicIPRequest)) iaas.ApiUpdatePublicIPRequest { - request := testClient.UpdatePublicIP(testCtx, testProjectId, testPublicIpId) + request := testClient.UpdatePublicIP(testCtx, testProjectId, testRegion, testPublicIpId) request = request.UpdatePublicIPPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -105,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +118,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +126,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 1929e81e6..872a95057 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -114,7 +114,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreatePublicIPRequest { - req := apiClient.CreatePublicIP(ctx, model.ProjectId) + req := apiClient.CreatePublicIP(ctx, model.ProjectId, model.Region) payload := iaas.CreatePublicIPPayload{ NetworkInterface: iaas.NewNullableString(model.AssociatedResourceId), diff --git a/internal/cmd/public-ip/create/create_test.go b/internal/cmd/public-ip/create/create_test.go index 5e946f386..3602a422b 100644 --- a/internal/cmd/public-ip/create/create_test.go +++ b/internal/cmd/public-ip/create/create_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -28,7 +30,9 @@ var testAssociatedResourceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + associatedResourceIdFlag: testAssociatedResourceId, labelFlag: "key=value", } @@ -43,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, AssociatedResourceId: utils.Ptr(testAssociatedResourceId), Labels: utils.Ptr(map[string]string{ @@ -56,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreatePublicIPRequest)) iaas.ApiCreatePublicIPRequest { - request := testClient.CreatePublicIP(testCtx, testProjectId) + request := testClient.CreatePublicIP(testCtx, testProjectId, testRegion) request = request.CreatePublicIPPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -122,21 +127,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index 525318184..f5f8e340a 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) + publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.Region, model.PublicIpId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId @@ -102,5 +102,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeletePublicIPRequest { - return apiClient.DeletePublicIP(ctx, model.ProjectId, model.PublicIpId) + return apiClient.DeletePublicIP(ctx, model.ProjectId, model.Region, model.PublicIpId) } diff --git a/internal/cmd/public-ip/delete/delete_test.go b/internal/cmd/public-ip/delete/delete_test.go index 115c9d2e7..25290233e 100644 --- a/internal/cmd/public-ip/delete/delete_test.go +++ b/internal/cmd/public-ip/delete/delete_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, PublicIpId: testPublicIpId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeletePublicIPRequest)) iaas.ApiDeletePublicIPRequest { - request := testClient.DeletePublicIP(testCtx, testProjectId, testPublicIpId) + request := testClient.DeletePublicIP(testCtx, testProjectId, testRegion, testPublicIpId) for _, mod := range mods { mod(&request) } @@ -101,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index 4ec7836f2..94ff1a5c9 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -88,7 +88,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetPublicIPRequest { - return apiClient.GetPublicIP(ctx, model.ProjectId, model.PublicIpId) + return apiClient.GetPublicIP(ctx, model.ProjectId, model.Region, model.PublicIpId) } func outputResult(p *print.Printer, outputFormat string, publicIp iaas.PublicIp) error { diff --git a/internal/cmd/public-ip/describe/describe_test.go b/internal/cmd/public-ip/describe/describe_test.go index 05ceefe6e..581eb0496 100644 --- a/internal/cmd/public-ip/describe/describe_test.go +++ b/internal/cmd/public-ip/describe/describe_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,7 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -49,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, PublicIpId: testPublicIpId, } @@ -59,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetPublicIPRequest)) iaas.ApiGetPublicIPRequest { - request := testClient.GetPublicIP(testCtx, testProjectId, testPublicIpId) + request := testClient.GetPublicIP(testCtx, testProjectId, testRegion, testPublicIpId) for _, mod := range mods { mod(&request) } @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -111,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -119,7 +123,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index 7af16991d..3a54d40cb 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - publicIpLabel, associatedResourceId, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) + publicIpLabel, associatedResourceId, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.Region, model.PublicIpId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId @@ -100,7 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdatePublicIPRequest { - req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.PublicIpId) + req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.Region, model.PublicIpId) payload := iaas.UpdatePublicIPPayload{ NetworkInterface: iaas.NewNullableString(nil), diff --git a/internal/cmd/public-ip/disassociate/disassociate_test.go b/internal/cmd/public-ip/disassociate/disassociate_test.go index 956be6b23..1edc96014 100644 --- a/internal/cmd/public-ip/disassociate/disassociate_test.go +++ b/internal/cmd/public-ip/disassociate/disassociate_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,7 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -49,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, PublicIpId: testPublicIpId, } @@ -59,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdatePublicIPRequest)) iaas.ApiUpdatePublicIPRequest { - request := testClient.UpdatePublicIP(testCtx, testProjectId, testPublicIpId) + request := testClient.UpdatePublicIP(testCtx, testProjectId, testRegion, testPublicIpId) request = request.UpdatePublicIPPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -102,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +122,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index 4501c1cab..ec95cb0c6 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -130,7 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListPublicIPsRequest { - req := apiClient.ListPublicIPs(ctx, model.ProjectId) + req := apiClient.ListPublicIPs(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/public-ip/list/list_test.go b/internal/cmd/public-ip/list/list_test.go index 1d6f7b20d..2256ed99c 100644 --- a/internal/cmd/public-ip/list/list_test.go +++ b/internal/cmd/public-ip/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,9 @@ var testLabelSelector = "label" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", labelSelectorFlag: testLabelSelector, } @@ -42,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), @@ -53,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListPublicIPsRequest)) iaas.ApiListPublicIPsRequest { - request := testClient.ListPublicIPs(testCtx, testProjectId) + request := testClient.ListPublicIPs(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabelSelector) for _, mod := range mods { mod(&request) @@ -88,21 +93,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index 4146fb6ee..c4498a032 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) + publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.Region, model.PublicIpId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get public IP: %v", err) publicIpLabel = model.PublicIpId @@ -117,7 +117,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdatePublicIPRequest { - req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.PublicIpId) + req := apiClient.UpdatePublicIP(ctx, model.ProjectId, model.Region, model.PublicIpId) payload := iaas.UpdatePublicIPPayload{ Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), diff --git a/internal/cmd/public-ip/update/update_test.go b/internal/cmd/public-ip/update/update_test.go index 87c598665..bf987a524 100644 --- a/internal/cmd/public-ip/update/update_test.go +++ b/internal/cmd/public-ip/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +39,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - labelFlag: "key=value", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + labelFlag: "key=value", } for _, mod := range mods { mod(flagValues) @@ -51,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, PublicIpId: testPublicIpId, Labels: utils.Ptr(map[string]string{ @@ -64,7 +69,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdatePublicIPRequest)) iaas.ApiUpdatePublicIPRequest { - request := testClient.UpdatePublicIP(testCtx, testProjectId, testPublicIpId) + request := testClient.UpdatePublicIP(testCtx, testProjectId, testRegion, testPublicIpId) request = request.UpdatePublicIPPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -109,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -117,7 +122,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -125,7 +130,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index 84835b555..f61151f24 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -93,7 +93,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListQuotasRequest { - request := apiClient.ListQuotas(ctx, model.ProjectId) + request := apiClient.ListQuotas(ctx, model.ProjectId, model.Region) return request } diff --git a/internal/cmd/quota/list/list_test.go b/internal/cmd/quota/list/list_test.go index 973f28abb..358749384 100644 --- a/internal/cmd/quota/list/list_test.go +++ b/internal/cmd/quota/list/list_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,8 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -37,7 +40,11 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, } for _, mod := range mods { mod(model) @@ -46,7 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListQuotasRequest)) iaas.ApiListQuotasRequest { - request := testClient.ListQuotas(testCtx, testProjectId) + request := testClient.ListQuotas(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -75,21 +82,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 9598ef794..fd10a585d 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -115,7 +115,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateSecurityGroupRequest { - request := apiClient.CreateSecurityGroup(ctx, model.ProjectId) + request := apiClient.CreateSecurityGroup(ctx, model.ProjectId, model.Region) payload := iaas.CreateSecurityGroupPayload{ Description: model.Description, diff --git a/internal/cmd/security-group/create/create_test.go b/internal/cmd/security-group/create/create_test.go index 3f936f5ab..9b6d8f92c 100644 --- a/internal/cmd/security-group/create/create_test.go +++ b/internal/cmd/security-group/create/create_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -35,7 +37,9 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + descriptionFlag: testDescription, labelsFlag: "fooKey=fooValue,barKey=barValue,bazKey=bazValue", statefulFlag: "true", @@ -49,11 +53,15 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - Labels: &testLabels, - Description: &testDescription, - Name: &testName, - Stateful: &testStateful, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Labels: &testLabels, + Description: &testDescription, + Name: &testName, + Stateful: &testStateful, } for _, mod := range mods { mod(model) @@ -72,7 +80,7 @@ func toStringAnyMapPtr(m map[string]string) map[string]any { return result } func fixtureRequest(mods ...func(request *iaas.ApiCreateSecurityGroupRequest)) iaas.ApiCreateSecurityGroupRequest { - request := testClient.CreateSecurityGroup(testCtx, testProjectId) + request := testClient.CreateSecurityGroup(testCtx, testProjectId, testRegion) request = request.CreateSecurityGroupPayload(iaas.CreateSecurityGroupPayload{ Description: &testDescription, @@ -109,21 +117,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 376435432..506dce800 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -53,7 +53,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - groupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.SecurityGroupId) + groupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) if err != nil { params.Printer.Warn("get security group name: %v", err) groupLabel = model.SecurityGroupId @@ -98,6 +98,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteSecurityGroupRequest { - request := apiClient.DeleteSecurityGroup(ctx, model.ProjectId, model.SecurityGroupId) + request := apiClient.DeleteSecurityGroup(ctx, model.ProjectId, model.Region, model.SecurityGroupId) return request } diff --git a/internal/cmd/security-group/delete/delete_test.go b/internal/cmd/security-group/delete/delete_test.go index 5a4787576..e29d614e6 100644 --- a/internal/cmd/security-group/delete/delete_test.go +++ b/internal/cmd/security-group/delete/delete_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,8 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -37,7 +40,11 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, SecurityGroupId: testGroupId, } for _, mod := range mods { @@ -47,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteSecurityGroupRequest)) iaas.ApiDeleteSecurityGroupRequest { - request := testClient.DeleteSecurityGroup(testCtx, testProjectId, testGroupId) + request := testClient.DeleteSecurityGroup(testCtx, testProjectId, testRegion, testGroupId) for _, mod := range mods { mod(&request) } @@ -73,14 +80,14 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/describe/describe.go b/internal/cmd/security-group/describe/describe.go index 80fd5cb0c..6d8d615b0 100644 --- a/internal/cmd/security-group/describe/describe.go +++ b/internal/cmd/security-group/describe/describe.go @@ -68,7 +68,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetSecurityGroupRequest { - request := apiClient.GetSecurityGroup(ctx, model.ProjectId, model.SecurityGroupId) + request := apiClient.GetSecurityGroup(ctx, model.ProjectId, model.Region, model.SecurityGroupId) return request } diff --git a/internal/cmd/security-group/describe/describe_test.go b/internal/cmd/security-group/describe/describe_test.go index 62bf425be..1c6f15431 100644 --- a/internal/cmd/security-group/describe/describe_test.go +++ b/internal/cmd/security-group/describe/describe_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -26,7 +28,8 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -36,7 +39,11 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, SecurityGroupId: testSecurityGroupId[0], } for _, mod := range mods { @@ -46,7 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetSecurityGroupRequest)) iaas.ApiGetSecurityGroupRequest { - request := testClient.GetSecurityGroup(testCtx, testProjectId, testSecurityGroupId[0]) + request := testClient.GetSecurityGroup(testCtx, testProjectId, testRegion, testSecurityGroupId[0]) for _, mod := range mods { mod(&request) } @@ -78,7 +85,7 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), args: testSecurityGroupId, isValid: false, @@ -86,7 +93,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), args: testSecurityGroupId, isValid: false, @@ -94,7 +101,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), args: testSecurityGroupId, isValid: false, diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index ae9ecdd10..159995162 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -102,7 +102,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListSecurityGroupsRequest { - request := apiClient.ListSecurityGroups(ctx, model.ProjectId) + request := apiClient.ListSecurityGroups(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { request = request.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/security-group/list/list_test.go b/internal/cmd/security-group/list/list_test.go index 806ab98e3..7e5515059 100644 --- a/internal/cmd/security-group/list/list_test.go +++ b/internal/cmd/security-group/list/list_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -28,7 +30,9 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + labelSelectorFlag: testLabels, } for _, mod := range mods { @@ -39,8 +43,12 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, - LabelSelector: utils.Ptr(testLabels), + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + LabelSelector: utils.Ptr(testLabels), } for _, mod := range mods { mod(model) @@ -49,7 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListSecurityGroupsRequest)) iaas.ApiListSecurityGroupsRequest { - request := testClient.ListSecurityGroups(testCtx, testProjectId) + request := testClient.ListSecurityGroups(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabels) for _, mod := range mods { mod(&request) @@ -79,21 +87,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index cee025e98..9c87570f3 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -94,7 +94,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.SecurityGroupId) + securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) securityGroupLabel = model.SecurityGroupId @@ -168,7 +168,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateSecurityGroupRuleRequest { - req := apiClient.CreateSecurityGroupRule(ctx, model.ProjectId, model.SecurityGroupId) + req := apiClient.CreateSecurityGroupRule(ctx, model.ProjectId, model.Region, model.SecurityGroupId) icmpParameters := &iaas.ICMPParameters{} portRange := &iaas.PortRange{} protocol := &iaas.CreateProtocol{} diff --git a/internal/cmd/security-group/rule/create/create_test.go b/internal/cmd/security-group/rule/create/create_test.go index 2432c55ae..4088823e4 100644 --- a/internal/cmd/security-group/rule/create/create_test.go +++ b/internal/cmd/security-group/rule/create/create_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -29,7 +31,9 @@ var testRemoteSecurityGroupId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + securityGroupIdFlag: testSecurityGroupId, directionFlag: "ingress", descriptionFlag: "example-description", @@ -53,6 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, SecurityGroupId: testSecurityGroupId, @@ -75,7 +80,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateSecurityGroupRuleRequest)) iaas.ApiCreateSecurityGroupRuleRequest { - request := testClient.CreateSecurityGroupRule(testCtx, testProjectId, testSecurityGroupId) + request := testClient.CreateSecurityGroupRule(testCtx, testProjectId, testRegion, testSecurityGroupId) request = request.CreateSecurityGroupRulePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -84,7 +89,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateSecurityGroupRuleRequest } func fixtureRequiredRequest(mods ...func(request *iaas.ApiCreateSecurityGroupRuleRequest)) iaas.ApiCreateSecurityGroupRuleRequest { - request := testClient.CreateSecurityGroupRule(testCtx, testProjectId, testSecurityGroupId) + request := testClient.CreateSecurityGroupRule(testCtx, testProjectId, testRegion, testSecurityGroupId) request = request.CreateSecurityGroupRulePayload(iaas.CreateSecurityGroupRulePayload{ Direction: utils.Ptr("ingress"), }) @@ -203,21 +208,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -267,6 +272,7 @@ func TestBuildRequest(t *testing.T) { model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Direction: utils.Ptr("ingress"), diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index 9248663cf..f0426854b 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -27,7 +27,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel SecurityGroupRuleId string - SecurityGroupId *string + SecurityGroupId string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -58,13 +58,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, *model.SecurityGroupId) + securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) - securityGroupLabel = *model.SecurityGroupId + securityGroupLabel = model.SecurityGroupId } - securityGroupRuleLabel, err := iaasUtils.GetSecurityGroupRuleName(ctx, apiClient, model.ProjectId, model.SecurityGroupRuleId, *model.SecurityGroupId) + securityGroupRuleLabel, err := iaasUtils.GetSecurityGroupRuleName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupRuleId, model.SecurityGroupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get security group rule name: %v", err) securityGroupRuleLabel = model.SecurityGroupRuleId @@ -111,7 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, SecurityGroupRuleId: securityGroupRuleId, - SecurityGroupId: flags.FlagToStringPointer(p, cmd, securityGroupIdFlag), + SecurityGroupId: flags.FlagToStringValue(p, cmd, securityGroupIdFlag), } p.DebugInputModel(model) @@ -119,5 +119,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteSecurityGroupRuleRequest { - return apiClient.DeleteSecurityGroupRule(ctx, model.ProjectId, *model.SecurityGroupId, model.SecurityGroupRuleId) + return apiClient.DeleteSecurityGroupRule(ctx, model.ProjectId, model.Region, model.SecurityGroupId, model.SecurityGroupRuleId) } diff --git a/internal/cmd/security-group/rule/delete/delete_test.go b/internal/cmd/security-group/rule/delete/delete_test.go index ebf83035c..9f78a7e1a 100644 --- a/internal/cmd/security-group/rule/delete/delete_test.go +++ b/internal/cmd/security-group/rule/delete/delete_test.go @@ -4,18 +4,18 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -38,7 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + securityGroupIdFlag: testSecurityGroupId, } for _, mod := range mods { @@ -51,9 +53,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, - SecurityGroupId: utils.Ptr(testSecurityGroupId), + SecurityGroupId: testSecurityGroupId, SecurityGroupRuleId: testSecurityGroupRuleId, } for _, mod := range mods { @@ -63,7 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteSecurityGroupRuleRequest)) iaas.ApiDeleteSecurityGroupRuleRequest { - request := testClient.DeleteSecurityGroupRule(testCtx, testProjectId, testSecurityGroupId, testSecurityGroupRuleId) + request := testClient.DeleteSecurityGroupRule(testCtx, testProjectId, testRegion, testSecurityGroupId, testSecurityGroupRuleId) for _, mod := range mods { mod(&request) } @@ -95,7 +98,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -103,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -111,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index 23407466d..12d6edece 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -28,7 +28,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel SecurityGroupRuleId string - SecurityGroupId *string + SecurityGroupId string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -92,7 +92,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, SecurityGroupRuleId: securityGroupRuleId, - SecurityGroupId: flags.FlagToStringPointer(p, cmd, securityGroupIdFlag), + SecurityGroupId: flags.FlagToStringValue(p, cmd, securityGroupIdFlag), } p.DebugInputModel(model) @@ -100,7 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetSecurityGroupRuleRequest { - return apiClient.GetSecurityGroupRule(ctx, model.ProjectId, *model.SecurityGroupId, model.SecurityGroupRuleId) + return apiClient.GetSecurityGroupRule(ctx, model.ProjectId, model.Region, model.SecurityGroupId, model.SecurityGroupRuleId) } func outputResult(p *print.Printer, outputFormat string, securityGroupRule *iaas.SecurityGroupRule) error { diff --git a/internal/cmd/security-group/rule/describe/describe_test.go b/internal/cmd/security-group/rule/describe/describe_test.go index 68c84b395..357457705 100644 --- a/internal/cmd/security-group/rule/describe/describe_test.go +++ b/internal/cmd/security-group/rule/describe/describe_test.go @@ -11,11 +11,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + securityGroupIdFlag: testSecurityGroupId, } for _, mod := range mods { @@ -50,9 +53,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, - SecurityGroupId: utils.Ptr(testSecurityGroupId), + SecurityGroupId: testSecurityGroupId, SecurityGroupRuleId: testSecurityGroupRuleId, } for _, mod := range mods { @@ -62,7 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetSecurityGroupRuleRequest)) iaas.ApiGetSecurityGroupRuleRequest { - request := testClient.GetSecurityGroupRule(testCtx, testProjectId, testSecurityGroupId, testSecurityGroupRuleId) + request := testClient.GetSecurityGroupRule(testCtx, testProjectId, testRegion, testSecurityGroupId, testSecurityGroupRuleId) for _, mod := range mods { mod(&request) } @@ -106,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -114,7 +118,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -122,7 +126,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index 4984d6b17..7ddb33c7a 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -30,7 +30,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel Limit *int64 - SecurityGroupId *string + SecurityGroupId string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -74,10 +74,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, *model.SecurityGroupId) + securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) - securityGroupLabel = *model.SecurityGroupId + securityGroupLabel = model.SecurityGroupId } projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) @@ -127,7 +127,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, Limit: limit, - SecurityGroupId: flags.FlagToStringPointer(p, cmd, securityGroupIdFlag), + SecurityGroupId: flags.FlagToStringValue(p, cmd, securityGroupIdFlag), } p.DebugInputModel(model) @@ -135,7 +135,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListSecurityGroupRulesRequest { - return apiClient.ListSecurityGroupRules(ctx, model.ProjectId, *model.SecurityGroupId) + return apiClient.ListSecurityGroupRules(ctx, model.ProjectId, model.Region, model.SecurityGroupId) } func outputResult(p *print.Printer, outputFormat string, securityGroupRules []iaas.SecurityGroupRule) error { diff --git a/internal/cmd/security-group/rule/list/list_test.go b/internal/cmd/security-group/rule/list/list_test.go index ab41b1d87..92ba77801 100644 --- a/internal/cmd/security-group/rule/list/list_test.go +++ b/internal/cmd/security-group/rule/list/list_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -26,7 +28,9 @@ var testSecurityGroupId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", securityGroupIdFlag: testSecurityGroupId, } @@ -41,9 +45,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), - SecurityGroupId: utils.Ptr(testSecurityGroupId), + SecurityGroupId: testSecurityGroupId, } for _, mod := range mods { mod(model) @@ -52,7 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListSecurityGroupRulesRequest)) iaas.ApiListSecurityGroupRulesRequest { - request := testClient.ListSecurityGroupRules(testCtx, testProjectId, testSecurityGroupId) + request := testClient.ListSecurityGroupRules(testCtx, testProjectId, testRegion, testSecurityGroupId) for _, mod := range mods { mod(&request) } @@ -86,21 +91,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index d0aae546e..c9e255929 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -64,7 +64,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - groupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.SecurityGroupId) + groupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) if err != nil { params.Printer.Warn("cannot retrieve groupname: %v", err) groupLabel = model.SecurityGroupId @@ -124,7 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateSecurityGroupRequest { - request := apiClient.UpdateSecurityGroup(ctx, model.ProjectId, model.SecurityGroupId) + request := apiClient.UpdateSecurityGroup(ctx, model.ProjectId, model.Region, model.SecurityGroupId) payload := iaas.NewUpdateSecurityGroupPayload() payload.Description = model.Description payload.Labels = utils.ConvertStringMapToInterfaceMap(model.Labels) diff --git a/internal/cmd/security-group/update/update_test.go b/internal/cmd/security-group/update/update_test.go index e7c6c4f00..081875080 100644 --- a/internal/cmd/security-group/update/update_test.go +++ b/internal/cmd/security-group/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -46,7 +48,9 @@ func toStringAnyMapPtr(m map[string]string) map[string]any { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + descriptionArg: testDescription, labelsArg: "fooKey=fooValue,barKey=barValue,bazKey=bazValue", nameArg: testName, @@ -59,7 +63,11 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, Labels: &testLabels, Description: &testDescription, Name: &testName, @@ -72,7 +80,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateSecurityGroupRequest)) iaas.ApiUpdateSecurityGroupRequest { - request := testClient.UpdateSecurityGroup(testCtx, testProjectId, testGroupId[0]) + request := testClient.UpdateSecurityGroup(testCtx, testProjectId, testRegion, testGroupId[0]) request = request.UpdateSecurityGroupPayload(iaas.UpdateSecurityGroupPayload{ Description: &testDescription, Labels: utils.Ptr(toStringAnyMapPtr(testLabels)), @@ -103,7 +111,7 @@ func TestParseInput(t *testing.T) { { description: "no values but valid group id", flagValues: map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, }, args: testGroupId, isValid: false, @@ -116,7 +124,7 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), args: testGroupId, isValid: false, @@ -124,7 +132,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), args: testGroupId, isValid: false, @@ -132,7 +140,7 @@ func TestParseInput(t *testing.T) { { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), args: testGroupId, isValid: false, diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index 824bbb0b9..4ee1b42a4 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index 18acc9627..7fc57c79b 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index 8194ca95e..369434d55 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index 58259611f..0e9856d4f 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index 658ab27ee..415f58a8f 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/backup/schedule/delete/delete.go b/internal/cmd/server/backup/schedule/delete/delete.go index 3dd8632f4..344ad02c0 100644 --- a/internal/cmd/server/backup/schedule/delete/delete.go +++ b/internal/cmd/server/backup/schedule/delete/delete.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index 1c396d0e1..3111ea55f 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 0f489ee7a..a95838116 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index f917b1689..052f13766 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index 45d884cec..ea363c540 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -96,7 +96,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetServerConsoleRequest { - return apiClient.GetServerConsole(ctx, model.ProjectId, model.ServerId) + return apiClient.GetServerConsole(ctx, model.ProjectId, model.Region, model.ServerId) } func outputResult(p *print.Printer, outputFormat, serverLabel string, serverUrl iaas.ServerConsoleUrl) error { diff --git a/internal/cmd/server/console/console_test.go b/internal/cmd/server/console/console_test.go index ab80a7fc4..a449d49bc 100644 --- a/internal/cmd/server/console/console_test.go +++ b/internal/cmd/server/console/console_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +39,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -50,6 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, } @@ -60,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetServerConsoleRequest)) iaas.ApiGetServerConsoleRequest { - request := testClient.GetServerConsole(testCtx, testProjectId, testServerId) + request := testClient.GetServerConsole(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -98,7 +102,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -106,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index b0142acec..00ebd8254 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -147,7 +147,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating server") - _, err = wait.CreateServerWaitHandler(ctx, apiClient, model.ProjectId, serverId).WaitWithContext(ctx) + _, err = wait.CreateServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, serverId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server creation: %w", err) } @@ -185,6 +185,7 @@ func configureFlags(cmd *cobra.Command) { cmd.MarkFlagsMutuallyExclusive(imageIdFlag, bootVolumeSourceIdFlag) cmd.MarkFlagsMutuallyExclusive(imageIdFlag, bootVolumeSourceTypeFlag) cmd.MarkFlagsMutuallyExclusive(networkIdFlag, networkInterfaceIdsFlag) + cmd.MarkFlagsOneRequired(networkIdFlag, networkInterfaceIdsFlag) cobra.CheckErr(err) } @@ -270,7 +271,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateServerRequest { - req := apiClient.CreateServer(ctx, model.ProjectId) + req := apiClient.CreateServer(ctx, model.ProjectId, model.Region) var userData *[]byte if model.UserData != nil { @@ -293,7 +294,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } if model.BootVolumePerformanceClass != nil || model.BootVolumeSize != nil || model.BootVolumeDeleteOnTermination != nil || model.BootVolumeSourceId != nil || model.BootVolumeSourceType != nil { - payload.BootVolume = &iaas.CreateServerPayloadBootVolume{ + payload.BootVolume = &iaas.ServerBootVolume{ PerformanceClass: model.BootVolumePerformanceClass, Size: model.BootVolumeSize, DeleteOnTermination: model.BootVolumeDeleteOnTermination, @@ -305,7 +306,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } if model.NetworkInterfaceIds != nil || model.NetworkId != nil { - payload.Networking = &iaas.CreateServerPayloadNetworking{} + payload.Networking = &iaas.CreateServerPayloadAllOfNetworking{} if model.NetworkInterfaceIds != nil { payload.Networking.CreateServerNetworkingWithNics = &iaas.CreateServerNetworkingWithNics{ diff --git a/internal/cmd/server/create/create_test.go b/internal/cmd/server/create/create_test.go index 192caac02..1270eed51 100644 --- a/internal/cmd/server/create/create_test.go +++ b/internal/cmd/server/create/create_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -31,7 +33,9 @@ var testVolumeId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + availabilityZoneFlag: "eu01-1", nameFlag: "test-server-name", machineTypeFlag: "t1.1", @@ -59,6 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, AvailabilityZone: utils.Ptr("eu01-1"), @@ -87,7 +92,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateServerRequest)) iaas.ApiCreateServerRequest { - request := testClient.CreateServer(testCtx, testProjectId) + request := testClient.CreateServer(testCtx, testProjectId, testRegion) request = request.CreateServerPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -96,7 +101,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateServerRequest)) iaas.Api } func fixtureRequiredRequest(mods ...func(request *iaas.ApiCreateServerRequest)) iaas.ApiCreateServerRequest { - request := testClient.CreateServer(testCtx, testProjectId) + request := testClient.CreateServer(testCtx, testProjectId, testRegion) request = request.CreateServerPayload(iaas.CreateServerPayload{ MachineType: utils.Ptr("t1.1"), Name: utils.Ptr("test-server-name"), @@ -121,7 +126,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateServerPayload)) iaas.Create ServiceAccountMails: utils.Ptr([]string{"test-service-account"}), UserData: utils.Ptr([]byte("test-user-data")), Volumes: utils.Ptr([]string{testVolumeId}), - BootVolume: &iaas.CreateServerPayloadBootVolume{ + BootVolume: &iaas.ServerBootVolume{ PerformanceClass: utils.Ptr("test-perf-class"), Size: utils.Ptr(int64(5)), DeleteOnTermination: utils.Ptr(false), @@ -130,7 +135,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateServerPayload)) iaas.Create Type: utils.Ptr("test-source-type"), }, }, - Networking: &iaas.CreateServerPayloadNetworking{ + Networking: &iaas.CreateServerPayloadAllOfNetworking{ CreateServerNetworking: &iaas.CreateServerNetworking{ NetworkId: utils.Ptr(testNetworkId), }, @@ -168,7 +173,6 @@ func TestParseInput(t *testing.T) { delete(flagValues, bootVolumePerformanceClassFlag) delete(flagValues, bootVolumeDeleteOnTerminationFlag) delete(flagValues, keypairNameFlag) - delete(flagValues, networkIdFlag) delete(flagValues, networkInterfaceIdsFlag) delete(flagValues, securityGroupsFlag) delete(flagValues, serviceAccountEmailsFlag) @@ -187,7 +191,6 @@ func TestParseInput(t *testing.T) { model.BootVolumePerformanceClass = nil model.BootVolumeDeleteOnTermination = nil model.KeypairName = nil - model.NetworkId = nil model.NetworkInterfaceIds = nil model.SecurityGroups = nil model.ServiceAccountMails = nil @@ -218,21 +221,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -350,6 +353,7 @@ func TestBuildRequest(t *testing.T) { model: &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, MachineType: utils.Ptr("t1.1"), diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index 7d1d4e37d..b55da54b2 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -81,7 +81,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deallocating server") - _, err = wait.DeallocateServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.DeallocateServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server deallocating: %w", err) } @@ -118,5 +118,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeallocateServerRequest { - return apiClient.DeallocateServer(ctx, model.ProjectId, model.ServerId) + return apiClient.DeallocateServer(ctx, model.ProjectId, model.Region, model.ServerId) } diff --git a/internal/cmd/server/deallocate/deallocate_test.go b/internal/cmd/server/deallocate/deallocate_test.go index 5f1c06bea..efb00e27f 100644 --- a/internal/cmd/server/deallocate/deallocate_test.go +++ b/internal/cmd/server/deallocate/deallocate_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -46,6 +49,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, + Region: testRegion, ProjectId: testProjectId, }, ServerId: testServerId, @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeallocateServerRequest)) iaas.ApiDeallocateServerRequest { - request := testClient.DeallocateServer(testCtx, testProjectId, testServerId) + request := testClient.DeallocateServer(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -95,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index f2f5e80db..1a63f5ae1 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -84,7 +84,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting server") - _, err = wait.DeleteServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.DeleteServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server deletion: %w", err) } @@ -120,5 +120,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteServerRequest { - return apiClient.DeleteServer(ctx, model.ProjectId, model.ServerId) + return apiClient.DeleteServer(ctx, model.ProjectId, model.Region, model.ServerId) } diff --git a/internal/cmd/server/delete/delete_test.go b/internal/cmd/server/delete/delete_test.go index 3b72baca3..9534c8b22 100644 --- a/internal/cmd/server/delete/delete_test.go +++ b/internal/cmd/server/delete/delete_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteServerRequest)) iaas.ApiDeleteServerRequest { - request := testClient.DeleteServer(testCtx, testProjectId, testServerId) + request := testClient.DeleteServer(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -101,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/describe/describe.go b/internal/cmd/server/describe/describe.go index 760444d26..3058cd465 100644 --- a/internal/cmd/server/describe/describe.go +++ b/internal/cmd/server/describe/describe.go @@ -90,7 +90,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetServerRequest { - req := apiClient.GetServer(ctx, model.ProjectId, model.ServerId) + req := apiClient.GetServer(ctx, model.ProjectId, model.Region, model.ServerId) req = req.Details(true) return req diff --git a/internal/cmd/server/describe/describe_test.go b/internal/cmd/server/describe/describe_test.go index 0d416e464..af975d7c6 100644 --- a/internal/cmd/server/describe/describe_test.go +++ b/internal/cmd/server/describe/describe_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,7 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -48,6 +51,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, ServerId: testServerId, @@ -59,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetServerRequest)) iaas.ApiGetServerRequest { - request := testClient.GetServer(testCtx, testProjectId, testServerId) + request := testClient.GetServer(testCtx, testProjectId, testRegion, testServerId) request = request.Details(true) for _, mod := range mods { mod(&request) @@ -104,7 +108,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -112,7 +116,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -120,7 +124,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index 0918e1d91..98faf6365 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -130,7 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListServersRequest { - req := apiClient.ListServers(ctx, model.ProjectId) + req := apiClient.ListServers(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/server/list/list_test.go b/internal/cmd/server/list/list_test.go index 1507be485..f23efc370 100644 --- a/internal/cmd/server/list/list_test.go +++ b/internal/cmd/server/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,9 @@ var testLabelSelector = "label" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", labelSelectorFlag: testLabelSelector, } @@ -42,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), @@ -53,7 +58,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListServersRequest)) iaas.ApiListServersRequest { - request := testClient.ListServers(testCtx, testProjectId) + request := testClient.ListServers(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabelSelector) request = request.Details(true) for _, mod := range mods { @@ -89,21 +94,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index f4015c298..6b6a59f67 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -66,7 +66,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -128,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetServerLogRequest { - return apiClient.GetServerLog(ctx, model.ProjectId, model.ServerId) + return apiClient.GetServerLog(ctx, model.ProjectId, model.Region, model.ServerId) } func outputResult(p *print.Printer, outputFormat, serverLabel, log string) error { diff --git a/internal/cmd/server/log/log_test.go b/internal/cmd/server/log/log_test.go index c1768f672..e9c0c657a 100644 --- a/internal/cmd/server/log/log_test.go +++ b/internal/cmd/server/log/log_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +39,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + lengthLimitFlag: "3000", } for _, mod := range mods { @@ -51,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, Length: utils.Ptr(int64(3000)), @@ -62,7 +67,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetServerLogRequest)) iaas.ApiGetServerLogRequest { - request := testClient.GetServerLog(testCtx, testProjectId, testServerId) + request := testClient.GetServerLog(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -100,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -108,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index 83544b540..2fbdae1de 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -87,7 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetMachineTypeRequest { - return apiClient.GetMachineType(ctx, model.ProjectId, model.MachineType) + return apiClient.GetMachineType(ctx, model.ProjectId, model.Region, model.MachineType) } func outputResult(p *print.Printer, outputFormat string, machineType *iaas.MachineType) error { diff --git a/internal/cmd/server/machine-type/describe/describe_test.go b/internal/cmd/server/machine-type/describe/describe_test.go index 81c992468..f423455f6 100644 --- a/internal/cmd/server/machine-type/describe/describe_test.go +++ b/internal/cmd/server/machine-type/describe/describe_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,7 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -48,6 +51,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, MachineType: testMachineType, @@ -59,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetMachineTypeRequest)) iaas.ApiGetMachineTypeRequest { - request := testClient.GetMachineType(testCtx, testProjectId, testMachineType) + request := testClient.GetMachineType(testCtx, testProjectId, testRegion, testMachineType) for _, mod := range mods { mod(&request) } @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -111,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -119,7 +123,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 833de684e..db88e7be5 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -120,7 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListMachineTypesRequest { - return apiClient.ListMachineTypes(ctx, model.ProjectId) + return apiClient.ListMachineTypes(ctx, model.ProjectId, model.Region) } func outputResult(p *print.Printer, outputFormat string, machineTypes iaas.MachineTypeListResponse) error { diff --git a/internal/cmd/server/machine-type/list/list_test.go b/internal/cmd/server/machine-type/list/list_test.go index db8906209..55b5c3c4a 100644 --- a/internal/cmd/server/machine-type/list/list_test.go +++ b/internal/cmd/server/machine-type/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -26,8 +28,10 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -40,6 +44,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), } @@ -50,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListMachineTypesRequest)) iaas.ApiListMachineTypesRequest { - request := testClient.ListMachineTypes(testCtx, testProjectId) + request := testClient.ListMachineTypes(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -84,21 +89,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 1d774ffea..639c070a0 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, *model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId @@ -73,7 +73,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // if the create flag is provided a network interface will be created and attached if model.Create != nil && *model.Create { - networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, *model.NetworkId) + networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, *model.NetworkId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId @@ -157,9 +157,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequestAttach(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiAddNicToServerRequest { - return apiClient.AddNicToServer(ctx, model.ProjectId, *model.ServerId, *model.NicId) + return apiClient.AddNicToServer(ctx, model.ProjectId, model.Region, *model.ServerId, *model.NicId) } func buildRequestCreateAndAttach(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiAddNetworkToServerRequest { - return apiClient.AddNetworkToServer(ctx, model.ProjectId, *model.ServerId, *model.NetworkId) + return apiClient.AddNetworkToServer(ctx, model.ProjectId, model.Region, *model.ServerId, *model.NetworkId) } diff --git a/internal/cmd/server/network-interface/attach/attach_test.go b/internal/cmd/server/network-interface/attach/attach_test.go index 697562536..6e2898b32 100644 --- a/internal/cmd/server/network-interface/attach/attach_test.go +++ b/internal/cmd/server/network-interface/attach/attach_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -28,7 +30,9 @@ var testNetworkId = uuid.NewString() // contains nic id func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, networkInterfaceIdFlag: testNicId, } @@ -43,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: utils.Ptr(testServerId), NicId: utils.Ptr(testNicId), @@ -54,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequestAttach(mods ...func(request *iaas.ApiAddNicToServerRequest)) iaas.ApiAddNicToServerRequest { - request := testClient.AddNicToServer(testCtx, testProjectId, testServerId, testNicId) + request := testClient.AddNicToServer(testCtx, testProjectId, testRegion, testServerId, testNicId) for _, mod := range mods { mod(&request) } @@ -62,7 +67,7 @@ func fixtureRequestAttach(mods ...func(request *iaas.ApiAddNicToServerRequest)) } func fixtureRequestCreateAndAttach(mods ...func(request *iaas.ApiAddNetworkToServerRequest)) iaas.ApiAddNetworkToServerRequest { - request := testClient.AddNetworkToServer(testCtx, testProjectId, testServerId, testNetworkId) + request := testClient.AddNetworkToServer(testCtx, testProjectId, testRegion, testServerId, testNetworkId) for _, mod := range mods { mod(&request) } @@ -91,21 +96,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index b8afad878..287b715f4 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, *model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = *model.ServerId @@ -75,7 +75,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // if the delete flag is provided a network interface is detached and deleted if model.Delete != nil && *model.Delete { - networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, *model.NetworkId) + networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, *model.NetworkId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId @@ -159,9 +159,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequestDetach(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRemoveNicFromServerRequest { - return apiClient.RemoveNicFromServer(ctx, model.ProjectId, *model.ServerId, *model.NicId) + return apiClient.RemoveNicFromServer(ctx, model.ProjectId, model.Region, *model.ServerId, *model.NicId) } func buildRequestDetachAndDelete(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRemoveNetworkFromServerRequest { - return apiClient.RemoveNetworkFromServer(ctx, model.ProjectId, *model.ServerId, *model.NetworkId) + return apiClient.RemoveNetworkFromServer(ctx, model.ProjectId, model.Region, *model.ServerId, *model.NetworkId) } diff --git a/internal/cmd/server/network-interface/detach/detach_test.go b/internal/cmd/server/network-interface/detach/detach_test.go index 1eef8529a..4946e3e41 100644 --- a/internal/cmd/server/network-interface/detach/detach_test.go +++ b/internal/cmd/server/network-interface/detach/detach_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -28,7 +30,9 @@ var testNetworkId = uuid.NewString() // contains nic id func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, networkInterfaceIdFlag: testNicId, } @@ -43,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: utils.Ptr(testServerId), NicId: utils.Ptr(testNicId), @@ -54,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequestDetach(mods ...func(request *iaas.ApiRemoveNicFromServerRequest)) iaas.ApiRemoveNicFromServerRequest { - request := testClient.RemoveNicFromServer(testCtx, testProjectId, testServerId, testNicId) + request := testClient.RemoveNicFromServer(testCtx, testProjectId, testRegion, testServerId, testNicId) for _, mod := range mods { mod(&request) } @@ -62,7 +67,7 @@ func fixtureRequestDetach(mods ...func(request *iaas.ApiRemoveNicFromServerReque } func fixtureRequestDetachAndDelete(mods ...func(request *iaas.ApiRemoveNetworkFromServerRequest)) iaas.ApiRemoveNetworkFromServerRequest { - request := testClient.RemoveNetworkFromServer(testCtx, testProjectId, testServerId, testNetworkId) + request := testClient.RemoveNetworkFromServer(testCtx, testProjectId, testRegion, testServerId, testNetworkId) for _, mod := range mods { mod(&request) } @@ -91,21 +96,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index ef8f70ca7..a63095dd6 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string Limit *int64 } @@ -71,12 +71,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } if resp.Items == nil || len(*resp.Items) == 0 { - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } params.Printer.Info("No attached network interfaces found for server %q\n", serverLabel) return nil @@ -88,7 +88,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { items = items[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, *model.ServerId, items) + return outputResult(params.Printer, model.OutputFormat, model.ServerId, items) }, } configureFlags(cmd) @@ -119,7 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), Limit: limit, } @@ -127,8 +127,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListServerNicsRequest { - return apiClient.ListServerNics(ctx, model.ProjectId, *model.ServerId) +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListServerNICsRequest { + return apiClient.ListServerNICs(ctx, model.ProjectId, model.Region, model.ServerId) } func outputResult(p *print.Printer, outputFormat, serverId string, serverNics []iaas.NIC) error { diff --git a/internal/cmd/server/network-interface/list/list_test.go b/internal/cmd/server/network-interface/list/list_test.go index 4b91f4742..3c93f92c3 100644 --- a/internal/cmd/server/network-interface/list/list_test.go +++ b/internal/cmd/server/network-interface/list/list_test.go @@ -16,7 +16,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,9 +29,11 @@ var testServerId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + limitFlag: "10", + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -42,9 +46,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, } for _, mod := range mods { mod(model) @@ -52,8 +57,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { return model } -func fixtureRequest(mods ...func(request *iaas.ApiListServerNicsRequest)) iaas.ApiListServerNicsRequest { - request := testClient.ListServerNics(testCtx, testProjectId, testServerId) +func fixtureRequest(mods ...func(request *iaas.ApiListServerNICsRequest)) iaas.ApiListServerNICsRequest { + request := testClient.ListServerNICs(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -82,21 +87,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -148,7 +153,7 @@ func TestBuildRequest(t *testing.T) { tests := []struct { description string model *inputModel - expectedRequest iaas.ApiListServerNicsRequest + expectedRequest iaas.ApiListServerNICsRequest }{ { description: "base", diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 7af78387a..1c8bddf44 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -65,7 +65,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index 3c9510b98..81086b85f 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index c81c27b44..c2538aa0f 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index 5ce2a5c27..94112f256 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -71,7 +71,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index 76dd76235..b9c1e3a1a 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -73,7 +73,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index b9721cca8..4047fba6d 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -70,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serverLabel := model.ServerId // Get server name if iaasApiClient, err := iaasClient.ConfigureClient(params.Printer, params.CliVersion); err == nil { - serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, iaasApiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) } else if serverName != "" { diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 763583606..3f76d8852 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string PublicIpId string } @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) + publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.Region, model.PublicIpId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get public ip name: %v", err) publicIpLabel = model.PublicIpId @@ -62,12 +62,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { publicIpLabel = model.PublicIpId } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -109,7 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), PublicIpId: volumeId, } @@ -118,5 +118,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiAddPublicIpToServerRequest { - return apiClient.AddPublicIpToServer(ctx, model.ProjectId, *model.ServerId, model.PublicIpId) + return apiClient.AddPublicIpToServer(ctx, model.ProjectId, model.Region, model.ServerId, model.PublicIpId) } diff --git a/internal/cmd/server/public-ip/attach/attach_test.go b/internal/cmd/server/public-ip/attach/attach_test.go index c58f7b280..3f0e10763 100644 --- a/internal/cmd/server/public-ip/attach/attach_test.go +++ b/internal/cmd/server/public-ip/attach/attach_test.go @@ -4,18 +4,18 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +37,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -51,8 +53,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, PublicIpId: testPublicIpId, } for _, mod := range mods { @@ -62,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiAddPublicIpToServerRequest)) iaas.ApiAddPublicIpToServerRequest { - request := testClient.AddPublicIpToServer(testCtx, testProjectId, testServerId, testPublicIpId) + request := testClient.AddPublicIpToServer(testCtx, testProjectId, testRegion, testServerId, testPublicIpId) for _, mod := range mods { mod(&request) } @@ -94,7 +97,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -102,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -110,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index 6294187d8..ecf43cba5 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string PublicIpId string } @@ -55,7 +55,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.PublicIpId) + publicIpLabel, _, err := iaasUtils.GetPublicIP(ctx, apiClient, model.ProjectId, model.Region, model.PublicIpId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get public ip: %v", err) publicIpLabel = model.PublicIpId @@ -63,12 +63,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { publicIpLabel = model.PublicIpId } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -110,7 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), PublicIpId: publicIpId, } @@ -119,5 +119,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRemovePublicIpFromServerRequest { - return apiClient.RemovePublicIpFromServer(ctx, model.ProjectId, *model.ServerId, model.PublicIpId) + return apiClient.RemovePublicIpFromServer(ctx, model.ProjectId, model.Region, model.ServerId, model.PublicIpId) } diff --git a/internal/cmd/server/public-ip/detach/detach_test.go b/internal/cmd/server/public-ip/detach/detach_test.go index 8a46591a7..ccea98e12 100644 --- a/internal/cmd/server/public-ip/detach/detach_test.go +++ b/internal/cmd/server/public-ip/detach/detach_test.go @@ -7,7 +7,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -15,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +38,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -51,8 +53,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, PublicIpId: testPublicIpId, } for _, mod := range mods { @@ -62,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiRemovePublicIpFromServerRequest)) iaas.ApiRemovePublicIpFromServerRequest { - request := testClient.RemovePublicIpFromServer(testCtx, testProjectId, testServerId, testPublicIpId) + request := testClient.RemovePublicIpFromServer(testCtx, testProjectId, testRegion, testServerId, testPublicIpId) for _, mod := range mods { mod(&request) } @@ -93,7 +96,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -101,7 +104,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -109,7 +112,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index 445321295..ed13d02ce 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -62,7 +62,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -116,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRebootServerRequest { - req := apiClient.RebootServer(ctx, model.ProjectId, model.ServerId) + req := apiClient.RebootServer(ctx, model.ProjectId, model.Region, model.ServerId) // if hard reboot is set the action must be set (soft is default) if model.HardReboot { req = req.Action(hardRebootAction) diff --git a/internal/cmd/server/reboot/reboot_test.go b/internal/cmd/server/reboot/reboot_test.go index 074ba2a84..1a05016e1 100644 --- a/internal/cmd/server/reboot/reboot_test.go +++ b/internal/cmd/server/reboot/reboot_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + hardRebootFlag: "false", } for _, mod := range mods { @@ -48,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, HardReboot: false, @@ -59,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiRebootServerRequest)) iaas.ApiRebootServerRequest { - request := testClient.RebootServer(testCtx, testProjectId, testServerId) + request := testClient.RebootServer(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -97,7 +102,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -105,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index 65dc2633d..3ae4f99b5 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -85,7 +85,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Rescuing server") - _, err = wait.RescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.RescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server rescuing: %w", err) } @@ -131,7 +131,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRescueServerRequest { - req := apiClient.RescueServer(ctx, model.ProjectId, model.ServerId) + req := apiClient.RescueServer(ctx, model.ProjectId, model.Region, model.ServerId) payload := iaas.RescueServerPayload{ Image: model.ImageId, } diff --git a/internal/cmd/server/rescue/rescue_test.go b/internal/cmd/server/rescue/rescue_test.go index d3e6e3c50..b7ec93e90 100644 --- a/internal/cmd/server/rescue/rescue_test.go +++ b/internal/cmd/server/rescue/rescue_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,8 +38,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - imageIdFlag: testImageId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + imageIdFlag: testImageId, } for _, mod := range mods { mod(flagValues) @@ -50,6 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, ImageId: utils.Ptr(testImageId), @@ -61,7 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiRescueServerRequest)) iaas.ApiRescueServerRequest { - request := testClient.RescueServer(testCtx, testProjectId, testServerId) + request := testClient.RescueServer(testCtx, testProjectId, testRegion, testServerId) request = request.RescueServerPayload(iaas.RescueServerPayload{ Image: utils.Ptr(testImageId), }) @@ -104,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -112,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -120,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index f23826188..329d5a6b4 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -58,7 +58,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -85,7 +85,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Resizing server") - _, err = wait.ResizeServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.ResizeServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server resizing: %w", err) } @@ -131,7 +131,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiResizeServerRequest { - req := apiClient.ResizeServer(ctx, model.ProjectId, model.ServerId) + req := apiClient.ResizeServer(ctx, model.ProjectId, model.Region, model.ServerId) payload := iaas.ResizeServerPayload{ MachineType: model.MachineType, } diff --git a/internal/cmd/server/resize/resize_test.go b/internal/cmd/server/resize/resize_test.go index 231d7c1c0..3ba39088f 100644 --- a/internal/cmd/server/resize/resize_test.go +++ b/internal/cmd/server/resize/resize_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -35,7 +37,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + machineTypeFlag: "t1.2", } for _, mod := range mods { @@ -49,6 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, MachineType: utils.Ptr("t1.2"), @@ -60,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiResizeServerRequest)) iaas.ApiResizeServerRequest { - request := testClient.ResizeServer(testCtx, testProjectId, testServerId) + request := testClient.ResizeServer(testCtx, testProjectId, testRegion, testServerId) request = request.ResizeServerPayload(iaas.ResizeServerPayload{ MachineType: utils.Ptr("t1.2"), }) @@ -103,7 +108,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -111,7 +116,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -119,7 +124,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index 3979e0398..5644ee45f 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string ServiceAccMail string } @@ -54,12 +54,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -100,7 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), ServiceAccMail: serviceAccMail, } @@ -109,7 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiAddServiceAccountToServerRequest { - req := apiClient.AddServiceAccountToServer(ctx, model.ProjectId, *model.ServerId, model.ServiceAccMail) + req := apiClient.AddServiceAccountToServer(ctx, model.ProjectId, model.Region, model.ServerId, model.ServiceAccMail) return req } diff --git a/internal/cmd/server/service-account/attach/attach_test.go b/internal/cmd/server/service-account/attach/attach_test.go index 96ed151ce..0edf073b4 100644 --- a/internal/cmd/server/service-account/attach/attach_test.go +++ b/internal/cmd/server/service-account/attach/attach_test.go @@ -7,7 +7,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/google/go-cmp/cmp" @@ -15,7 +14,9 @@ import ( "github.com/google/uuid" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +38,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -51,8 +54,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, ServiceAccMail: testServiceAccount, } for _, mod := range mods { @@ -62,7 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiAddServiceAccountToServerRequest)) iaas.ApiAddServiceAccountToServerRequest { - request := testClient.AddServiceAccountToServer(testCtx, testProjectId, testServerId, testServiceAccount) + request := testClient.AddServiceAccountToServer(testCtx, testProjectId, testRegion, testServerId, testServiceAccount) for _, mod := range mods { mod(&request) } @@ -94,7 +98,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -102,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -110,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index 934ed766d..59966f6d5 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string ServiceAccMail string } @@ -54,12 +54,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -100,7 +100,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), ServiceAccMail: serviceAccMail, } @@ -109,7 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRemoveServiceAccountFromServerRequest { - req := apiClient.RemoveServiceAccountFromServer(ctx, model.ProjectId, *model.ServerId, model.ServiceAccMail) + req := apiClient.RemoveServiceAccountFromServer(ctx, model.ProjectId, model.Region, model.ServerId, model.ServiceAccMail) return req } diff --git a/internal/cmd/server/service-account/detach/detach_test.go b/internal/cmd/server/service-account/detach/detach_test.go index acfd02802..a1e6c89cd 100644 --- a/internal/cmd/server/service-account/detach/detach_test.go +++ b/internal/cmd/server/service-account/detach/detach_test.go @@ -7,7 +7,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/google/go-cmp/cmp" @@ -15,7 +14,9 @@ import ( "github.com/google/uuid" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +38,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -51,8 +54,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, ServiceAccMail: testServiceAccount, } for _, mod := range mods { @@ -62,7 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiRemoveServiceAccountFromServerRequest)) iaas.ApiRemoveServiceAccountFromServerRequest { - request := testClient.RemoveServiceAccountFromServer(testCtx, testProjectId, testServerId, testServiceAccount) + request := testClient.RemoveServiceAccountFromServer(testCtx, testProjectId, testRegion, testServerId, testServiceAccount) for _, mod := range mods { mod(&request) } @@ -94,7 +98,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -102,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -110,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index 5bf727bc7..95773fc6e 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel Limit *int64 - ServerId *string + ServerId string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -62,12 +62,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverName, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverName, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverName = *model.ServerId + serverName = model.ServerId } else if serverName == "" { - serverName = *model.ServerId + serverName = model.ServerId } // Call API @@ -86,7 +86,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { serviceAccounts = serviceAccounts[:int(*model.Limit)] } - return outputResult(params.Printer, model.OutputFormat, *model.ServerId, serverName, serviceAccounts) + return outputResult(params.Printer, model.OutputFormat, model.ServerId, serverName, serviceAccounts) }, } configureFlags(cmd) @@ -118,7 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, Limit: limit, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } p.DebugInputModel(model) @@ -126,7 +126,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListServerServiceAccountsRequest { - req := apiClient.ListServerServiceAccounts(ctx, model.ProjectId, *model.ServerId) + req := apiClient.ListServerServiceAccounts(ctx, model.ProjectId, model.Region, model.ServerId) return req } diff --git a/internal/cmd/server/service-account/list/list_test.go b/internal/cmd/server/service-account/list/list_test.go index d2a0c159a..a58d5e671 100644 --- a/internal/cmd/server/service-account/list/list_test.go +++ b/internal/cmd/server/service-account/list/list_test.go @@ -17,7 +17,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -29,9 +31,11 @@ var testLimit = int64(10) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, - limitFlag: strconv.FormatInt(testLimit, 10), + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, + limitFlag: strconv.FormatInt(testLimit, 10), } for _, mod := range mods { mod(flagValues) @@ -44,8 +48,9 @@ func fixtureInputModel(mods ...func(inputModel *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, Limit: utils.Ptr(testLimit), } for _, mod := range mods { @@ -55,7 +60,7 @@ func fixtureInputModel(mods ...func(inputModel *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListServerServiceAccountsRequest)) iaas.ApiListServerServiceAccountsRequest { - request := testClient.ListServerServiceAccounts(testCtx, testProjectId, testServerId) + request := testClient.ListServerServiceAccounts(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -84,21 +89,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index 9ebabdf70..e025e2890 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -73,7 +73,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Starting server") - _, err = wait.StartServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.StartServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server starting: %w", err) } @@ -110,5 +110,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiStartServerRequest { - return apiClient.StartServer(ctx, model.ProjectId, model.ServerId) + return apiClient.StartServer(ctx, model.ProjectId, model.Region, model.ServerId) } diff --git a/internal/cmd/server/start/start_test.go b/internal/cmd/server/start/start_test.go index f028d85d9..f5e64b2d2 100644 --- a/internal/cmd/server/start/start_test.go +++ b/internal/cmd/server/start/start_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiStartServerRequest)) iaas.ApiStartServerRequest { - request := testClient.StartServer(testCtx, testProjectId, testServerId) + request := testClient.StartServer(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -95,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index d91c1931c..958127da7 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -81,7 +81,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Stopping server") - _, err = wait.StopServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.StopServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server stopping: %w", err) } @@ -118,5 +118,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiStopServerRequest { - return apiClient.StopServer(ctx, model.ProjectId, model.ServerId) + return apiClient.StopServer(ctx, model.ProjectId, model.Region, model.ServerId) } diff --git a/internal/cmd/server/stop/stop_test.go b/internal/cmd/server/stop/stop_test.go index 7aba2f968..29980a4b9 100644 --- a/internal/cmd/server/stop/stop_test.go +++ b/internal/cmd/server/stop/stop_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiStopServerRequest)) iaas.ApiStopServerRequest { - request := testClient.StopServer(testCtx, testProjectId, testServerId) + request := testClient.StopServer(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -95,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index 47b6cf018..6f433ebeb 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -81,7 +81,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Unrescuing server") - _, err = wait.UnrescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.ServerId).WaitWithContext(ctx) + _, err = wait.UnrescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for server unrescuing: %w", err) } @@ -118,5 +118,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUnrescueServerRequest { - return apiClient.UnrescueServer(ctx, model.ProjectId, model.ServerId) + return apiClient.UnrescueServer(ctx, model.ProjectId, model.Region, model.ServerId) } diff --git a/internal/cmd/server/unrescue/unrescue_test.go b/internal/cmd/server/unrescue/unrescue_test.go index 8161f03d4..708fe68d8 100644 --- a/internal/cmd/server/unrescue/unrescue_test.go +++ b/internal/cmd/server/unrescue/unrescue_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, ServerId: testServerId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUnrescueServerRequest)) iaas.ApiUnrescueServerRequest { - request := testClient.UnrescueServer(testCtx, testProjectId, testServerId) + request := testClient.UnrescueServer(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -95,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index 5567be1bf..f8b404794 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -61,7 +61,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) serverLabel = model.ServerId @@ -116,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateServerRequest { - req := apiClient.UpdateServer(ctx, model.ProjectId, model.ServerId) + req := apiClient.UpdateServer(ctx, model.ProjectId, model.Region, model.ServerId) payload := iaas.UpdateServerPayload{ Name: model.Name, diff --git a/internal/cmd/server/update/update_test.go b/internal/cmd/server/update/update_test.go index 63398311e..d13d32c87 100644 --- a/internal/cmd/server/update/update_test.go +++ b/internal/cmd/server/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,9 +39,11 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - nameFlag: "example-server-name", - projectIdFlag: testProjectId, - labelFlag: "key=value", + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + nameFlag: "example-server-name", + labelFlag: "key=value", } for _, mod := range mods { mod(flagValues) @@ -51,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Name: utils.Ptr("example-server-name"), @@ -66,7 +71,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateServerRequest)) iaas.ApiUpdateServerRequest { - request := testClient.UpdateServer(testCtx, testProjectId, testServerId) + request := testClient.UpdateServer(testCtx, testProjectId, testRegion, testServerId) request = request.UpdateServerPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -112,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -120,7 +125,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -128,7 +133,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index ba736f285..65a631ddf 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -29,7 +29,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string VolumeId string DeleteOnTermination *bool } @@ -63,18 +63,18 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -116,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), DeleteOnTermination: flags.FlagToBoolPointer(p, cmd, deleteOnTerminationFlag), VolumeId: volumeId, } @@ -126,7 +126,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiAddVolumeToServerRequest { - req := apiClient.AddVolumeToServer(ctx, model.ProjectId, *model.ServerId, model.VolumeId) + req := apiClient.AddVolumeToServer(ctx, model.ProjectId, model.Region, model.ServerId, model.VolumeId) payload := iaas.AddVolumeToServerPayload{ DeleteOnTermination: model.DeleteOnTermination, } diff --git a/internal/cmd/server/volume/attach/attach_test.go b/internal/cmd/server/volume/attach/attach_test.go index 9a180a4c0..2f3ed3e69 100644 --- a/internal/cmd/server/volume/attach/attach_test.go +++ b/internal/cmd/server/volume/attach/attach_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +39,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, deleteOnTerminationFlag: "true", } @@ -52,8 +56,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, VolumeId: testVolumeId, DeleteOnTermination: utils.Ptr(true), } @@ -74,7 +79,7 @@ func fixturePayload(mods ...func(payload *iaas.AddVolumeToServerPayload)) iaas.A } func fixtureRequest(mods ...func(request *iaas.ApiAddVolumeToServerRequest)) iaas.ApiAddVolumeToServerRequest { - request := testClient.AddVolumeToServer(testCtx, testProjectId, testServerId, testVolumeId) + request := testClient.AddVolumeToServer(testCtx, testProjectId, testRegion, testServerId, testVolumeId) request = request.AddVolumeToServerPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -107,7 +112,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -115,7 +120,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -123,7 +128,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 2a0a97d24..4c0288851 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string VolumeId string } @@ -63,18 +63,18 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } // Call API @@ -107,7 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), VolumeId: volumeId, } @@ -116,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetAttachedVolumeRequest { - req := apiClient.GetAttachedVolume(ctx, model.ProjectId, *model.ServerId, model.VolumeId) + req := apiClient.GetAttachedVolume(ctx, model.ProjectId, model.Region, model.ServerId, model.VolumeId) return req } diff --git a/internal/cmd/server/volume/describe/describe_test.go b/internal/cmd/server/volume/describe/describe_test.go index f2182f04c..3d6634075 100644 --- a/internal/cmd/server/volume/describe/describe_test.go +++ b/internal/cmd/server/volume/describe/describe_test.go @@ -4,18 +4,18 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +37,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -51,8 +53,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, VolumeId: testVolumeId, } for _, mod := range mods { @@ -62,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetAttachedVolumeRequest)) iaas.ApiGetAttachedVolumeRequest { - request := testClient.GetAttachedVolume(testCtx, testProjectId, testServerId, testVolumeId) + request := testClient.GetAttachedVolume(testCtx, testProjectId, testRegion, testServerId, testVolumeId) for _, mod := range mods { mod(&request) } @@ -94,7 +97,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -102,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -110,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index e081295d6..5c271b8fe 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -26,7 +26,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string VolumeId string } @@ -55,18 +55,18 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -108,7 +108,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), VolumeId: volumeId, } @@ -117,6 +117,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRemoveVolumeFromServerRequest { - req := apiClient.RemoveVolumeFromServer(ctx, model.ProjectId, *model.ServerId, model.VolumeId) + req := apiClient.RemoveVolumeFromServer(ctx, model.ProjectId, model.Region, model.ServerId, model.VolumeId) return req } diff --git a/internal/cmd/server/volume/detach/detach_test.go b/internal/cmd/server/volume/detach/detach_test.go index 4934e778d..e9ebecb32 100644 --- a/internal/cmd/server/volume/detach/detach_test.go +++ b/internal/cmd/server/volume/detach/detach_test.go @@ -4,18 +4,18 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +37,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -51,8 +53,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, VolumeId: testVolumeId, } for _, mod := range mods { @@ -62,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiRemoveVolumeFromServerRequest)) iaas.ApiRemoveVolumeFromServerRequest { - request := testClient.RemoveVolumeFromServer(testCtx, testProjectId, testServerId, testVolumeId) + request := testClient.RemoveVolumeFromServer(testCtx, testProjectId, testRegion, testServerId, testVolumeId) for _, mod := range mods { mod(&request) } @@ -93,7 +96,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -101,7 +104,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -109,7 +112,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index 6f25321db..4dddab072 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -25,7 +25,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -55,12 +55,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } // Call API @@ -78,7 +78,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // get volume names var volumeNames []string for i := range volumes { - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, *volumes[i].VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, *volumes[i].VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = "" @@ -108,7 +108,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), } p.DebugInputModel(model) @@ -116,7 +116,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListAttachedVolumesRequest { - req := apiClient.ListAttachedVolumes(ctx, model.ProjectId, *model.ServerId) + req := apiClient.ListAttachedVolumes(ctx, model.ProjectId, model.Region, model.ServerId) return req } diff --git a/internal/cmd/server/volume/list/list_test.go b/internal/cmd/server/volume/list/list_test.go index 6be36d7d6..82e73dff8 100644 --- a/internal/cmd/server/volume/list/list_test.go +++ b/internal/cmd/server/volume/list/list_test.go @@ -4,19 +4,19 @@ import ( "context" "testing" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" - "github.com/google/uuid" "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,8 +27,10 @@ var testServerId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - serverIdFlag: testServerId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, } for _, mod := range mods { mod(flagValues) @@ -41,8 +43,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, } for _, mod := range mods { mod(model) @@ -51,7 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListAttachedVolumesRequest)) iaas.ApiListAttachedVolumesRequest { - request := testClient.ListAttachedVolumes(testCtx, testProjectId, testServerId) + request := testClient.ListAttachedVolumes(testCtx, testProjectId, testRegion, testServerId) for _, mod := range mods { mod(&request) } @@ -80,21 +83,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 471dde5c0..12c7e66ee 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -29,7 +29,7 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - ServerId *string + ServerId string VolumeId string DeleteOnTermination *bool } @@ -59,18 +59,18 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId } - serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, *model.ServerId) + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) - serverLabel = *model.ServerId + serverLabel = model.ServerId } else if serverLabel == "" { - serverLabel = *model.ServerId + serverLabel = model.ServerId } if !model.AssumeYes { @@ -112,7 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu model := inputModel{ GlobalFlagModel: globalFlags, - ServerId: flags.FlagToStringPointer(p, cmd, serverIdFlag), + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), DeleteOnTermination: flags.FlagToBoolPointer(p, cmd, deleteOnTerminationFlag), VolumeId: volumeId, } @@ -122,7 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateAttachedVolumeRequest { - req := apiClient.UpdateAttachedVolume(ctx, model.ProjectId, *model.ServerId, model.VolumeId) + req := apiClient.UpdateAttachedVolume(ctx, model.ProjectId, model.Region, model.ServerId, model.VolumeId) payload := iaas.UpdateAttachedVolumePayload{ DeleteOnTermination: model.DeleteOnTermination, } diff --git a/internal/cmd/server/volume/update/update_test.go b/internal/cmd/server/volume/update/update_test.go index 1f820cff2..a15d5e810 100644 --- a/internal/cmd/server/volume/update/update_test.go +++ b/internal/cmd/server/volume/update/update_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,7 +39,9 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + serverIdFlag: testServerId, deleteOnTerminationFlag: "true", } @@ -52,8 +56,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, - ServerId: utils.Ptr(testServerId), + ServerId: testServerId, VolumeId: testVolumeId, DeleteOnTermination: utils.Ptr(true), } @@ -74,7 +79,7 @@ func fixturePayload(mods ...func(payload *iaas.UpdateAttachedVolumePayload)) iaa } func fixtureRequest(mods ...func(request *iaas.ApiUpdateAttachedVolumeRequest)) iaas.ApiUpdateAttachedVolumeRequest { - request := testClient.UpdateAttachedVolume(testCtx, testProjectId, testServerId, testVolumeId) + request := testClient.UpdateAttachedVolume(testCtx, testProjectId, testRegion, testServerId, testVolumeId) request = request.UpdateAttachedVolumePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -106,7 +111,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -114,7 +119,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -122,7 +127,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index 4245716e9..316efc520 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -78,14 +78,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // Get source name for label (use ID if name not available) sourceLabel := model.SourceID if model.SourceType == "volume" { - name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, model.SourceID) + name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.SourceID) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) } else if name != "" { sourceLabel = name } } else if model.SourceType == "snapshot" { - name, err := iaasutils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.SourceID) + name, err := iaasutils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.Region, model.SourceID) if err != nil { params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) } else if name != "" { @@ -107,12 +107,16 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create volume backup: %w", err) } + if resp == nil || resp.Id == nil { + return fmt.Errorf("create volume: empty response") + } + volumeId := *resp.Id // Wait for async operation, if async mode not enabled if !model.Async { s := spinner.New(params.Printer) s.Start("Creating backup") - resp, err = wait.CreateBackupWaitHandler(ctx, apiClient, model.ProjectId, *resp.Id).WaitWithContext(ctx) + resp, err = wait.CreateBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, volumeId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for backup creation: %w", err) } @@ -169,7 +173,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateBackupRequest { - req := apiClient.CreateBackup(ctx, model.ProjectId) + req := apiClient.CreateBackup(ctx, model.ProjectId, model.Region) payload := iaas.CreateBackupPayload{ Name: model.Name, diff --git a/internal/cmd/volume/backup/create/create_test.go b/internal/cmd/volume/backup/create/create_test.go index 2132d89f8..3f4e64d15 100644 --- a/internal/cmd/volume/backup/create/create_test.go +++ b/internal/cmd/volume/backup/create/create_test.go @@ -16,13 +16,14 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -type testCtxKey struct{} - const ( + testRegion = "eu01" testName = "my-backup" testSourceType = "volume" ) +type testCtxKey struct{} + var ( testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") testClient = &iaas.APIClient{} @@ -34,10 +35,12 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - sourceIdFlag: testSourceId, - sourceTypeFlag: testSourceType, - nameFlag: testName, - labelsFlag: "key1=value1", + globalflags.RegionFlag: testRegion, + + sourceIdFlag: testSourceId, + sourceTypeFlag: testSourceType, + nameFlag: testName, + labelsFlag: "key1=value1", } for _, mod := range mods { mod(flagValues) @@ -50,6 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, SourceID: testSourceId, SourceType: testSourceType, @@ -63,7 +67,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateBackupRequest)) iaas.ApiCreateBackupRequest { - request := testClient.CreateBackup(testCtx, testProjectId) + request := testClient.CreateBackup(testCtx, testProjectId, testRegion) createPayload := iaas.NewCreateBackupPayloadWithDefaults() createPayload.Name = utils.Ptr(testName) diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go index de63990bd..b439f0d6d 100644 --- a/internal/cmd/volume/backup/delete/delete.go +++ b/internal/cmd/volume/backup/delete/delete.go @@ -52,7 +52,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.BackupId) + backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.Region, model.BackupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get backup name: %v", err) } @@ -76,7 +76,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting backup") - _, err = wait.DeleteBackupWaitHandler(ctx, apiClient, model.ProjectId, model.BackupId).WaitWithContext(ctx) + _, err = wait.DeleteBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BackupId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for backup deletion: %w", err) } @@ -112,6 +112,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteBackupRequest { - req := apiClient.DeleteBackup(ctx, model.ProjectId, model.BackupId) + req := apiClient.DeleteBackup(ctx, model.ProjectId, model.Region, model.BackupId) return req } diff --git a/internal/cmd/volume/backup/delete/delete_test.go b/internal/cmd/volume/backup/delete/delete_test.go index a0146e406..26623975f 100644 --- a/internal/cmd/volume/backup/delete/delete_test.go +++ b/internal/cmd/volume/backup/delete/delete_test.go @@ -13,6 +13,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -35,6 +39,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, BackupId: testBackupId, } @@ -57,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteBackupRequest)) iaas.ApiDeleteBackupRequest { - request := testClient.DeleteBackup(testCtx, testProjectId, testBackupId) + request := testClient.DeleteBackup(testCtx, testProjectId, testRegion, testBackupId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go index f836b32b2..3f95fe355 100644 --- a/internal/cmd/volume/backup/describe/describe.go +++ b/internal/cmd/volume/backup/describe/describe.go @@ -86,7 +86,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetBackupRequest { - req := apiClient.GetBackup(ctx, model.ProjectId, model.BackupId) + req := apiClient.GetBackup(ctx, model.ProjectId, model.Region, model.BackupId) return req } diff --git a/internal/cmd/volume/backup/describe/describe_test.go b/internal/cmd/volume/backup/describe/describe_test.go index 0ff77ca24..1ba033cb2 100644 --- a/internal/cmd/volume/backup/describe/describe_test.go +++ b/internal/cmd/volume/backup/describe/describe_test.go @@ -15,6 +15,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -37,6 +41,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -49,6 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, BackupId: testBackupId, } @@ -59,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetBackupRequest)) iaas.ApiGetBackupRequest { - request := testClient.GetBackup(testCtx, testProjectId, testBackupId) + request := testClient.GetBackup(testCtx, testProjectId, testRegion, testBackupId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index 82580a440..825a6793e 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -126,7 +126,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListBackupsRequest { - req := apiClient.ListBackups(ctx, model.ProjectId) + req := apiClient.ListBackups(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) diff --git a/internal/cmd/volume/backup/list/list_test.go b/internal/cmd/volume/backup/list/list_test.go index f3616ef3c..3734dc1f7 100644 --- a/internal/cmd/volume/backup/list/list_test.go +++ b/internal/cmd/volume/backup/list/list_test.go @@ -16,6 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -27,8 +31,10 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - limitFlag: "10", - labelSelectorFlag: "key1=value1", + globalflags.RegionFlag: testRegion, + + limitFlag: "10", + labelSelectorFlag: "key1=value1", } for _, mod := range mods { mod(flagValues) @@ -40,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -52,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListBackupsRequest)) iaas.ApiListBackupsRequest { - request := testClient.ListBackups(testCtx, testProjectId) + request := testClient.ListBackups(testCtx, testProjectId, testRegion) request = request.LabelSelector("key1=value1") for _, mod := range mods { mod(&request) diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go index 04301a51d..3922c4ae8 100644 --- a/internal/cmd/volume/backup/restore/restore.go +++ b/internal/cmd/volume/backup/restore/restore.go @@ -52,17 +52,17 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.BackupId) + backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.Region, model.BackupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get backup details: %v", err) } // Get source details for labels var sourceLabel string - backup, err := apiClient.GetBackup(ctx, model.ProjectId, model.BackupId).Execute() + backup, err := apiClient.GetBackup(ctx, model.ProjectId, model.Region, model.BackupId).Execute() if err == nil && backup != nil && backup.VolumeId != nil { sourceLabel = *backup.VolumeId - name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, *backup.VolumeId) + name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, *backup.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume details: %v", err) } else if name != "" { @@ -89,7 +89,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Restoring backup") - _, err = wait.RestoreBackupWaitHandler(ctx, apiClient, model.ProjectId, model.BackupId).WaitWithContext(ctx) + _, err = wait.RestoreBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BackupId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for backup restore: %w", err) } @@ -125,6 +125,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRestoreBackupRequest { - req := apiClient.RestoreBackup(ctx, model.ProjectId, model.BackupId) + req := apiClient.RestoreBackup(ctx, model.ProjectId, model.Region, model.BackupId) return req } diff --git a/internal/cmd/volume/backup/restore/restore_test.go b/internal/cmd/volume/backup/restore/restore_test.go index 8532a05ee..1bd31ce17 100644 --- a/internal/cmd/volume/backup/restore/restore_test.go +++ b/internal/cmd/volume/backup/restore/restore_test.go @@ -13,6 +13,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -35,6 +39,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, BackupId: testBackupId, } @@ -57,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiRestoreBackupRequest)) iaas.ApiRestoreBackupRequest { - request := testClient.RestoreBackup(testCtx, testProjectId, testBackupId) + request := testClient.RestoreBackup(testCtx, testProjectId, testRegion, testBackupId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go index 9ede68fac..920ef6667 100644 --- a/internal/cmd/volume/backup/update/update.go +++ b/internal/cmd/volume/backup/update/update.go @@ -59,7 +59,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.BackupId) + backupLabel, err := iaasutils.GetBackupName(ctx, apiClient, model.ProjectId, model.Region, model.BackupId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get backup name: %v", err) } @@ -118,7 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateBackupRequest { - req := apiClient.UpdateBackup(ctx, model.ProjectId, model.BackupId) + req := apiClient.UpdateBackup(ctx, model.ProjectId, model.Region, model.BackupId) payload := iaas.UpdateBackupPayload{ Name: model.Name, diff --git a/internal/cmd/volume/backup/update/update_test.go b/internal/cmd/volume/backup/update/update_test.go index 85faf0764..94860245a 100644 --- a/internal/cmd/volume/backup/update/update_test.go +++ b/internal/cmd/volume/backup/update/update_test.go @@ -14,6 +14,11 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" + testName = "test-backup" +) + type testCtxKey struct{} var ( @@ -21,7 +26,6 @@ var ( testClient = &iaas.APIClient{} testProjectId = uuid.NewString() testBackupId = uuid.NewString() - testName = "test-backup" testLabels = map[string]string{"key1": "value1"} ) @@ -38,8 +42,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - nameFlag: testName, - labelsFlag: "key1=value1", + globalflags.RegionFlag: testRegion, + + nameFlag: testName, + labelsFlag: "key1=value1", } for _, mod := range mods { mod(flagValues) @@ -52,9 +58,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, BackupId: testBackupId, - Name: &testName, + Name: utils.Ptr(testName), Labels: testLabels, } for _, mod := range mods { @@ -64,9 +71,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateBackupRequest)) iaas.ApiUpdateBackupRequest { - request := testClient.UpdateBackup(testCtx, testProjectId, testBackupId) + request := testClient.UpdateBackup(testCtx, testProjectId, testRegion, testBackupId) payload := iaas.NewUpdateBackupPayloadWithDefaults() - payload.Name = &testName + payload.Name = utils.Ptr(testName) payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(testLabels)) diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index f5024261a..a9b624c67 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -107,7 +107,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating volume") - _, err = wait.CreateVolumeWaitHandler(ctx, apiClient, model.ProjectId, volumeId).WaitWithContext(ctx) + _, err = wait.CreateVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, volumeId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for volume creation: %w", err) } @@ -158,7 +158,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateVolumeRequest { - req := apiClient.CreateVolume(ctx, model.ProjectId) + req := apiClient.CreateVolume(ctx, model.ProjectId, model.Region) source := &iaas.VolumeSource{ Id: model.SourceId, Type: model.SourceType, diff --git a/internal/cmd/volume/create/create_test.go b/internal/cmd/volume/create/create_test.go index 35f163e21..dde4f7893 100644 --- a/internal/cmd/volume/create/create_test.go +++ b/internal/cmd/volume/create/create_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -27,7 +29,9 @@ var testSourceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + availabilityZoneFlag: "eu01-1", nameFlag: "example-volume-name", descriptionFlag: "example-volume-description", @@ -48,6 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, AvailabilityZone: utils.Ptr("eu01-1"), Name: utils.Ptr("example-volume-name"), @@ -67,7 +72,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateVolumeRequest)) iaas.ApiCreateVolumeRequest { - request := testClient.CreateVolume(testCtx, testProjectId) + request := testClient.CreateVolume(testCtx, testProjectId, testRegion) request = request.CreateVolumePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -76,7 +81,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateVolumeRequest)) iaas.Api } func fixtureRequiredRequest(mods ...func(request *iaas.ApiCreateVolumeRequest)) iaas.ApiCreateVolumeRequest { - request := testClient.CreateVolume(testCtx, testProjectId) + request := testClient.CreateVolume(testCtx, testProjectId, testRegion) request = request.CreateVolumePayload(iaas.CreateVolumePayload{ AvailabilityZone: utils.Ptr("eu01-1"), }) @@ -158,21 +163,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -226,6 +231,7 @@ func TestBuildRequest(t *testing.T) { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, AvailabilityZone: utils.Ptr("eu01-1"), }, diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index 1c94e3dc2..58d47c8ae 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -57,7 +57,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId @@ -82,7 +82,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting volume") - _, err = wait.DeleteVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.VolumeId).WaitWithContext(ctx) + _, err = wait.DeleteVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for volume deletion: %w", err) } @@ -118,5 +118,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteVolumeRequest { - return apiClient.DeleteVolume(ctx, model.ProjectId, model.VolumeId) + return apiClient.DeleteVolume(ctx, model.ProjectId, model.Region, model.VolumeId) } diff --git a/internal/cmd/volume/delete/delete_test.go b/internal/cmd/volume/delete/delete_test.go index db5545312..42d63db2b 100644 --- a/internal/cmd/volume/delete/delete_test.go +++ b/internal/cmd/volume/delete/delete_test.go @@ -13,7 +13,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -34,7 +36,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -47,6 +50,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, VolumeId: testVolumeId, } @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteVolumeRequest)) iaas.ApiDeleteVolumeRequest { - request := testClient.DeleteVolume(testCtx, testProjectId, testVolumeId) + request := testClient.DeleteVolume(testCtx, testProjectId, testRegion, testVolumeId) for _, mod := range mods { mod(&request) } @@ -101,7 +105,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +113,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +121,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index 19e536d7b..0683ae255 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -88,7 +88,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetVolumeRequest { - return apiClient.GetVolume(ctx, model.ProjectId, model.VolumeId) + return apiClient.GetVolume(ctx, model.ProjectId, model.Region, model.VolumeId) } func outputResult(p *print.Printer, outputFormat string, volume *iaas.Volume) error { diff --git a/internal/cmd/volume/describe/describe_test.go b/internal/cmd/volume/describe/describe_test.go index 1c4e2b907..9396645d4 100644 --- a/internal/cmd/volume/describe/describe_test.go +++ b/internal/cmd/volume/describe/describe_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -35,7 +37,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -48,6 +51,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, Verbosity: globalflags.VerbosityDefault, + Region: testRegion, }, VolumeId: testVolumeId, } @@ -58,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetVolumeRequest)) iaas.ApiGetVolumeRequest { - request := testClient.GetVolume(testCtx, testProjectId, testVolumeId) + request := testClient.GetVolume(testCtx, testProjectId, testRegion, testVolumeId) for _, mod := range mods { mod(&request) } @@ -102,7 +106,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +114,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +122,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index d1c7b884f..586f8b721 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -127,7 +127,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListVolumesRequest { - req := apiClient.ListVolumes(ctx, model.ProjectId) + req := apiClient.ListVolumes(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/volume/list/list_test.go b/internal/cmd/volume/list/list_test.go index cb54d2e1f..4fdeab7b2 100644 --- a/internal/cmd/volume/list/list_test.go +++ b/internal/cmd/volume/list/list_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -26,7 +28,9 @@ var testLabelSelector = "label" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", labelSelectorFlag: testLabelSelector, } @@ -41,6 +45,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), @@ -52,7 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListVolumesRequest)) iaas.ApiListVolumesRequest { - request := testClient.ListVolumes(testCtx, testProjectId) + request := testClient.ListVolumes(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabelSelector) for _, mod := range mods { mod(&request) @@ -87,21 +92,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index 24a158239..324609ada 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -88,7 +88,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetVolumePerformanceClassRequest { - return apiClient.GetVolumePerformanceClass(ctx, model.ProjectId, model.VolumePerformanceClass) + return apiClient.GetVolumePerformanceClass(ctx, model.ProjectId, model.Region, model.VolumePerformanceClass) } func outputResult(p *print.Printer, outputFormat string, performanceClass *iaas.VolumePerformanceClass) error { diff --git a/internal/cmd/volume/performance-class/describe/describe_test.go b/internal/cmd/volume/performance-class/describe/describe_test.go index 737335164..269dae052 100644 --- a/internal/cmd/volume/performance-class/describe/describe_test.go +++ b/internal/cmd/volume/performance-class/describe/describe_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,7 +38,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -48,6 +51,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, VolumePerformanceClass: testVolumePerformanceClass, @@ -59,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetVolumePerformanceClassRequest)) iaas.ApiGetVolumePerformanceClassRequest { - request := testClient.GetVolumePerformanceClass(testCtx, testProjectId, testVolumePerformanceClass) + request := testClient.GetVolumePerformanceClass(testCtx, testProjectId, testRegion, testVolumePerformanceClass) for _, mod := range mods { mod(&request) } @@ -103,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -111,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -119,7 +123,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index 0c8a5de64..46ef6574b 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -128,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListVolumePerformanceClassesRequest { - req := apiClient.ListVolumePerformanceClasses(ctx, model.ProjectId) + req := apiClient.ListVolumePerformanceClasses(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/volume/performance-class/list/list_test.go b/internal/cmd/volume/performance-class/list/list_test.go index 4a36b5333..7bbd048f0 100644 --- a/internal/cmd/volume/performance-class/list/list_test.go +++ b/internal/cmd/volume/performance-class/list/list_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -26,7 +28,9 @@ var testLabelSelector = "label" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", labelSelectorFlag: testLabelSelector, } @@ -41,6 +45,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { GlobalFlagModel: &globalflags.GlobalFlagModel{ Verbosity: globalflags.VerbosityDefault, ProjectId: testProjectId, + Region: testRegion, }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), @@ -52,7 +57,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiListVolumePerformanceClassesRequest)) iaas.ApiListVolumePerformanceClassesRequest { - request := testClient.ListVolumePerformanceClasses(testCtx, testProjectId) + request := testClient.ListVolumePerformanceClasses(testCtx, testProjectId, testRegion) request = request.LabelSelector(testLabelSelector) for _, mod := range mods { mod(&request) @@ -87,21 +92,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index 4d1a0d03a..58be4800d 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -56,7 +56,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId @@ -111,7 +111,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiResizeVolumeRequest { - req := apiClient.ResizeVolume(ctx, model.ProjectId, model.VolumeId) + req := apiClient.ResizeVolume(ctx, model.ProjectId, model.Region, model.VolumeId) payload := iaas.ResizeVolumePayload{ Size: model.Size, diff --git a/internal/cmd/volume/resize/resize_test.go b/internal/cmd/volume/resize/resize_test.go index 54d02a47f..094cb7864 100644 --- a/internal/cmd/volume/resize/resize_test.go +++ b/internal/cmd/volume/resize/resize_test.go @@ -15,7 +15,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -37,8 +39,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - sizeFlag: "10", - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + sizeFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -50,6 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Size: utils.Ptr(int64(10)), @@ -62,7 +67,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiResizeVolumeRequest)) iaas.ApiResizeVolumeRequest { - request := testClient.ResizeVolume(testCtx, testProjectId, testVolumeId) + request := testClient.ResizeVolume(testCtx, testProjectId, testRegion, testVolumeId) request = request.ResizeVolumePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -105,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +118,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +126,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index 1146ccaba..a49b89da4 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -72,7 +72,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Get volume name for label - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeID) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeID) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeID @@ -97,7 +97,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating snapshot") - resp, err = wait.CreateSnapshotWaitHandler(ctx, apiClient, model.ProjectId, *resp.Id).WaitWithContext(ctx) + resp, err = wait.CreateSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Id).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for snapshot creation: %w", err) } @@ -152,7 +152,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiCreateSnapshotRequest { - req := apiClient.CreateSnapshot(ctx, model.ProjectId) + req := apiClient.CreateSnapshot(ctx, model.ProjectId, model.Region) payload := iaas.NewCreateSnapshotPayloadWithDefaults() payload.VolumeId = &model.VolumeID payload.Name = model.Name diff --git a/internal/cmd/volume/snapshot/create/create_test.go b/internal/cmd/volume/snapshot/create/create_test.go index 00111c28f..d2ee79608 100644 --- a/internal/cmd/volume/snapshot/create/create_test.go +++ b/internal/cmd/volume/snapshot/create/create_test.go @@ -16,7 +16,8 @@ import ( type testCtxKey struct{} const ( - testName = "test-snapshot" + testRegion = "eu01" + testName = "test-snapshot" ) var ( @@ -30,9 +31,11 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - volumeIdFlag: testVolumeId, - nameFlag: testName, - labelsFlag: "key1=value1", + globalflags.RegionFlag: testRegion, + + volumeIdFlag: testVolumeId, + nameFlag: testName, + labelsFlag: "key1=value1", } for _, mod := range mods { mod(flagValues) @@ -44,6 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, VolumeID: testVolumeId, @@ -57,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiCreateSnapshotRequest)) iaas.ApiCreateSnapshotRequest { - request := testClient.CreateSnapshot(testCtx, testProjectId) + request := testClient.CreateSnapshot(testCtx, testProjectId, testRegion) payload := iaas.NewCreateSnapshotPayloadWithDefaults() payload.VolumeId = &testVolumeId payload.Name = utils.Ptr(testName) diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go index 11c4d1f1d..a94ef6bf1 100644 --- a/internal/cmd/volume/snapshot/delete/delete.go +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -54,7 +54,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Get snapshot name for label - snapshotLabel, err := iaasUtils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.SnapshotId) + snapshotLabel, err := iaasUtils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.Region, model.SnapshotId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) snapshotLabel = model.SnapshotId @@ -79,7 +79,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting snapshot") - _, err = wait.DeleteSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.SnapshotId).WaitWithContext(ctx) + _, err = wait.DeleteSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.SnapshotId).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for snapshot deletion: %w", err) } @@ -115,5 +115,5 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiDeleteSnapshotRequest { - return apiClient.DeleteSnapshot(ctx, model.ProjectId, model.SnapshotId) + return apiClient.DeleteSnapshot(ctx, model.ProjectId, model.Region, model.SnapshotId) } diff --git a/internal/cmd/volume/snapshot/delete/delete_test.go b/internal/cmd/volume/snapshot/delete/delete_test.go index f97165703..6ffa3d880 100644 --- a/internal/cmd/volume/snapshot/delete/delete_test.go +++ b/internal/cmd/volume/snapshot/delete/delete_test.go @@ -13,6 +13,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -35,6 +39,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -46,6 +51,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, SnapshotId: testSnapshotId, @@ -57,7 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiDeleteSnapshotRequest)) iaas.ApiDeleteSnapshotRequest { - request := testClient.DeleteSnapshot(testCtx, testProjectId, testSnapshotId) + request := testClient.DeleteSnapshot(testCtx, testProjectId, testRegion, testSnapshotId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/volume/snapshot/describe/describe.go b/internal/cmd/volume/snapshot/describe/describe.go index bf78cb603..17ed41c88 100644 --- a/internal/cmd/volume/snapshot/describe/describe.go +++ b/internal/cmd/volume/snapshot/describe/describe.go @@ -86,7 +86,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiGetSnapshotRequest { - return apiClient.GetSnapshot(ctx, model.ProjectId, model.SnapshotId) + return apiClient.GetSnapshot(ctx, model.ProjectId, model.Region, model.SnapshotId) } func outputResult(p *print.Printer, outputFormat string, snapshot *iaas.Snapshot) error { diff --git a/internal/cmd/volume/snapshot/describe/describe_test.go b/internal/cmd/volume/snapshot/describe/describe_test.go index 7da9d09a4..ff1e25aec 100644 --- a/internal/cmd/volume/snapshot/describe/describe_test.go +++ b/internal/cmd/volume/snapshot/describe/describe_test.go @@ -16,6 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -38,6 +42,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, } for _, mod := range mods { mod(flagValues) @@ -49,6 +54,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, SnapshotId: testSnapshotId, @@ -60,7 +66,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiGetSnapshotRequest)) iaas.ApiGetSnapshotRequest { - request := testClient.GetSnapshot(testCtx, testProjectId, testSnapshotId) + request := testClient.GetSnapshot(testCtx, testProjectId, testRegion, testSnapshotId) for _, mod := range mods { mod(&request) } diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go index 2ef8c9d4d..ce8052287 100644 --- a/internal/cmd/volume/snapshot/list/list.go +++ b/internal/cmd/volume/snapshot/list/list.go @@ -126,8 +126,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListSnapshotsRequest { - req := apiClient.ListSnapshots(ctx, model.ProjectId) +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListSnapshotsInProjectRequest { + req := apiClient.ListSnapshotsInProject(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } diff --git a/internal/cmd/volume/snapshot/list/list_test.go b/internal/cmd/volume/snapshot/list/list_test.go index c9facab11..5e9c8b0c8 100644 --- a/internal/cmd/volume/snapshot/list/list_test.go +++ b/internal/cmd/volume/snapshot/list/list_test.go @@ -16,6 +16,10 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" +) + type testCtxKey struct{} var ( @@ -27,8 +31,10 @@ var ( func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - limitFlag: "10", - labelSelectorFlag: "key1=value1", + globalflags.RegionFlag: testRegion, + + limitFlag: "10", + labelSelectorFlag: "key1=value1", } for _, mod := range mods { mod(flagValues) @@ -40,6 +46,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Limit: utils.Ptr(int64(10)), @@ -51,8 +58,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { return model } -func fixtureRequest(mods ...func(request *iaas.ApiListSnapshotsRequest)) iaas.ApiListSnapshotsRequest { - request := testClient.ListSnapshots(testCtx, testProjectId) +func fixtureRequest(mods ...func(request *iaas.ApiListSnapshotsInProjectRequest)) iaas.ApiListSnapshotsInProjectRequest { + request := testClient.ListSnapshotsInProject(testCtx, testProjectId, testRegion) request = request.LabelSelector("key1=value1") for _, mod := range mods { mod(&request) @@ -139,7 +146,7 @@ func TestBuildRequest(t *testing.T) { tests := []struct { description string model *inputModel - expectedRequest iaas.ApiListSnapshotsRequest + expectedRequest iaas.ApiListSnapshotsInProjectRequest }{ { description: "base", @@ -151,8 +158,8 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel(func(model *inputModel) { model.LabelSelector = nil }), - expectedRequest: fixtureRequest(func(request *iaas.ApiListSnapshotsRequest) { - *request = testClient.ListSnapshots(testCtx, testProjectId) + expectedRequest: fixtureRequest(func(request *iaas.ApiListSnapshotsInProjectRequest) { + *request = testClient.ListSnapshotsInProject(testCtx, testProjectId, testRegion) }), }, } diff --git a/internal/cmd/volume/snapshot/update/update.go b/internal/cmd/volume/snapshot/update/update.go index 889b2cae4..766c33b34 100644 --- a/internal/cmd/volume/snapshot/update/update.go +++ b/internal/cmd/volume/snapshot/update/update.go @@ -60,7 +60,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } // Get snapshot name for label - snapshotLabel, err := iaasUtils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.SnapshotId) + snapshotLabel, err := iaasUtils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.Region, model.SnapshotId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) snapshotLabel = model.SnapshotId @@ -125,7 +125,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateSnapshotRequest { - req := apiClient.UpdateSnapshot(ctx, model.ProjectId, model.SnapshotId) + req := apiClient.UpdateSnapshot(ctx, model.ProjectId, model.Region, model.SnapshotId) payload := iaas.NewUpdateSnapshotPayloadWithDefaults() payload.Name = model.Name payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(model.Labels)) diff --git a/internal/cmd/volume/snapshot/update/update_test.go b/internal/cmd/volume/snapshot/update/update_test.go index b96da76f1..d5e159315 100644 --- a/internal/cmd/volume/snapshot/update/update_test.go +++ b/internal/cmd/volume/snapshot/update/update_test.go @@ -14,6 +14,11 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +const ( + testRegion = "eu01" + testName = "test-snapshot" +) + type testCtxKey struct{} var ( @@ -21,7 +26,6 @@ var ( testClient = &iaas.APIClient{} testProjectId = uuid.NewString() testSnapshotId = uuid.NewString() - testName = "test-snapshot" testLabels = map[string]string{"key1": "value1"} ) @@ -38,8 +42,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, - nameFlag: testName, - labelsFlag: "key1=value1", + globalflags.RegionFlag: testRegion, + + nameFlag: testName, + labelsFlag: "key1=value1", } for _, mod := range mods { mod(flagValues) @@ -51,10 +57,11 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, SnapshotId: testSnapshotId, - Name: &testName, + Name: utils.Ptr(testName), Labels: testLabels, } for _, mod := range mods { @@ -64,9 +71,9 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateSnapshotRequest)) iaas.ApiUpdateSnapshotRequest { - request := testClient.UpdateSnapshot(testCtx, testProjectId, testSnapshotId) + request := testClient.UpdateSnapshot(testCtx, testProjectId, testRegion, testSnapshotId) payload := iaas.NewUpdateSnapshotPayloadWithDefaults() - payload.Name = &testName + payload.Name = utils.Ptr(testName) payload.Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(testLabels)) request = request.UpdateSnapshotPayload(*payload) diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 0af92ab77..55e2e2a70 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -67,7 +67,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return err } - volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.VolumeId) + volumeLabel, err := iaasUtils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) volumeLabel = model.VolumeId @@ -122,7 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateVolumeRequest { - req := apiClient.UpdateVolume(ctx, model.ProjectId, model.VolumeId) + req := apiClient.UpdateVolume(ctx, model.ProjectId, model.Region, model.VolumeId) payload := iaas.UpdateVolumePayload{ Name: model.Name, diff --git a/internal/cmd/volume/update/update_test.go b/internal/cmd/volume/update/update_test.go index 1628bf26a..6b890a82c 100644 --- a/internal/cmd/volume/update/update_test.go +++ b/internal/cmd/volume/update/update_test.go @@ -14,7 +14,9 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) -var projectIdFlag = globalflags.ProjectIdFlag +const ( + testRegion = "eu01" +) type testCtxKey struct{} @@ -36,8 +38,10 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + nameFlag: "example-volume-name", - projectIdFlag: testProjectId, descriptionFlag: "example-volume-desc", labelFlag: "key=value", } @@ -51,6 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ ProjectId: testProjectId, + Region: testRegion, Verbosity: globalflags.VerbosityDefault, }, Name: utils.Ptr("example-volume-name"), @@ -67,7 +72,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *iaas.ApiUpdateVolumeRequest)) iaas.ApiUpdateVolumeRequest { - request := testClient.UpdateVolume(testCtx, testProjectId, testVolumeId) + request := testClient.UpdateVolume(testCtx, testProjectId, testRegion, testVolumeId) request = request.UpdateVolumePayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -114,7 +119,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -122,7 +127,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -130,7 +135,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/pkg/errors/errors.go b/internal/pkg/errors/errors.go index 9c83fb4f1..814929497 100644 --- a/internal/pkg/errors/errors.go +++ b/internal/pkg/errors/errors.go @@ -18,6 +18,16 @@ You can configure it for all commands by running: or you can also set it through the environment variable [STACKIT_PROJECT_ID]` + MISSING_REGION = `the region is not currently set. + +It can be set on the command level by re-running your command with the --region flag. + +You can configure it for all commands by running: + + $ stackit config set --region xxx + +or you can also set it through the environment variable [STACKIT_REGION]` + EMPTY_UPDATE = `please specify at least one field to update. Get details on the available flags by re-running your command with the --help flag.` @@ -178,6 +188,12 @@ To list all profiles, run: $ stackit config profile list` FILE_ALREADY_EXISTS = `file %q already exists in the export path. Delete the existing file or define a different export path` + + FLAG_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET = `The flag %[1]q must be provided when %[2]q is set` + + MULTIPLE_FLAGS_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET = `The flags %[1]v must be provided when one of the flags %[2]v is set` + + ONE_OF_THE_FLAGS_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET = `One of the flags %[1]v must be provided when %[2]q is set` ) type ServerNicAttachMissingNicIdError struct { @@ -234,6 +250,12 @@ func (e *ProjectIdError) Error() string { return MISSING_PROJECT_ID } +type RegionError struct{} + +func (e *RegionError) Error() string { + return MISSING_REGION +} + type EmptyUpdateError struct{} func (e *EmptyUpdateError) Error() string { @@ -499,3 +521,30 @@ type FileAlreadyExistsError struct { } func (e *FileAlreadyExistsError) Error() string { return fmt.Sprintf(FILE_ALREADY_EXISTS, e.Filename) } + +type DependingFlagIsMissing struct { + MissingFlag string + SetFlag string +} + +func (e *DependingFlagIsMissing) Error() string { + return fmt.Sprintf(FLAG_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET, fmt.Sprintf("--%s", e.MissingFlag), fmt.Sprintf("--%s", e.SetFlag)) +} + +type MultipleFlagsAreMissing struct { + MissingFlags []string + SetFlags []string +} + +func (e *MultipleFlagsAreMissing) Error() string { + return fmt.Sprintf(MULTIPLE_FLAGS_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET, e.MissingFlags, e.SetFlags) +} + +type OneOfFlagsIsMissing struct { + MissingFlags []string + SetFlag string +} + +func (e *OneOfFlagsIsMissing) Error() string { + return fmt.Sprintf(ONE_OF_THE_FLAGS_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET, e.MissingFlags, e.SetFlag) +} diff --git a/internal/pkg/services/iaas/client/client.go b/internal/pkg/services/iaas/client/client.go index c9401016a..a49f04b7c 100644 --- a/internal/pkg/services/iaas/client/client.go +++ b/internal/pkg/services/iaas/client/client.go @@ -10,5 +10,5 @@ import ( ) func ConfigureClient(p *print.Printer, cliVersion string) (*iaas.APIClient, error) { - return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.IaaSCustomEndpointKey), true, genericclient.CreateApiClient[*iaas.APIClient](iaas.NewAPIClient)) + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.IaaSCustomEndpointKey), false, genericclient.CreateApiClient[*iaas.APIClient](iaas.NewAPIClient)) } diff --git a/internal/pkg/services/iaas/utils/utils.go b/internal/pkg/services/iaas/utils/utils.go index 2cf460334..b7973c265 100644 --- a/internal/pkg/services/iaas/utils/utils.go +++ b/internal/pkg/services/iaas/utils/utils.go @@ -15,23 +15,23 @@ var ( ) type IaaSClient interface { - GetSecurityGroupRuleExecute(ctx context.Context, projectId, securityGroupRuleId, securityGroupId string) (*iaas.SecurityGroupRule, error) - GetSecurityGroupExecute(ctx context.Context, projectId, securityGroupId string) (*iaas.SecurityGroup, error) - GetPublicIPExecute(ctx context.Context, projectId, publicIpId string) (*iaas.PublicIp, error) - GetServerExecute(ctx context.Context, projectId, serverId string) (*iaas.Server, error) - GetVolumeExecute(ctx context.Context, projectId, volumeId string) (*iaas.Volume, error) - GetNetworkExecute(ctx context.Context, projectId, networkId string) (*iaas.Network, error) + GetSecurityGroupRuleExecute(ctx context.Context, projectId, region, securityGroupRuleId, securityGroupId string) (*iaas.SecurityGroupRule, error) + GetSecurityGroupExecute(ctx context.Context, projectId, region, securityGroupId string) (*iaas.SecurityGroup, error) + GetPublicIPExecute(ctx context.Context, projectId, region, publicIpId string) (*iaas.PublicIp, error) + GetServerExecute(ctx context.Context, projectId, region, serverId string) (*iaas.Server, error) + GetVolumeExecute(ctx context.Context, projectId, region, volumeId string) (*iaas.Volume, error) + GetNetworkExecute(ctx context.Context, projectId, region, networkId string) (*iaas.Network, error) GetNetworkAreaExecute(ctx context.Context, organizationId, areaId string) (*iaas.NetworkArea, error) ListNetworkAreaProjectsExecute(ctx context.Context, organizationId, areaId string) (*iaas.ProjectListResponse, error) - GetNetworkAreaRangeExecute(ctx context.Context, organizationId, areaId, networkRangeId string) (*iaas.NetworkRange, error) - GetImageExecute(ctx context.Context, projectId string, imageId string) (*iaas.Image, error) - GetAffinityGroupExecute(ctx context.Context, projectId string, affinityGroupId string) (*iaas.AffinityGroup, error) - GetSnapshotExecute(ctx context.Context, projectId, snapshotId string) (*iaas.Snapshot, error) - GetBackupExecute(ctx context.Context, projectId, backupId string) (*iaas.Backup, error) + GetNetworkAreaRangeExecute(ctx context.Context, organizationId, areaId, region, networkRangeId string) (*iaas.NetworkRange, error) + GetImageExecute(ctx context.Context, projectId, region, imageId string) (*iaas.Image, error) + GetAffinityGroupExecute(ctx context.Context, projectId, region, affinityGroupId string) (*iaas.AffinityGroup, error) + GetSnapshotExecute(ctx context.Context, projectId, region, snapshotId string) (*iaas.Snapshot, error) + GetBackupExecute(ctx context.Context, projectId, region, backupId string) (*iaas.Backup, error) } -func GetSecurityGroupRuleName(ctx context.Context, apiClient IaaSClient, projectId, securityGroupRuleId, securityGroupId string) (string, error) { - resp, err := apiClient.GetSecurityGroupRuleExecute(ctx, projectId, securityGroupRuleId, securityGroupId) +func GetSecurityGroupRuleName(ctx context.Context, apiClient IaaSClient, projectId, region, securityGroupRuleId, securityGroupId string) (string, error) { + resp, err := apiClient.GetSecurityGroupRuleExecute(ctx, projectId, region, securityGroupRuleId, securityGroupId) if err != nil { return "", fmt.Errorf("get security group rule: %w", err) } @@ -39,8 +39,8 @@ func GetSecurityGroupRuleName(ctx context.Context, apiClient IaaSClient, project return securityGroupRuleName, nil } -func GetSecurityGroupName(ctx context.Context, apiClient IaaSClient, projectId, securityGroupId string) (string, error) { - resp, err := apiClient.GetSecurityGroupExecute(ctx, projectId, securityGroupId) +func GetSecurityGroupName(ctx context.Context, apiClient IaaSClient, projectId, region, securityGroupId string) (string, error) { + resp, err := apiClient.GetSecurityGroupExecute(ctx, projectId, region, securityGroupId) if err != nil { return "", fmt.Errorf("get security group: %w", err) } else if resp == nil { @@ -51,8 +51,8 @@ func GetSecurityGroupName(ctx context.Context, apiClient IaaSClient, projectId, return *resp.Name, nil } -func GetPublicIP(ctx context.Context, apiClient IaaSClient, projectId, publicIpId string) (ip, associatedResource string, err error) { - resp, err := apiClient.GetPublicIPExecute(ctx, projectId, publicIpId) +func GetPublicIP(ctx context.Context, apiClient IaaSClient, projectId, region, publicIpId string) (ip, associatedResource string, err error) { + resp, err := apiClient.GetPublicIPExecute(ctx, projectId, region, publicIpId) if err != nil { return "", "", fmt.Errorf("get public ip: %w", err) } @@ -63,16 +63,16 @@ func GetPublicIP(ctx context.Context, apiClient IaaSClient, projectId, publicIpI return *resp.Ip, associatedResourceId, nil } -func GetServerName(ctx context.Context, apiClient IaaSClient, projectId, serverId string) (string, error) { - resp, err := apiClient.GetServerExecute(ctx, projectId, serverId) +func GetServerName(ctx context.Context, apiClient IaaSClient, projectId, region, serverId string) (string, error) { + resp, err := apiClient.GetServerExecute(ctx, projectId, region, serverId) if err != nil { return "", fmt.Errorf("get server: %w", err) } return *resp.Name, nil } -func GetVolumeName(ctx context.Context, apiClient IaaSClient, projectId, volumeId string) (string, error) { - resp, err := apiClient.GetVolumeExecute(ctx, projectId, volumeId) +func GetVolumeName(ctx context.Context, apiClient IaaSClient, projectId, region, volumeId string) (string, error) { + resp, err := apiClient.GetVolumeExecute(ctx, projectId, region, volumeId) if err != nil { return "", fmt.Errorf("get volume: %w", err) } else if resp == nil { @@ -83,8 +83,8 @@ func GetVolumeName(ctx context.Context, apiClient IaaSClient, projectId, volumeI return *resp.Name, nil } -func GetNetworkName(ctx context.Context, apiClient IaaSClient, projectId, networkId string) (string, error) { - resp, err := apiClient.GetNetworkExecute(ctx, projectId, networkId) +func GetNetworkName(ctx context.Context, apiClient IaaSClient, projectId, region, networkId string) (string, error) { + resp, err := apiClient.GetNetworkExecute(ctx, projectId, region, networkId) if err != nil { return "", fmt.Errorf("get network: %w", err) } else if resp == nil { @@ -119,8 +119,8 @@ func ListAttachedProjects(ctx context.Context, apiClient IaaSClient, organizatio return *resp.Items, nil } -func GetNetworkRangePrefix(ctx context.Context, apiClient IaaSClient, organizationId, areaId, networkRangeId string) (string, error) { - resp, err := apiClient.GetNetworkAreaRangeExecute(ctx, organizationId, areaId, networkRangeId) +func GetNetworkRangePrefix(ctx context.Context, apiClient IaaSClient, organizationId, areaId, region, networkRangeId string) (string, error) { + resp, err := apiClient.GetNetworkAreaRangeExecute(ctx, organizationId, areaId, region, networkRangeId) if err != nil { return "", fmt.Errorf("get network range: %w", err) } @@ -129,10 +129,47 @@ func GetNetworkRangePrefix(ctx context.Context, apiClient IaaSClient, organizati // GetRouteFromAPIResponse returns the static route from the API response that matches the prefix and nexthop // This works because static routes are unique by prefix and nexthop -func GetRouteFromAPIResponse(prefix, nexthop string, routes *[]iaas.Route) (iaas.Route, error) { +func GetRouteFromAPIResponse(destination, nexthop string, routes *[]iaas.Route) (iaas.Route, error) { for _, route := range *routes { - if *route.Prefix == prefix && *route.Nexthop == nexthop { - return route, nil + // Check if destination matches + if dest := route.Destination; dest != nil { + match := false + if destV4 := dest.DestinationCIDRv4; destV4 != nil { + if destV4.Value != nil && *destV4.Value == destination { + match = true + } + } else if destV6 := dest.DestinationCIDRv6; destV6 != nil { + if destV6.Value != nil && *destV6.Value == destination { + match = true + } + } + if !match { + continue + } + } + // Check if nexthop matches + if routeNexthop := route.Nexthop; routeNexthop != nil { + match := false + if nexthopIPv4 := routeNexthop.NexthopIPv4; nexthopIPv4 != nil { + if nexthopIPv4.Value != nil && *nexthopIPv4.Value == nexthop { + match = true + } + } else if nexthopIPv6 := routeNexthop.NexthopIPv6; nexthopIPv6 != nil { + if nexthopIPv6.Value != nil && *nexthopIPv6.Value == nexthop { + match = true + } + } else if nexthopInternet := routeNexthop.NexthopInternet; nexthopInternet != nil { + if nexthopInternet.Type != nil && *nexthopInternet.Type == nexthop { + match = true + } + } else if nexthopBlackhole := routeNexthop.NexthopBlackhole; nexthopBlackhole != nil { + if nexthopBlackhole.Type != nil && *nexthopBlackhole.Type == nexthop { + match = true + } + } + if match { + return route, nil + } } } return iaas.Route{}, fmt.Errorf("new static route not found in API response") @@ -149,8 +186,8 @@ func GetNetworkRangeFromAPIResponse(prefix string, networkRanges *[]iaas.Network return iaas.NetworkRange{}, fmt.Errorf("new network range not found in API response") } -func GetImageName(ctx context.Context, apiClient IaaSClient, projectId, imageId string) (string, error) { - resp, err := apiClient.GetImageExecute(ctx, projectId, imageId) +func GetImageName(ctx context.Context, apiClient IaaSClient, projectId, region, imageId string) (string, error) { + resp, err := apiClient.GetImageExecute(ctx, projectId, region, imageId) if err != nil { return "", fmt.Errorf("get image: %w", err) } else if resp == nil { @@ -161,8 +198,8 @@ func GetImageName(ctx context.Context, apiClient IaaSClient, projectId, imageId return *resp.Name, nil } -func GetAffinityGroupName(ctx context.Context, apiClient IaaSClient, projectId, affinityGroupId string) (string, error) { - resp, err := apiClient.GetAffinityGroupExecute(ctx, projectId, affinityGroupId) +func GetAffinityGroupName(ctx context.Context, apiClient IaaSClient, projectId, region, affinityGroupId string) (string, error) { + resp, err := apiClient.GetAffinityGroupExecute(ctx, projectId, region, affinityGroupId) if err != nil { return "", fmt.Errorf("get affinity group: %w", err) } else if resp == nil { @@ -173,8 +210,8 @@ func GetAffinityGroupName(ctx context.Context, apiClient IaaSClient, projectId, return *resp.Name, nil } -func GetSnapshotName(ctx context.Context, apiClient IaaSClient, projectId, snapshotId string) (string, error) { - resp, err := apiClient.GetSnapshotExecute(ctx, projectId, snapshotId) +func GetSnapshotName(ctx context.Context, apiClient IaaSClient, projectId, region, snapshotId string) (string, error) { + resp, err := apiClient.GetSnapshotExecute(ctx, projectId, region, snapshotId) if err != nil { return "", fmt.Errorf("get snapshot: %w", err) } else if resp == nil { @@ -185,8 +222,8 @@ func GetSnapshotName(ctx context.Context, apiClient IaaSClient, projectId, snaps return *resp.Name, nil } -func GetBackupName(ctx context.Context, apiClient IaaSClient, projectId, backupId string) (string, error) { - resp, err := apiClient.GetBackupExecute(ctx, projectId, backupId) +func GetBackupName(ctx context.Context, apiClient IaaSClient, projectId, region, backupId string) (string, error) { + resp, err := apiClient.GetBackupExecute(ctx, projectId, region, backupId) if err != nil { return backupId, fmt.Errorf("get backup: %w", err) } diff --git a/internal/pkg/services/iaas/utils/utils_test.go b/internal/pkg/services/iaas/utils/utils_test.go index e2ccdc469..a8f530533 100644 --- a/internal/pkg/services/iaas/utils/utils_test.go +++ b/internal/pkg/services/iaas/utils/utils_test.go @@ -10,6 +10,8 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) +var _ IaaSClient = &IaaSClientMocked{} + type IaaSClientMocked struct { GetSecurityGroupRuleFails bool GetSecurityGroupRuleResp *iaas.SecurityGroupRule @@ -39,49 +41,49 @@ type IaaSClientMocked struct { GetSnapshotResp *iaas.Snapshot } -func (m *IaaSClientMocked) GetAffinityGroupExecute(_ context.Context, _, _ string) (*iaas.AffinityGroup, error) { +func (m *IaaSClientMocked) GetAffinityGroupExecute(_ context.Context, _, _, _ string) (*iaas.AffinityGroup, error) { if m.GetAffinityGroupsFails { return nil, fmt.Errorf("could not get affinity groups") } return m.GetAffinityGroupResp, nil } -func (m *IaaSClientMocked) GetSecurityGroupRuleExecute(_ context.Context, _, _, _ string) (*iaas.SecurityGroupRule, error) { +func (m *IaaSClientMocked) GetSecurityGroupRuleExecute(_ context.Context, _, _, _, _ string) (*iaas.SecurityGroupRule, error) { if m.GetSecurityGroupRuleFails { return nil, fmt.Errorf("could not get security group rule") } return m.GetSecurityGroupRuleResp, nil } -func (m *IaaSClientMocked) GetSecurityGroupExecute(_ context.Context, _, _ string) (*iaas.SecurityGroup, error) { +func (m *IaaSClientMocked) GetSecurityGroupExecute(_ context.Context, _, _, _ string) (*iaas.SecurityGroup, error) { if m.GetSecurityGroupFails { return nil, fmt.Errorf("could not get security group") } return m.GetSecurityGroupResp, nil } -func (m *IaaSClientMocked) GetPublicIPExecute(_ context.Context, _, _ string) (*iaas.PublicIp, error) { +func (m *IaaSClientMocked) GetPublicIPExecute(_ context.Context, _, _, _ string) (*iaas.PublicIp, error) { if m.GetPublicIpFails { return nil, fmt.Errorf("could not get public ip") } return m.GetPublicIpResp, nil } -func (m *IaaSClientMocked) GetServerExecute(_ context.Context, _, _ string) (*iaas.Server, error) { +func (m *IaaSClientMocked) GetServerExecute(_ context.Context, _, _, _ string) (*iaas.Server, error) { if m.GetServerFails { return nil, fmt.Errorf("could not get server") } return m.GetServerResp, nil } -func (m *IaaSClientMocked) GetVolumeExecute(_ context.Context, _, _ string) (*iaas.Volume, error) { +func (m *IaaSClientMocked) GetVolumeExecute(_ context.Context, _, _, _ string) (*iaas.Volume, error) { if m.GetVolumeFails { return nil, fmt.Errorf("could not get volume") } return m.GetVolumeResp, nil } -func (m *IaaSClientMocked) GetNetworkExecute(_ context.Context, _, _ string) (*iaas.Network, error) { +func (m *IaaSClientMocked) GetNetworkExecute(_ context.Context, _, _, _ string) (*iaas.Network, error) { if m.GetNetworkFails { return nil, fmt.Errorf("could not get network") } @@ -102,28 +104,28 @@ func (m *IaaSClientMocked) ListNetworkAreaProjectsExecute(_ context.Context, _, return m.GetAttachedProjectsResp, nil } -func (m *IaaSClientMocked) GetNetworkAreaRangeExecute(_ context.Context, _, _, _ string) (*iaas.NetworkRange, error) { +func (m *IaaSClientMocked) GetNetworkAreaRangeExecute(_ context.Context, _, _, _, _ string) (*iaas.NetworkRange, error) { if m.GetNetworkAreaRangeFails { return nil, fmt.Errorf("could not get network range") } return m.GetNetworkAreaRangeResp, nil } -func (m *IaaSClientMocked) GetImageExecute(_ context.Context, _, _ string) (*iaas.Image, error) { +func (m *IaaSClientMocked) GetImageExecute(_ context.Context, _, _, _ string) (*iaas.Image, error) { if m.GetImageFails { return nil, fmt.Errorf("could not get image") } return m.GetImageResp, nil } -func (m *IaaSClientMocked) GetBackupExecute(_ context.Context, _, _ string) (*iaas.Backup, error) { +func (m *IaaSClientMocked) GetBackupExecute(_ context.Context, _, _, _ string) (*iaas.Backup, error) { if m.GetBackupFails { return nil, fmt.Errorf("could not get backup") } return m.GetBackupResp, nil } -func (m *IaaSClientMocked) GetSnapshotExecute(_ context.Context, _, _ string) (*iaas.Snapshot, error) { +func (m *IaaSClientMocked) GetSnapshotExecute(_ context.Context, _, _, _ string) (*iaas.Snapshot, error) { if m.GetSnapshotFails { return nil, fmt.Errorf("could not get snapshot") } @@ -164,7 +166,7 @@ func TestGetSecurityGroupRuleName(t *testing.T) { GetSecurityGroupRuleFails: tt.args.getInstanceFails, GetSecurityGroupRuleResp: tt.args.getInstanceResp, } - got, err := GetSecurityGroupRuleName(context.Background(), m, "", "", "") + got, err := GetSecurityGroupRuleName(context.Background(), m, "", "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetSecurityGroupRuleName() error = %v, wantErr %v", err, tt.wantErr) return @@ -230,7 +232,7 @@ func TestGetSecurityGroupName(t *testing.T) { GetSecurityGroupFails: tt.args.getInstanceFails, GetSecurityGroupResp: tt.args.getInstanceResp, } - got, err := GetSecurityGroupName(context.Background(), m, "", "") + got, err := GetSecurityGroupName(context.Background(), m, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetSecurityGroupName() error = %v, wantErr %v", err, tt.wantErr) return @@ -279,7 +281,7 @@ func TestGetPublicIp(t *testing.T) { GetPublicIpFails: tt.args.getPublicIpFails, GetPublicIpResp: tt.args.getPublicIpResp, } - gotPublicIP, gotAssociatedResource, err := GetPublicIP(context.Background(), m, "", "") + gotPublicIP, gotAssociatedResource, err := GetPublicIP(context.Background(), m, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetPublicIP() error = %v, wantErr %v", err, tt.wantErr) return @@ -328,7 +330,7 @@ func TestGetServerName(t *testing.T) { GetServerFails: tt.args.getInstanceFails, GetServerResp: tt.args.getInstanceResp, } - got, err := GetServerName(context.Background(), m, "", "") + got, err := GetServerName(context.Background(), m, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetServerName() error = %v, wantErr %v", err, tt.wantErr) return @@ -394,7 +396,7 @@ func TestGetVolumeName(t *testing.T) { GetVolumeFails: tt.args.getInstanceFails, GetVolumeResp: tt.args.getInstanceResp, } - got, err := GetVolumeName(context.Background(), m, "", "") + got, err := GetVolumeName(context.Background(), m, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetVolumeName() error = %v, wantErr %v", err, tt.wantErr) return @@ -460,7 +462,7 @@ func TestGetNetworkName(t *testing.T) { GetNetworkFails: tt.args.getInstanceFails, GetNetworkResp: tt.args.getInstanceResp, } - got, err := GetNetworkName(context.Background(), m, "", "") + got, err := GetNetworkName(context.Background(), m, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetNetworkName() error = %v, wantErr %v", err, tt.wantErr) return @@ -619,7 +621,7 @@ func TestGetNetworkRangePrefix(t *testing.T) { GetNetworkAreaRangeFails: tt.args.getNetworkAreaRangeFails, GetNetworkAreaRangeResp: tt.args.getNetworkAreaRangeResp, } - got, err := GetNetworkRangePrefix(context.Background(), m, "", "", "") + got, err := GetNetworkRangePrefix(context.Background(), m, "", "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetNetworkRangePrefix() error = %v, wantErr %v", err, tt.wantErr) return @@ -650,22 +652,210 @@ func TestGetRouteFromAPIResponse(t *testing.T) { nexthop: "1.1.1.1", routes: &[]iaas.Route{ { - Prefix: utils.Ptr("1.1.1.0/24"), - Nexthop: utils.Ptr("1.1.1.1"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr("cidrv4"), + Value: utils.Ptr("1.1.1.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr("ipv4"), + Value: utils.Ptr("1.1.1.1"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr("cidrv4"), + Value: utils.Ptr("2.2.2.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr("ipv4"), + Value: utils.Ptr("2.2.2.2"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("3.3.3.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr("blackhole"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("4.4.4.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr("internet"), + }, + }, + }, + }, + }, + want: iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr("cidrv4"), + Value: utils.Ptr("1.1.1.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr("ipv4"), + Value: utils.Ptr("1.1.1.1"), + }, + }, + }, + }, + { + name: "nexthop internet", + args: args{ + prefix: "4.4.4.0/24", + nexthop: "internet", + routes: &[]iaas.Route{ + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("1.1.1.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Value: utils.Ptr("1.1.1.1"), + }, + }, }, { - Prefix: utils.Ptr("2.2.2.0/24"), - Nexthop: utils.Ptr("2.2.2.2"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("2.2.2.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Value: utils.Ptr("2.2.2.2"), + }, + }, }, { - Prefix: utils.Ptr("3.3.3.0/24"), - Nexthop: utils.Ptr("3.3.3.3"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("3.3.3.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr("blackhole"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("4.4.4.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr("internet"), + }, + }, }, }, }, want: iaas.Route{ - Prefix: utils.Ptr("1.1.1.0/24"), - Nexthop: utils.Ptr("1.1.1.1"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("4.4.4.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr("internet"), + }, + }, + }, + }, + { + name: "nexthop backhole", + args: args{ + prefix: "3.3.3.0/24", + nexthop: "blackhole", + routes: &[]iaas.Route{ + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("1.1.1.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Value: utils.Ptr("1.1.1.1"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("2.2.2.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Value: utils.Ptr("2.2.2.2"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("3.3.3.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr("blackhole"), + }, + }, + }, + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("4.4.4.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr("internet"), + }, + }, + }, + }, + }, + want: iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("3.3.3.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr("blackhole"), + }, + }, }, }, { @@ -675,12 +865,28 @@ func TestGetRouteFromAPIResponse(t *testing.T) { nexthop: "1.1.1.1", routes: &[]iaas.Route{ { - Prefix: utils.Ptr("2.2.2.0/24"), - Nexthop: utils.Ptr("2.2.2.2"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("2.2.2.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Value: utils.Ptr("2.2.2.2"), + }, + }, }, { - Prefix: utils.Ptr("3.3.3.0/24"), - Nexthop: utils.Ptr("3.3.3.3"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Value: utils.Ptr("3.3.3.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Value: utils.Ptr("3.3.3.3"), + }, + }, }, }, }, @@ -819,7 +1025,7 @@ func TestGetImageName(t *testing.T) { GetImageFails: tt.imageErr, GetImageResp: tt.imageResp, } - got, err := GetImageName(context.Background(), client, "", "") + got, err := GetImageName(context.Background(), client, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetImageName() error = %v, wantErr %v", err, tt.wantErr) return @@ -876,7 +1082,7 @@ func TestGetAffinityGroupName(t *testing.T) { GetAffinityGroupsFails: tt.affinityErr, GetAffinityGroupResp: tt.affinityResp, } - got, err := GetAffinityGroupName(ctx, client, "", "") + got, err := GetAffinityGroupName(ctx, client, "", "", "") if (err != nil) != tt.wantErr { t.Errorf("GetAffinityGroupName() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index 2a68bc14c..862b92c8f 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -168,29 +168,29 @@ func (b Base64Bytes) MarshalYAML() (interface{}, error) { } type Base64PatchedServer struct { - Id *string `json:"id,omitempty"` - Name *string `json:"name,omitempty"` - Status *string `json:"status,omitempty"` - AvailabilityZone *string `json:"availabilityZone,omitempty"` - BootVolume *iaas.CreateServerPayloadBootVolume `json:"bootVolume,omitempty"` - CreatedAt *time.Time `json:"createdAt,omitempty"` - ErrorMessage *string `json:"errorMessage,omitempty"` - PowerStatus *string `json:"powerStatus,omitempty"` - AffinityGroup *string `json:"affinityGroup,omitempty"` - ImageId *string `json:"imageId,omitempty"` - KeypairName *string `json:"keypairName,omitempty"` - MachineType *string `json:"machineType,omitempty"` - Labels *map[string]interface{} `json:"labels,omitempty"` - LaunchedAt *time.Time `json:"launchedAt,omitempty"` - MaintenanceWindow *iaas.ServerMaintenance `json:"maintenanceWindow,omitempty"` - Metadata *map[string]interface{} `json:"metadata,omitempty"` - Networking *iaas.CreateServerPayloadNetworking `json:"networking,omitempty"` - Nics *[]iaas.ServerNetwork `json:"nics,omitempty"` - SecurityGroups *[]string `json:"securityGroups,omitempty"` - ServiceAccountMails *[]string `json:"serviceAccountMails,omitempty"` - UpdatedAt *time.Time `json:"updatedAt,omitempty"` - UserData *Base64Bytes `json:"userData,omitempty"` - Volumes *[]string `json:"volumes,omitempty"` + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Status *string `json:"status,omitempty"` + AvailabilityZone *string `json:"availabilityZone,omitempty"` + BootVolume *iaas.ServerBootVolume `json:"bootVolume,omitempty"` + CreatedAt *time.Time `json:"createdAt,omitempty"` + ErrorMessage *string `json:"errorMessage,omitempty"` + PowerStatus *string `json:"powerStatus,omitempty"` + AffinityGroup *string `json:"affinityGroup,omitempty"` + ImageId *string `json:"imageId,omitempty"` + KeypairName *string `json:"keypairName,omitempty"` + MachineType *string `json:"machineType,omitempty"` + Labels *map[string]interface{} `json:"labels,omitempty"` + LaunchedAt *time.Time `json:"launchedAt,omitempty"` + MaintenanceWindow *iaas.ServerMaintenance `json:"maintenanceWindow,omitempty"` + Metadata *map[string]interface{} `json:"metadata,omitempty"` + Networking *iaas.ServerNetworking `json:"networking,omitempty"` + Nics *[]iaas.ServerNetwork `json:"nics,omitempty"` + SecurityGroups *[]string `json:"securityGroups,omitempty"` + ServiceAccountMails *[]string `json:"serviceAccountMails,omitempty"` + UpdatedAt *time.Time `json:"updatedAt,omitempty"` + UserData *Base64Bytes `json:"userData,omitempty"` + Volumes *[]string `json:"volumes,omitempty"` } // ConvertToBase64PatchedServer converts an iaas.Server to Base64PatchedServer From d68210bd6eb5e829cfc639fb325e182b9e136364 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Nov 2025 09:36:22 +0100 Subject: [PATCH 192/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1065) Bumps [github.com/stackitcloud/stackit-sdk-go/services/iaas](https://github.com/stackitcloud/stackit-sdk-go) from 1.0.0 to 1.1.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/iaas/v1.0.0...services/iaas/v1.1.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/iaas dependency-version: 1.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1d4e8ac4f..a01a8da65 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.0.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index 850d60dfe..6e4bb10f3 100644 --- a/go.sum +++ b/go.sum @@ -571,8 +571,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7gUXYzrN0Ip5NXj+6LFBp1EO6cg= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.0.0 h1:qLMpd5whPMLnaLEdFQjK51q/o9V6eMFMORBDSsyGyNI= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.0.0/go.mod h1:854gnLR92NvAbJAA1xZEumrtNh1DoBP1FXTMvhwYA6w= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0 h1:0NS+NTxr1emS5hg/f62y8H9YtsL1+0P4EVQ+CBOEzjY= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0/go.mod h1:cUYlmptRGD5gizrzxiOnseow4l/g5ZSMmoYbpfeGCI8= github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0/go.mod h1:KEPVoO21pC4bjy5l0nyhjUJ0+uVwVWb+k2TYrzJ8xYw= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= From 2f8acaec5903dd88c1d685c6e92fdf731560c41f Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 7 Nov 2025 11:22:06 +0100 Subject: [PATCH 193/422] fix(deps): update module github.com/jedib0t/go-pretty/v6 to v6.7.0 (#1071) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a01a8da65..20f8e8977 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.6.9 + github.com/jedib0t/go-pretty/v6 v6.7.0 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 diff --git a/go.sum b/go.sum index 6e4bb10f3..18f2201f0 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.6.9 h1:PQecJLK3L8ODuVyMe2223b61oRJjrKnmXAncbWTv9MY= -github.com/jedib0t/go-pretty/v6 v6.6.9/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.0 h1:DanoN1RnjXTwDN+B8yqtixXzXqNBCs2Vxo2ARsnrpsY= +github.com/jedib0t/go-pretty/v6 v6.7.0/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From 9f8ab6f316df4a05c3cd577cff4fd48c7f539bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 7 Nov 2025 11:40:36 +0100 Subject: [PATCH 194/422] fix(auth): hide misleading parameters in get access token cmd (#1069) relates to #1001 / STACKITCLI-282 --- internal/cmd/auth/get-access-token/get_access_token.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index a26b71b20..5ff3da916 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -67,6 +67,13 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } }, } + + // hide project id flag from help command because it could mislead users + cmd.SetHelpFunc(func(command *cobra.Command, strings []string) { + _ = command.Flags().MarkHidden(globalflags.ProjectIdFlag) // nolint:errcheck // there's no chance to handle the error here + command.Parent().HelpFunc()(command, strings) + }) + return cmd } From 12de8eb4d8eef31b0770fd5a31680bc3f8a6be77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20F=C3=BCrtsch?= <49522775+Benjosh95@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:18:17 +0100 Subject: [PATCH 195/422] fix(kms): use fixed wait handler for disableKeyVersion command (#1064) --- go.mod | 2 +- go.sum | 4 ++-- internal/cmd/beta/kms/version/disable/disable.go | 13 ++++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 20f8e8977..5b637c224 100644 --- a/go.mod +++ b/go.mod @@ -242,7 +242,7 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 + github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 diff --git a/go.sum b/go.sum index 18f2201f0..393b32da9 100644 --- a/go.sum +++ b/go.sum @@ -573,8 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7g github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0 h1:0NS+NTxr1emS5hg/f62y8H9YtsL1+0P4EVQ+CBOEzjY= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0/go.mod h1:cUYlmptRGD5gizrzxiOnseow4l/g5ZSMmoYbpfeGCI8= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0 h1:zxoOv7Fu+FmdsvTKiKkbmLItrMKfL+QoVtz9ReEF30E= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.0.0/go.mod h1:KEPVoO21pC4bjy5l0nyhjUJ0+uVwVWb+k2TYrzJ8xYw= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 h1:bgMV+hi/530htdSMAyRBrltR7Czinb56HQBT36wnVMU= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0/go.mod h1:QswbIN9TUYELIwkjO+Bu8Nk/FGcd3kZYDlf2n0PdFAk= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= diff --git a/internal/cmd/beta/kms/version/disable/disable.go b/internal/cmd/beta/kms/version/disable/disable.go index 095a870e4..bfb641d56 100644 --- a/internal/cmd/beta/kms/version/disable/disable.go +++ b/internal/cmd/beta/kms/version/disable/disable.go @@ -16,8 +16,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" ) const ( @@ -67,7 +69,16 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("disable key version: %w", err) } - // kms v1.0.0 has a waiter, but it get's stuck even though the disable api call was already successfully completed. + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Disabling key version") + _, err = wait.DisableKeyVersionWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for key version to be disabled: %w", err) + } + s.Stop() + } // Get the key version in its state afterwards resp, err := apiClient.GetVersionExecute(ctx, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber) From 076d7a9f22ed6db7bb1494601a9af1c48fbfca33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Nov 2025 14:31:59 +0000 Subject: [PATCH 196/422] chore(deps): bump renovatebot/github-action from 43.0.20 to 44.0.0 (#1072) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index fc34b9b41..84ad52710 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v43.0.20 + uses: renovatebot/github-action@v44.0.0 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From ece1975524ea97b0733c047208f5ee2a43828a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Mon, 10 Nov 2025 11:12:45 +0100 Subject: [PATCH 197/422] fix(opensearch): print valid JSON/YAML output for list cmds (#1046) relates to STACKITCLI-269 / #893 --- .../credentials/create/create_test.go | 12 ++--- .../credentials/delete/delete_test.go | 12 ++--- .../credentials/describe/describe_test.go | 12 ++--- .../cmd/opensearch/credentials/list/list.go | 25 ++++++---- .../opensearch/credentials/list/list_test.go | 21 ++++---- .../opensearch/instance/create/create_test.go | 50 +++++++++---------- .../opensearch/instance/delete/delete_test.go | 10 ++-- .../instance/describe/describe_test.go | 10 ++-- internal/cmd/opensearch/instance/list/list.go | 24 +++++---- .../cmd/opensearch/instance/list/list_test.go | 15 +++--- .../opensearch/instance/update/update_test.go | 42 ++++++++-------- internal/cmd/opensearch/plans/plans.go | 24 +++++---- internal/cmd/opensearch/plans/plans_test.go | 15 +++--- 13 files changed, 131 insertions(+), 141 deletions(-) diff --git a/internal/cmd/opensearch/credentials/create/create_test.go b/internal/cmd/opensearch/credentials/create/create_test.go index 8943eede7..9b9057414 100644 --- a/internal/cmd/opensearch/credentials/create/create_test.go +++ b/internal/cmd/opensearch/credentials/create/create_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -89,21 +87,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/credentials/delete/delete_test.go b/internal/cmd/opensearch/credentials/delete/delete_test.go index 53b987e9f..dcaa66ee1 100644 --- a/internal/cmd/opensearch/credentials/delete/delete_test.go +++ b/internal/cmd/opensearch/credentials/delete/delete_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -35,8 +33,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -104,7 +102,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -112,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -120,7 +118,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/credentials/describe/describe_test.go b/internal/cmd/opensearch/credentials/describe/describe_test.go index c1c2f3b2d..f9b43012d 100644 --- a/internal/cmd/opensearch/credentials/describe/describe_test.go +++ b/internal/cmd/opensearch/credentials/describe/describe_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -37,8 +35,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, } for _, mod := range mods { mod(flagValues) @@ -106,7 +104,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -114,7 +112,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -122,7 +120,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index 2e5451ec2..7a086385b 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -67,22 +67,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list OpenSearch credentials: %w", err) } - credentials := *resp.CredentialsList - if len(credentials) == 0 { - instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = model.InstanceId - } - params.Printer.Info("No credentials found for instance %q\n", instanceLabel) - return nil + credentials := resp.GetCredentialsList() + + instanceLabel, err := opensearchUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId } // Truncate output if model.Limit != nil && len(credentials) > int(*model.Limit) { credentials = credentials[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, credentials) + + return outputResult(params.Printer, model.OutputFormat, instanceLabel, credentials) }, } configureFlags(cmd) @@ -126,8 +124,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *opensearch. return req } -func outputResult(p *print.Printer, outputFormat string, credentials []opensearch.CredentialsListItem) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, credentials []opensearch.CredentialsListItem) error { return p.OutputResult(outputFormat, credentials, func() error { + if len(credentials) == 0 { + p.Outputf("No credentials found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID") for i := range credentials { diff --git a/internal/cmd/opensearch/credentials/list/list_test.go b/internal/cmd/opensearch/credentials/list/list_test.go index 8375506e1..ee376658f 100644 --- a/internal/cmd/opensearch/credentials/list/list_test.go +++ b/internal/cmd/opensearch/credentials/list/list_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -27,9 +25,9 @@ var testInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceIdFlag: testInstanceId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + instanceIdFlag: testInstanceId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -82,21 +80,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -174,8 +172,9 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - credentials []opensearch.CredentialsListItem + outputFormat string + instanceLabel string + credentials []opensearch.CredentialsListItem } tests := []struct { name string @@ -206,7 +205,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/opensearch/instance/create/create_test.go b/internal/cmd/opensearch/instance/create/create_test.go index fe8afe7d3..9d14e0bd4 100644 --- a/internal/cmd/opensearch/instance/create/create_test.go +++ b/internal/cmd/opensearch/instance/create/create_test.go @@ -18,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -47,17 +45,17 @@ var testMonitoringInstanceId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - instanceNameFlag: "example-name", - enableMonitoringFlag: "true", - graphiteFlag: "example-graphite", - metricsFrequencyFlag: "100", - metricsPrefixFlag: "example-prefix", - monitoringInstanceIdFlag: testMonitoringInstanceId, - pluginFlag: "example-plugin", - sgwAclFlag: "198.51.100.14/24", - syslogFlag: "example-syslog", - planIdFlag: testPlanId, + globalflags.ProjectIdFlag: testProjectId, + instanceNameFlag: "example-name", + enableMonitoringFlag: "true", + graphiteFlag: "example-graphite", + metricsFrequencyFlag: "100", + metricsPrefixFlag: "example-prefix", + monitoringInstanceIdFlag: testMonitoringInstanceId, + pluginFlag: "example-plugin", + sgwAclFlag: "198.51.100.14/24", + syslogFlag: "example-syslog", + planIdFlag: testPlanId, } for _, mod := range mods { mod(flagValues) @@ -149,9 +147,9 @@ func TestParseInput(t *testing.T) { { description: "required fields only", flagValues: map[string]string{ - projectIdFlag: testProjectId, - instanceNameFlag: "example-name", - planIdFlag: testPlanId, + globalflags.ProjectIdFlag: testProjectId, + instanceNameFlag: "example-name", + planIdFlag: testPlanId, }, isValid: true, expectedModel: &inputModel{ @@ -166,13 +164,13 @@ func TestParseInput(t *testing.T) { { description: "zero values", flagValues: map[string]string{ - projectIdFlag: testProjectId, - planIdFlag: testPlanId, - instanceNameFlag: "", - enableMonitoringFlag: "false", - graphiteFlag: "", - metricsFrequencyFlag: "0", - metricsPrefixFlag: "", + globalflags.ProjectIdFlag: testProjectId, + planIdFlag: testPlanId, + instanceNameFlag: "", + enableMonitoringFlag: "false", + graphiteFlag: "", + metricsFrequencyFlag: "0", + metricsPrefixFlag: "", }, isValid: true, expectedModel: &inputModel{ @@ -191,21 +189,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/instance/delete/delete_test.go b/internal/cmd/opensearch/instance/delete/delete_test.go index c6ab9693d..f9943acf7 100644 --- a/internal/cmd/opensearch/instance/delete/delete_test.go +++ b/internal/cmd/opensearch/instance/delete/delete_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -34,7 +32,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, } for _, mod := range mods { mod(flagValues) @@ -101,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/instance/describe/describe_test.go b/internal/cmd/opensearch/instance/describe/describe_test.go index 8ae93fa8f..633d7da44 100644 --- a/internal/cmd/opensearch/instance/describe/describe_test.go +++ b/internal/cmd/opensearch/instance/describe/describe_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,7 +34,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, } for _, mod := range mods { mod(flagValues) @@ -103,7 +101,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -111,7 +109,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -119,7 +117,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index 03e18c79d..a6c57bc29 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get OpenSearch instances: %w", err) } - instances := *resp.Instances - if len(instances) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil + instances := resp.GetInstances() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *opensearch. return req } -func outputResult(p *print.Printer, outputFormat string, instances []opensearch.Instance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []opensearch.Instance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "LAST OPERATION TYPE", "LAST OPERATION STATE") for i := range instances { diff --git a/internal/cmd/opensearch/instance/list/list_test.go b/internal/cmd/opensearch/instance/list/list_test.go index 86ac78970..15f772725 100644 --- a/internal/cmd/opensearch/instance/list/list_test.go +++ b/internal/cmd/opensearch/instance/list/list_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -79,21 +77,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -151,6 +149,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instances []opensearch.Instance } tests := []struct { @@ -182,7 +181,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/opensearch/instance/update/update_test.go b/internal/cmd/opensearch/instance/update/update_test.go index 70168bbc2..934088f02 100644 --- a/internal/cmd/opensearch/instance/update/update_test.go +++ b/internal/cmd/opensearch/instance/update/update_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -58,16 +56,16 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - enableMonitoringFlag: "true", - graphiteFlag: "example-graphite", - metricsFrequencyFlag: "100", - metricsPrefixFlag: "example-prefix", - monitoringInstanceIdFlag: testMonitoringInstanceId, - pluginFlag: "example-plugin", - sgwAclFlag: "198.51.100.14/24", - syslogFlag: "example-syslog", - planIdFlag: testPlanId, + globalflags.ProjectIdFlag: testProjectId, + enableMonitoringFlag: "true", + graphiteFlag: "example-graphite", + metricsFrequencyFlag: "100", + metricsPrefixFlag: "example-prefix", + monitoringInstanceIdFlag: testMonitoringInstanceId, + pluginFlag: "example-plugin", + sgwAclFlag: "198.51.100.14/24", + syslogFlag: "example-syslog", + planIdFlag: testPlanId, } for _, mod := range mods { mod(flagValues) @@ -159,7 +157,7 @@ func TestParseInput(t *testing.T) { description: "required flags only (no values to update)", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, }, isValid: false, expectedModel: &inputModel{ @@ -174,12 +172,12 @@ func TestParseInput(t *testing.T) { description: "zero values", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, - planIdFlag: testPlanId, - enableMonitoringFlag: "false", - graphiteFlag: "", - metricsFrequencyFlag: "0", - metricsPrefixFlag: "", + globalflags.ProjectIdFlag: testProjectId, + planIdFlag: testPlanId, + enableMonitoringFlag: "false", + graphiteFlag: "", + metricsFrequencyFlag: "0", + metricsPrefixFlag: "", }, isValid: true, expectedModel: &inputModel{ @@ -199,7 +197,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -207,7 +205,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -215,7 +213,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index 45a026ab9..5ba348f99 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -64,15 +64,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get OpenSearch service plans: %w", err) } - plans := *resp.Offerings - if len(plans) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No plans found for project %q\n", projectLabel) - return nil + plans := resp.GetOfferings() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } // Truncate output @@ -80,7 +77,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { plans = plans[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, plans) + return outputResult(params.Printer, model.OutputFormat, projectLabel, plans) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *opensearch. return req } -func outputResult(p *print.Printer, outputFormat string, plans []opensearch.Offering) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []opensearch.Offering) error { return p.OutputResult(outputFormat, plans, func() error { + if len(plans) == 0 { + p.Outputf("No plans found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("OFFERING NAME", "VERSION", "ID", "NAME", "DESCRIPTION") for i := range plans { diff --git a/internal/cmd/opensearch/plans/plans_test.go b/internal/cmd/opensearch/plans/plans_test.go index 4cafef6ba..093e129fd 100644 --- a/internal/cmd/opensearch/plans/plans_test.go +++ b/internal/cmd/opensearch/plans/plans_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -26,8 +24,8 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - limitFlag: "10", + globalflags.ProjectIdFlag: testProjectId, + limitFlag: "10", } for _, mod := range mods { mod(flagValues) @@ -79,21 +77,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -151,6 +149,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string plans []opensearch.Offering } tests := []struct { @@ -182,7 +181,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From e806dc0729c8565ea1065e106cf69a4ffafa5e5c Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:19:56 +0100 Subject: [PATCH 198/422] fix(deps): update module github.com/jedib0t/go-pretty/v6 to v6.7.1 (#1074) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5b637c224..a593c2302 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.7.0 + github.com/jedib0t/go-pretty/v6 v6.7.1 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 diff --git a/go.sum b/go.sum index 393b32da9..8377b0d1e 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.7.0 h1:DanoN1RnjXTwDN+B8yqtixXzXqNBCs2Vxo2ARsnrpsY= -github.com/jedib0t/go-pretty/v6 v6.7.0/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.1 h1:bHDSsj93NuJ563hHuM7ohk/wpX7BmRFNIsVv1ssI2/M= +github.com/jedib0t/go-pretty/v6 v6.7.1/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From cb77ba02e231bdef1d01976dced6ff3231311787 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 16:07:55 +0100 Subject: [PATCH 199/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1075) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a593c2302..1bbfe0f4a 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index 8377b0d1e..dd2220b81 100644 --- a/go.sum +++ b/go.sum @@ -571,8 +571,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4r github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7gUXYzrN0Ip5NXj+6LFBp1EO6cg= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0 h1:0NS+NTxr1emS5hg/f62y8H9YtsL1+0P4EVQ+CBOEzjY= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.1.0/go.mod h1:cUYlmptRGD5gizrzxiOnseow4l/g5ZSMmoYbpfeGCI8= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 h1:bkvq3Y4OcGyCR5N69tyY7ZTcrVN+htGTa2ZBJL5BQTQ= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0/go.mod h1:tg1rHvgFRG9gNCYnTepZFaSCBahhLLjkIb3nRbtyjDQ= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 h1:bgMV+hi/530htdSMAyRBrltR7Czinb56HQBT36wnVMU= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0/go.mod h1:QswbIN9TUYELIwkjO+Bu8Nk/FGcd3kZYDlf2n0PdFAk= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= From 2d403370ae730877fd2579da44fd862236d5440b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 15:17:29 +0000 Subject: [PATCH 200/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1076) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1bbfe0f4a..253f91312 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.18.0 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 diff --git a/go.sum b/go.sum index dd2220b81..8ba03fc45 100644 --- a/go.sum +++ b/go.sum @@ -563,8 +563,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.18.0 h1:+4v8sjQpQXPihO3crgTp0Kz/XRIi5p7oKV28dw6jsEQ= github.com/stackitcloud/stackit-sdk-go/core v0.18.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0 h1:UM/HvewAgELEvZ4zk++Ykd6jUTSL+asRqtK+DszDOzE= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.0/go.mod h1:mOmGoNLPXLJ5tKLnhOnhKW7wL9Giy/4DowiDZNLlQCY= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 h1:DaJkEN/6l+AJEQ3Dr+3IdKM4jywDQsTvuYHmRvFj3ho= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1/go.mod h1:SzA+UsSNv4D9IvNT7hwYPewgAvUgj5WXIU2tZ0XaMBI= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= From f83a5683e6cfdfde1f552f9de1adfa0ef5ee4f76 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 11 Nov 2025 15:12:19 +0100 Subject: [PATCH 201/422] chore(deps): update renovatebot/github-action action to v44.0.2 (#1079) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 84ad52710..41bef42a1 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.0.0 + uses: renovatebot/github-action@v44.0.2 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From cafabc57f106d67e7162a3cc2cc18a9a92513b51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Nov 2025 15:20:20 +0100 Subject: [PATCH 202/422] chore(deps): bump golang.org/x/oauth2 from 0.32.0 to 0.33.0 (#1077) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 253f91312..e9086d410 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.29.0 - golang.org/x/oauth2 v0.32.0 + golang.org/x/oauth2 v0.33.0 golang.org/x/term v0.36.0 golang.org/x/text v0.30.0 k8s.io/apimachinery v0.34.1 diff --git a/go.sum b/go.sum index 8ba03fc45..654c20ab6 100644 --- a/go.sum +++ b/go.sum @@ -807,8 +807,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= -golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= +golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 6e9982fdd1ad4a6cbcfeac861e17c2c1fc96261e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 12 Nov 2025 07:36:30 +0100 Subject: [PATCH 203/422] fix(deps): update module golang.org/x/mod to v0.30.0 (#1081) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e9086d410..f0fd1a783 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.29.0 + golang.org/x/mod v0.30.0 golang.org/x/oauth2 v0.33.0 golang.org/x/term v0.36.0 golang.org/x/text v0.30.0 diff --git a/go.sum b/go.sum index 654c20ab6..34d600326 100644 --- a/go.sum +++ b/go.sum @@ -757,8 +757,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 872c509b1a1f641bdf533e840642b68d034d32ff Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 12 Nov 2025 07:46:39 +0100 Subject: [PATCH 204/422] fix(deps): update module golang.org/x/term to v0.37.0 (#1082) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index f0fd1a783..8b3c7c538 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.30.0 golang.org/x/oauth2 v0.33.0 - golang.org/x/term v0.36.0 + golang.org/x/term v0.37.0 golang.org/x/text v0.30.0 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 @@ -252,7 +252,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/sys v0.37.0 // indirect + golang.org/x/sys v0.38.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index 34d600326..aaf1a8f5c 100644 --- a/go.sum +++ b/go.sum @@ -877,8 +877,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -889,8 +889,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= -golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From a941843c03705a4761eff8433f15bc85ca7715ef Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 12 Nov 2025 08:06:33 +0100 Subject: [PATCH 205/422] fix(deps): update module golang.org/x/text to v0.31.0 (#1083) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8b3c7c538..4f3001015 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( golang.org/x/mod v0.30.0 golang.org/x/oauth2 v0.33.0 golang.org/x/term v0.37.0 - golang.org/x/text v0.30.0 + golang.org/x/text v0.31.0 k8s.io/apimachinery v0.34.1 k8s.io/client-go v0.34.1 ) @@ -208,7 +208,7 @@ require ( go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect - golang.org/x/sync v0.17.0 // indirect + golang.org/x/sync v0.18.0 // indirect golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect golang.org/x/tools v0.38.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect diff --git a/go.sum b/go.sum index aaf1a8f5c..d119f696d 100644 --- a/go.sum +++ b/go.sum @@ -824,8 +824,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -903,8 +903,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From fd2b40667e88d6de05dc4aa603ea8d29ca2969da Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 13 Nov 2025 07:37:58 +0100 Subject: [PATCH 206/422] fix(deps): update kubernetes packages to v0.34.2 (#1085) Co-authored-by: Renovate Bot --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 4f3001015..e222307af 100644 --- a/go.mod +++ b/go.mod @@ -38,8 +38,8 @@ require ( golang.org/x/oauth2 v0.33.0 golang.org/x/term v0.37.0 golang.org/x/text v0.31.0 - k8s.io/apimachinery v0.34.1 - k8s.io/client-go v0.34.1 + k8s.io/apimachinery v0.34.2 + k8s.io/client-go v0.34.2 ) require ( @@ -254,7 +254,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.38.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.34.1 // indirect + k8s.io/api v0.34.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect diff --git a/go.sum b/go.sum index d119f696d..c3b3ab1b7 100644 --- a/go.sum +++ b/go.sum @@ -1085,12 +1085,12 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= -k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= -k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= -k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= -k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= -k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= +k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY= +k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw= +k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4= +k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M= +k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE= 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= From b79dc00b2c532e40e45fedee17f8e93f0c8f67a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 13 Nov 2025 16:41:33 +0100 Subject: [PATCH 207/422] fix(sqlserverflex): print valid JSON/YAML output for list cmds (#1044) relates to STACKITCLI-272 / #893 --- .../beta/sqlserverflex/database/list/list.go | 24 ++++++++++--------- .../sqlserverflex/database/list/list_test.go | 7 ++++-- .../beta/sqlserverflex/instance/list/list.go | 24 ++++++++++--------- .../sqlserverflex/instance/list/list_test.go | 6 +++-- .../cmd/beta/sqlserverflex/user/list/list.go | 24 ++++++++++--------- .../beta/sqlserverflex/user/list/list_test.go | 10 ++++---- 6 files changed, 54 insertions(+), 41 deletions(-) diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index 38f630a3f..12738a9ab 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -66,23 +66,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get SQLServer Flex databases: %w", err) } - if resp.Databases == nil || len(*resp.Databases) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No databases found for instance %s on project %s\n", model.InstanceId, projectLabel) - return nil + databases := resp.GetDatabases() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } - databases := *resp.Databases // Truncate output if model.Limit != nil && len(databases) > int(*model.Limit) { databases = databases[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, databases) + return outputResult(params.Printer, model.OutputFormat, model.InstanceId, projectLabel, databases) }, } @@ -127,8 +124,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl return req } -func outputResult(p *print.Printer, outputFormat string, databases []sqlserverflex.Database) error { +func outputResult(p *print.Printer, outputFormat, instanceId, projectLabel string, databases []sqlserverflex.Database) error { return p.OutputResult(outputFormat, databases, func() error { + if len(databases) == 0 { + p.Outputf("No databases found for instance %s on project %s\n", instanceId, projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME") for i := range databases { diff --git a/internal/cmd/beta/sqlserverflex/database/list/list_test.go b/internal/cmd/beta/sqlserverflex/database/list/list_test.go index ae340d0db..36674a923 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list_test.go @@ -21,7 +21,8 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &sqlserverflex.APIClient{} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ @@ -175,6 +176,8 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + instanceId string + projectLabel string databases []sqlserverflex.Database } tests := []struct { @@ -199,7 +202,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.databases); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceId, tt.args.projectLabel, tt.args.databases); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 76cf59d8a..27dada066 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -64,23 +64,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get SQLServer Flex instances: %w", err) } - if resp.Items == nil || len(*resp.Items) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No instances found for project %q\n", projectLabel) - return nil + instances := resp.GetItems() + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } - instances := *resp.Items // Truncate output if model.Limit != nil && len(instances) > int(*model.Limit) { instances = instances[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, instances) + return outputResult(params.Printer, model.OutputFormat, projectLabel, instances) }, } @@ -120,8 +117,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl return req } -func outputResult(p *print.Printer, outputFormat string, instances []sqlserverflex.InstanceListInstance) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []sqlserverflex.InstanceListInstance) error { return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS") for i := range instances { diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go index 59711594b..4105384df 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go @@ -20,7 +20,8 @@ type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &sqlserverflex.APIClient{} var testProjectId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ @@ -151,6 +152,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string instances []sqlserverflex.InstanceListInstance } tests := []struct { @@ -175,7 +177,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index 0c131e32b..c74dc7866 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -67,23 +67,20 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get SQLServer Flex users: %w", err) } - if resp.Items == nil || len(*resp.Items) == 0 { - instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = *model.InstanceId - } - params.Printer.Info("No users found for instance %q\n", instanceLabel) - return nil + users := resp.GetItems() + + instanceLabel, err := sqlserverflexUtils.GetInstanceName(ctx, apiClient, model.ProjectId, *model.InstanceId, model.Region) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = *model.InstanceId } - users := *resp.Items // Truncate output if model.Limit != nil && len(users) > int(*model.Limit) { users = users[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, users) + return outputResult(params.Printer, model.OutputFormat, instanceLabel, users) }, } @@ -128,8 +125,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *sqlserverfl return req } -func outputResult(p *print.Printer, outputFormat string, users []sqlserverflex.InstanceListUser) error { +func outputResult(p *print.Printer, outputFormat, instanceLabel string, users []sqlserverflex.InstanceListUser) error { return p.OutputResult(outputFormat, users, func() error { + if len(users) == 0 { + p.Outputf("No users found for instance %q\n", instanceLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "USERNAME") for i := range users { diff --git a/internal/cmd/beta/sqlserverflex/user/list/list_test.go b/internal/cmd/beta/sqlserverflex/user/list/list_test.go index ef80e6252..44deacf77 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list_test.go @@ -21,7 +21,8 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &sqlserverflex.APIClient{} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() -var testRegion = "eu01" + +const testRegion = "eu01" func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ @@ -167,8 +168,9 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - outputFormat string - users []sqlserverflex.InstanceListUser + outputFormat string + instanceLabel string + users []sqlserverflex.InstanceListUser } tests := []struct { name string @@ -192,7 +194,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.users); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.users); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From 79ea76d2dbf08411c315825b05fbe0ded5087560 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Fri, 14 Nov 2025 07:39:57 +0100 Subject: [PATCH 208/422] chore(deps): update module golang.org/x/tools to v0.39.0 (#1087) Co-authored-by: Renovate Bot --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index e222307af..d37be0e7e 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( ) require ( - golang.org/x/net v0.46.0 // indirect + golang.org/x/net v0.47.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -209,8 +209,8 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect golang.org/x/sync v0.18.0 // indirect - golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect - golang.org/x/tools v0.38.0 // indirect + golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect + golang.org/x/tools v0.39.0 // indirect golang.org/x/tools/go/expect v0.1.1-deprecated // indirect golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect google.golang.org/protobuf v1.36.6 // indirect diff --git a/go.sum b/go.sum index c3b3ab1b7..42be8a8c0 100644 --- a/go.sum +++ b/go.sum @@ -799,8 +799,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -879,8 +879,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= -golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= +golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 h1:E2/AqCUMZGgd73TQkxUMcMla25GB9i/5HOdLr+uH7Vo= +golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -968,8 +968,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= From 128b545d996f9a7f09ccdd15e9ab68a64e8e1393 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 06:48:22 +0000 Subject: [PATCH 209/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/core (#1086) Bumps [github.com/stackitcloud/stackit-sdk-go/core](https://github.com/stackitcloud/stackit-sdk-go) from 0.18.0 to 0.19.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.18.0...core/v0.19.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/core dependency-version: 0.19.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d37be0e7e..27664ec41 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.18.0 + github.com/stackitcloud/stackit-sdk-go/core v0.19.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 diff --git a/go.sum b/go.sum index 42be8a8c0..2d88b3d6c 100644 --- a/go.sum +++ b/go.sum @@ -561,8 +561,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.18.0 h1:+4v8sjQpQXPihO3crgTp0Kz/XRIi5p7oKV28dw6jsEQ= -github.com/stackitcloud/stackit-sdk-go/core v0.18.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= +github.com/stackitcloud/stackit-sdk-go/core v0.19.0 h1:dtJcs6/TTCzzb2RKI7HJugDrbCkaFEDmn1pOeFe8qnI= +github.com/stackitcloud/stackit-sdk-go/core v0.19.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 h1:DaJkEN/6l+AJEQ3Dr+3IdKM4jywDQsTvuYHmRvFj3ho= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1/go.mod h1:SzA+UsSNv4D9IvNT7hwYPewgAvUgj5WXIU2tZ0XaMBI= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= From 46b890557446fd571f80c2bb30ac11c4e89bb9c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 14 Nov 2025 10:24:47 +0100 Subject: [PATCH 210/422] fix(dns): print valid JSON/YAML output for list cmds (#1040) relates to STACKITCLI-266 / #893 --- .../cmd/dns/record-set/create/create_test.go | 42 ++++++------ .../cmd/dns/record-set/delete/delete_test.go | 12 ++-- .../dns/record-set/describe/describe_test.go | 12 ++-- internal/cmd/dns/record-set/list/list.go | 23 ++++--- internal/cmd/dns/record-set/list/list_test.go | 23 +++---- .../cmd/dns/record-set/update/update_test.go | 36 +++++----- internal/cmd/dns/zone/clone/clone_test.go | 22 +++--- internal/cmd/dns/zone/create/create_test.go | 68 +++++++++---------- internal/cmd/dns/zone/delete/delete_test.go | 10 ++- .../cmd/dns/zone/describe/describe_test.go | 10 ++- internal/cmd/dns/zone/list/list.go | 22 +++--- internal/cmd/dns/zone/list/list_test.go | 19 +++--- internal/cmd/dns/zone/update/update_test.go | 54 +++++++-------- 13 files changed, 169 insertions(+), 184 deletions(-) diff --git a/internal/cmd/dns/record-set/create/create_test.go b/internal/cmd/dns/record-set/create/create_test.go index d284504bf..b08de66aa 100644 --- a/internal/cmd/dns/record-set/create/create_test.go +++ b/internal/cmd/dns/record-set/create/create_test.go @@ -17,8 +17,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -34,13 +32,13 @@ var recordTxtOver255Char = []string{ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, - commentFlag: "comment", - nameFlag: "example.com", - recordFlag: "1.1.1.1", - ttlFlag: "3600", - typeFlag: "SOA", // Non-default value + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, + commentFlag: "comment", + nameFlag: "example.com", + recordFlag: "1.1.1.1", + ttlFlag: "3600", + typeFlag: "SOA", // Non-default value } for _, mod := range mods { mod(flagValues) @@ -107,10 +105,10 @@ func TestParseInput(t *testing.T) { { description: "required fields only", flagValues: map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, - nameFlag: "example.com", - recordFlag: "1.1.1.1", + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, + nameFlag: "example.com", + recordFlag: "1.1.1.1", }, isValid: true, expectedModel: &inputModel{ @@ -127,12 +125,12 @@ func TestParseInput(t *testing.T) { { description: "zero values", flagValues: map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, - commentFlag: "", - nameFlag: "", - recordFlag: "1.1.1.1", - ttlFlag: "0", + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, + commentFlag: "", + nameFlag: "", + recordFlag: "1.1.1.1", + ttlFlag: "0", }, isValid: true, expectedModel: &inputModel{ @@ -151,21 +149,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/record-set/delete/delete_test.go b/internal/cmd/dns/record-set/delete/delete_test.go index c02628dd1..46a5c6d28 100644 --- a/internal/cmd/dns/record-set/delete/delete_test.go +++ b/internal/cmd/dns/record-set/delete/delete_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -35,8 +33,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, } for _, mod := range mods { mod(flagValues) @@ -104,7 +102,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -112,7 +110,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -120,7 +118,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/record-set/describe/describe_test.go b/internal/cmd/dns/record-set/describe/describe_test.go index 45d58c2a1..05d60ebcd 100644 --- a/internal/cmd/dns/record-set/describe/describe_test.go +++ b/internal/cmd/dns/record-set/describe/describe_test.go @@ -14,8 +14,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,8 +34,8 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, } for _, mod := range mods { mod(flagValues) @@ -105,7 +103,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -113,7 +111,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -121,7 +119,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index eedc2a59e..309013a2c 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -90,16 +90,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return err } - if len(recordSets) == 0 { - zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) - zoneLabel = model.ZoneId - } - params.Printer.Info("No record sets found for zone %s matching the criteria\n", zoneLabel) - return nil + + zoneLabel, err := dnsUtils.GetZoneName(ctx, apiClient, model.ProjectId, model.ZoneId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) + zoneLabel = model.ZoneId } - return outputResult(params.Printer, model.OutputFormat, recordSets) + + return outputResult(params.Printer, model.OutputFormat, zoneLabel, recordSets) }, } @@ -239,8 +237,13 @@ func fetchRecordSets(ctx context.Context, model *inputModel, apiClient dnsClient return recordSets, nil } -func outputResult(p *print.Printer, outputFormat string, recordSets []dns.RecordSet) error { +func outputResult(p *print.Printer, outputFormat, zoneLabel string, recordSets []dns.RecordSet) error { return p.OutputResult(outputFormat, recordSets, func() error { + if len(recordSets) == 0 { + p.Outputf("No record sets found for zone %s matching the criteria\n", zoneLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "STATUS", "TTL", "TYPE", "RECORD DATA") for i := range recordSets { diff --git a/internal/cmd/dns/record-set/list/list_test.go b/internal/cmd/dns/record-set/list/list_test.go index 6eaf5504b..67c60a202 100644 --- a/internal/cmd/dns/record-set/list/list_test.go +++ b/internal/cmd/dns/record-set/list/list_test.go @@ -20,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -31,10 +29,10 @@ var testZoneId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, - nameLikeFlag: "some-pattern", - orderByNameFlag: "asc", + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, + nameLikeFlag: "some-pattern", + orderByNameFlag: "asc", } for _, mod := range mods { mod(flagValues) @@ -130,8 +128,8 @@ func TestParseInput(t *testing.T) { { description: "required fields only", flagValues: map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, }, isValid: true, expectedModel: &inputModel{ @@ -146,21 +144,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -468,6 +466,7 @@ func TestFetchRecordSets(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + zoneLabel string recordSets []dns.RecordSet } tests := []struct { @@ -485,7 +484,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.recordSets); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.zoneLabel, tt.args.recordSets); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/dns/record-set/update/update_test.go b/internal/cmd/dns/record-set/update/update_test.go index 228b4b956..ccb5df9ee 100644 --- a/internal/cmd/dns/record-set/update/update_test.go +++ b/internal/cmd/dns/record-set/update/update_test.go @@ -16,8 +16,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -45,12 +43,12 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, - commentFlag: "comment", - nameFlag: "example.com", - recordFlag: "1.1.1.1", - ttlFlag: "3600", + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, + commentFlag: "comment", + nameFlag: "example.com", + recordFlag: "1.1.1.1", + ttlFlag: "3600", } for _, mod := range mods { mod(flagValues) @@ -132,8 +130,8 @@ func TestParseInput(t *testing.T) { description: "required flags only (no values to update)", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, }, isValid: false, expectedModel: &inputModel{ @@ -149,12 +147,12 @@ func TestParseInput(t *testing.T) { description: "zero values", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, - zoneIdFlag: testZoneId, - commentFlag: "", - nameFlag: "", - recordFlag: "1.1.1.1", - ttlFlag: "0", + globalflags.ProjectIdFlag: testProjectId, + zoneIdFlag: testZoneId, + commentFlag: "", + nameFlag: "", + recordFlag: "1.1.1.1", + ttlFlag: "0", }, isValid: true, expectedModel: &inputModel{ @@ -174,7 +172,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -182,7 +180,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -190,7 +188,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/zone/clone/clone_test.go b/internal/cmd/dns/zone/clone/clone_test.go index b17d634fe..59d0d13a8 100644 --- a/internal/cmd/dns/zone/clone/clone_test.go +++ b/internal/cmd/dns/zone/clone/clone_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,11 +34,11 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "example", - dnsNameFlag: "example.com", - descriptionFlag: "Example", - adjustRecordsFlag: "false", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "example", + dnsNameFlag: "example.com", + descriptionFlag: "Example", + adjustRecordsFlag: "false", } for _, mod := range mods { mod(flagValues) @@ -117,8 +115,8 @@ func TestParseInput(t *testing.T) { description: "required fields only", argValues: []string{testZoneId}, flagValues: map[string]string{ - projectIdFlag: testProjectId, - dnsNameFlag: "example.com", + globalflags.ProjectIdFlag: testProjectId, + dnsNameFlag: "example.com", }, isValid: true, expectedModel: &inputModel{ @@ -134,7 +132,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -142,7 +140,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -150,7 +148,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/zone/create/create_test.go b/internal/cmd/dns/zone/create/create_test.go index 8c7f58bc0..319147da1 100644 --- a/internal/cmd/dns/zone/create/create_test.go +++ b/internal/cmd/dns/zone/create/create_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -25,20 +23,20 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "example", - dnsNameFlag: "example.com", - defaultTTLFlag: "3600", - aclFlag: "0.0.0.0/0", - typeFlag: string(dns.CREATEZONEPAYLOADTYPE_PRIMARY), - primaryFlag: "1.1.1.1", - retryTimeFlag: "600", - refreshTimeFlag: "3600", - negativeCacheFlag: "60", - isReverseZoneFlag: "false", - expireTimeFlag: "36000000", - descriptionFlag: "Example", - contactEmailFlag: "example@example.com", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "example", + dnsNameFlag: "example.com", + defaultTTLFlag: "3600", + aclFlag: "0.0.0.0/0", + typeFlag: string(dns.CREATEZONEPAYLOADTYPE_PRIMARY), + primaryFlag: "1.1.1.1", + retryTimeFlag: "600", + refreshTimeFlag: "3600", + negativeCacheFlag: "60", + isReverseZoneFlag: "false", + expireTimeFlag: "36000000", + descriptionFlag: "Example", + contactEmailFlag: "example@example.com", } for _, mod := range mods { mod(flagValues) @@ -118,9 +116,9 @@ func TestParseInput(t *testing.T) { { description: "required fields only", flagValues: map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "example", - dnsNameFlag: "example.com", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "example", + dnsNameFlag: "example.com", }, isValid: true, expectedModel: &inputModel{ @@ -135,19 +133,19 @@ func TestParseInput(t *testing.T) { { description: "zero values", flagValues: map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "", - dnsNameFlag: "", - defaultTTLFlag: "0", - aclFlag: "", - typeFlag: "", - retryTimeFlag: "0", - refreshTimeFlag: "0", - negativeCacheFlag: "0", - isReverseZoneFlag: "false", - expireTimeFlag: "0", - descriptionFlag: "", - contactEmailFlag: "", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "", + dnsNameFlag: "", + defaultTTLFlag: "0", + aclFlag: "", + typeFlag: "", + retryTimeFlag: "0", + refreshTimeFlag: "0", + negativeCacheFlag: "0", + isReverseZoneFlag: "false", + expireTimeFlag: "0", + descriptionFlag: "", + contactEmailFlag: "", }, isValid: true, expectedModel: &inputModel{ @@ -173,21 +171,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/zone/delete/delete_test.go b/internal/cmd/dns/zone/delete/delete_test.go index a4b967998..32eabe63b 100644 --- a/internal/cmd/dns/zone/delete/delete_test.go +++ b/internal/cmd/dns/zone/delete/delete_test.go @@ -13,8 +13,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -34,7 +32,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, } for _, mod := range mods { mod(flagValues) @@ -101,7 +99,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -109,7 +107,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -117,7 +115,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/zone/describe/describe_test.go b/internal/cmd/dns/zone/describe/describe_test.go index 69a7f0587..a205a5cfd 100644 --- a/internal/cmd/dns/zone/describe/describe_test.go +++ b/internal/cmd/dns/zone/describe/describe_test.go @@ -14,8 +14,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -35,7 +33,7 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, } for _, mod := range mods { mod(flagValues) @@ -102,7 +100,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -110,7 +108,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -118,7 +116,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index e86c8ec78..132a362c7 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -86,17 +86,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return err } - if len(zones) == 0 { - projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) - projectLabel = model.ProjectId - } - params.Printer.Info("No zones found for project %q matching the criteria\n", projectLabel) - return nil + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId } - return outputResult(params.Printer, model.OutputFormat, zones) + return outputResult(params.Printer, model.OutputFormat, projectLabel, zones) }, } configureFlags(cmd) @@ -228,8 +225,13 @@ func fetchZones(ctx context.Context, model *inputModel, apiClient dnsClient) ([] return zones, nil } -func outputResult(p *print.Printer, outputFormat string, zones []dns.Zone) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, zones []dns.Zone) error { return p.OutputResult(outputFormat, zones, func() error { + if len(zones) == 0 { + p.Outputf("No zones found for project %q matching the criteria\n", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "STATE", "TYPE", "DNS NAME", "RECORD COUNT") for i := range zones { diff --git a/internal/cmd/dns/zone/list/list_test.go b/internal/cmd/dns/zone/list/list_test.go index bb46d6aea..14a7082f9 100644 --- a/internal/cmd/dns/zone/list/list_test.go +++ b/internal/cmd/dns/zone/list/list_test.go @@ -20,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -30,9 +28,9 @@ var testProjectId = uuid.NewString() func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - nameLikeFlag: "some-pattern", - orderByNameFlag: "asc", + globalflags.ProjectIdFlag: testProjectId, + nameLikeFlag: "some-pattern", + orderByNameFlag: "asc", } for _, mod := range mods { mod(flagValues) @@ -127,7 +125,7 @@ func TestParseInput(t *testing.T) { { description: "required fields only", flagValues: map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, }, isValid: true, expectedModel: &inputModel{ @@ -141,21 +139,21 @@ func TestParseInput(t *testing.T) { { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, { description: "project id invalid 1", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, { description: "project id invalid 2", flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, @@ -462,6 +460,7 @@ func TestFetchZones(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string zones []dns.Zone } tests := []struct { @@ -479,7 +478,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.zones); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.zones); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/dns/zone/update/update_test.go b/internal/cmd/dns/zone/update/update_test.go index adea3637d..4610849bd 100644 --- a/internal/cmd/dns/zone/update/update_test.go +++ b/internal/cmd/dns/zone/update/update_test.go @@ -15,8 +15,6 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/dns" ) -var projectIdFlag = globalflags.ProjectIdFlag - type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") @@ -36,17 +34,17 @@ func fixtureArgValues(mods ...func(argValues []string)) []string { func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "example", - defaultTTLFlag: "3600", - aclFlag: "0.0.0.0/0", - primaryFlag: "1.1.1.1", - retryTimeFlag: "600", - refreshTimeFlag: "3600", - negativeCacheFlag: "60", - expireTimeFlag: "36000000", - descriptionFlag: "Example", - contactEmailFlag: "example@example.com", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "example", + defaultTTLFlag: "3600", + aclFlag: "0.0.0.0/0", + primaryFlag: "1.1.1.1", + retryTimeFlag: "600", + refreshTimeFlag: "3600", + negativeCacheFlag: "60", + expireTimeFlag: "36000000", + descriptionFlag: "Example", + contactEmailFlag: "example@example.com", } for _, mod := range mods { mod(flagValues) @@ -136,7 +134,7 @@ func TestParseInput(t *testing.T) { description: "required flags only (no values to update)", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, + globalflags.ProjectIdFlag: testProjectId, }, isValid: false, expectedModel: &inputModel{ @@ -151,17 +149,17 @@ func TestParseInput(t *testing.T) { description: "zero values", argValues: fixtureArgValues(), flagValues: map[string]string{ - projectIdFlag: testProjectId, - nameFlag: "", - defaultTTLFlag: "0", - aclFlag: "", - primaryFlag: "", - retryTimeFlag: "0", - refreshTimeFlag: "0", - negativeCacheFlag: "0", - expireTimeFlag: "0", - descriptionFlag: "", - contactEmailFlag: "", + globalflags.ProjectIdFlag: testProjectId, + nameFlag: "", + defaultTTLFlag: "0", + aclFlag: "", + primaryFlag: "", + retryTimeFlag: "0", + refreshTimeFlag: "0", + negativeCacheFlag: "0", + expireTimeFlag: "0", + descriptionFlag: "", + contactEmailFlag: "", }, isValid: true, expectedModel: &inputModel{ @@ -186,7 +184,7 @@ func TestParseInput(t *testing.T) { description: "project id missing", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - delete(flagValues, projectIdFlag) + delete(flagValues, globalflags.ProjectIdFlag) }), isValid: false, }, @@ -194,7 +192,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 1", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "" + flagValues[globalflags.ProjectIdFlag] = "" }), isValid: false, }, @@ -202,7 +200,7 @@ func TestParseInput(t *testing.T) { description: "project id invalid 2", argValues: fixtureArgValues(), flagValues: fixtureFlagValues(func(flagValues map[string]string) { - flagValues[projectIdFlag] = "invalid-uuid" + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" }), isValid: false, }, From 122503be4e33ce868c7a7170fd12fedb9b22f894 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 17 Nov 2025 08:56:44 +0100 Subject: [PATCH 211/422] fix(deps): update module github.com/jedib0t/go-pretty/v6 to v6.7.2 (#1088) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 27664ec41..9fc4511c3 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.7.1 + github.com/jedib0t/go-pretty/v6 v6.7.2 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 diff --git a/go.sum b/go.sum index 2d88b3d6c..65d126b27 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.7.1 h1:bHDSsj93NuJ563hHuM7ohk/wpX7BmRFNIsVv1ssI2/M= -github.com/jedib0t/go-pretty/v6 v6.7.1/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.2 h1:EYWgQNIH/+JsyHki7ns9OHyBKuHPkzrBo02uYjran7w= +github.com/jedib0t/go-pretty/v6 v6.7.2/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From 235238399c260a4e075e0d2c0e17e90f425cefe7 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 18 Nov 2025 09:21:54 +0100 Subject: [PATCH 212/422] chore: remove typo in server create example (#1090) --- docs/stackit_server_create.md | 2 +- internal/cmd/server/create/create.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/stackit_server_create.md b/docs/stackit_server_create.md index 23378c5fa..27412840a 100644 --- a/docs/stackit_server_create.md +++ b/docs/stackit_server_create.md @@ -38,7 +38,7 @@ stackit server create [flags] $ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --volumes yyy Create a server with user data (cloud-init) - $ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml") + $ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml ``` ### Options diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 00ebd8254..afd46385c 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -105,7 +105,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { ), examples.NewExample( `Create a server with user data (cloud-init)`, - `$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml")`, + `$ stackit server create --machine-type t1.1 --name server1 --boot-volume-source-id xxx --boot-volume-source-type image --boot-volume-size 64 --user-data @path/to/file.yaml`, ), ), RunE: func(cmd *cobra.Command, args []string) error { From 9b86268dec8844953778ab510b91a79e2132cb26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 11:11:42 +0100 Subject: [PATCH 213/422] chore(deps): bump renovatebot/github-action from 44.0.2 to 44.0.3 (#1089) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 44.0.2 to 44.0.3. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v44.0.2...v44.0.3) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 44.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 41bef42a1..804c3206d 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v5 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.0.2 + uses: renovatebot/github-action@v44.0.3 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From b7f6a9e387d648140142b291a7edce9de3eee4cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Nov 2025 17:39:28 +0100 Subject: [PATCH 214/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/core from 0.19.0 to 0.20.0 (#1092) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9fc4511c3..558137a85 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.19.0 + github.com/stackitcloud/stackit-sdk-go/core v0.20.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 diff --git a/go.sum b/go.sum index 65d126b27..ad13b3f6c 100644 --- a/go.sum +++ b/go.sum @@ -561,8 +561,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.19.0 h1:dtJcs6/TTCzzb2RKI7HJugDrbCkaFEDmn1pOeFe8qnI= -github.com/stackitcloud/stackit-sdk-go/core v0.19.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= +github.com/stackitcloud/stackit-sdk-go/core v0.20.0 h1:4rrUk6uT1g4nOn5/g1uXukP07Tux/o5xbMz/f/qE1rY= +github.com/stackitcloud/stackit-sdk-go/core v0.20.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 h1:DaJkEN/6l+AJEQ3Dr+3IdKM4jywDQsTvuYHmRvFj3ho= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1/go.mod h1:SzA+UsSNv4D9IvNT7hwYPewgAvUgj5WXIU2tZ0XaMBI= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= From e42758d070856e3e9543ec835d86c8359cf19f49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 15:05:43 +0100 Subject: [PATCH 215/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex (#1098) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 558137a85..583daa5d5 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.30.0 golang.org/x/oauth2 v0.33.0 diff --git a/go.sum b/go.sum index ad13b3f6c..edba3a9de 100644 --- a/go.sum +++ b/go.sum @@ -611,8 +611,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2ia github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 h1:V6RFvybDeJvvmT3g7/BZodF0gozz3TEpahbpiTftbeY= github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0/go.mod h1:xRBgpJ8P5Nf1T5tD0tGAeNg1FNQzx5VF7qqOXt2Fp3s= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1 h1:r5808lRhtY8l5anft/UwgJEaef1XsoYObmwd3FVai48= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.1/go.mod h1:+LYy2pB+tpF0lkkmCf524wvv2Sa49REgEaNh7JGzN6Y= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 h1:aW8ehdoNRaCEs3xDr+YnGb6pru8zZTB8f7kl5lozlJE= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2/go.mod h1:Jsry+gfhuXv2P0ldfa48BaL605NhDjdQMgaoV8czlbo= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From 240257027ebddef0121830f54dd0914a491b5eda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:15:01 +0000 Subject: [PATCH 216/422] chore(deps): bump github.com/jedib0t/go-pretty/v6 from 6.7.2 to 6.7.3 (#1097) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 583daa5d5..7357dd57a 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.7.2 + github.com/jedib0t/go-pretty/v6 v6.7.3 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 diff --git a/go.sum b/go.sum index edba3a9de..d9dc64bc4 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.7.2 h1:EYWgQNIH/+JsyHki7ns9OHyBKuHPkzrBo02uYjran7w= -github.com/jedib0t/go-pretty/v6 v6.7.2/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.3 h1:i6IhmHUcZxxvxdgRTcIQk5N3ZMZqyQQyXLHDWxMxb3Y= +github.com/jedib0t/go-pretty/v6 v6.7.3/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From 18ea31b40dbfb6a5f32211061f03f4f43ddbd53f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:23:43 +0000 Subject: [PATCH 217/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/objectstorage (#1096) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7357dd57a..96fb45834 100644 --- a/go.mod +++ b/go.mod @@ -246,7 +246,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 diff --git a/go.sum b/go.sum index d9dc64bc4..084d5e0ca 100644 --- a/go.sum +++ b/go.sum @@ -583,8 +583,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIe github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/aGHepE/+gVsvSg1sRkPOyIUI/jkCyUOrWg= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0 h1:g3yNDUc3JydAikezUrI9bQ4nuMJpVeAQ35jOFfFmq1U= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.0/go.mod h1:foslkEiICdtHR3v0A/i/Rgo6EP9MMula9XNC9luNOgw= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7R74xuH/ztcPrDIuMp2KV3QQMjeE7lFudboM= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1/go.mod h1:h4aX5tyTQoO6KLrugkvfkqgKTjIzh7e4q9N92kT5OBs= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 h1:MA5i1ScjXLWe5CYeFCLHeZzNS1AH4mbx1kUyiVbxKjI= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= From a4510768062a2a022b4054f5ba63ff3a3d7f5eae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 14:32:19 +0000 Subject: [PATCH 218/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/logme (#1095) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 96fb45834..aff55ecea 100644 --- a/go.mod +++ b/go.mod @@ -244,7 +244,7 @@ require ( github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 diff --git a/go.sum b/go.sum index 084d5e0ca..ce063455b 100644 --- a/go.sum +++ b/go.sum @@ -577,8 +577,8 @@ github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 h1:bgMV+hi/530htdSMAy github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0/go.mod h1:QswbIN9TUYELIwkjO+Bu8Nk/FGcd3kZYDlf2n0PdFAk= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1 h1:hv5WrRU9rN6Jx4OwdOGJRyaQrfA9p1tzEoQK6/CDyoA= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.1/go.mod h1:ivt8lvnAoBZsde2jSAuicyn6RgTmHvvNAJ3whaUbAD4= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638gOKTZRAnnQuMhYqaliuz/A8BcfjhU= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2/go.mod h1:OlGmMlXKp33ZYpUm9TqaLYf8SdzhDW5uBKcbgq1zXOk= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIeh5XB2Ews2B9Lj5DJlMWIEJh60FfZ4Y= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/aGHepE/+gVsvSg1sRkPOyIUI/jkCyUOrWg= From f7d13600861f5e17549f5d5f0de99a156cbbcbd5 Mon Sep 17 00:00:00 2001 From: Yago Date: Fri, 21 Nov 2025 18:26:04 +0100 Subject: [PATCH 219/422] feat(intake): add runner command (#952) relates to STACKITINT-1349 --- docs/stackit_beta.md | 1 + docs/stackit_beta_intake.md | 34 ++ docs/stackit_beta_intake_runner.md | 38 +++ docs/stackit_beta_intake_runner_create.md | 48 +++ docs/stackit_beta_intake_runner_delete.md | 40 +++ docs/stackit_beta_intake_runner_describe.md | 43 +++ docs/stackit_beta_intake_runner_list.md | 47 +++ docs/stackit_beta_intake_runner_update.md | 48 +++ docs/stackit_config_set.md | 1 + docs/stackit_config_unset.md | 1 + go.mod | 1 + go.sum | 2 + internal/cmd/beta/beta.go | 2 + internal/cmd/beta/intake/intake.go | 26 ++ .../cmd/beta/intake/runner/create/create.go | 170 ++++++++++ .../beta/intake/runner/create/create_test.go | 293 ++++++++++++++++++ .../cmd/beta/intake/runner/delete/delete.go | 115 +++++++ .../beta/intake/runner/delete/delete_test.go | 155 +++++++++ .../beta/intake/runner/describe/describe.go | 117 +++++++ .../intake/runner/describe/describe_test.go | 192 ++++++++++++ internal/cmd/beta/intake/runner/list/list.go | 152 +++++++++ .../cmd/beta/intake/runner/list/list_test.go | 197 ++++++++++++ internal/cmd/beta/intake/runner/runner.go | 31 ++ .../cmd/beta/intake/runner/update/update.go | 176 +++++++++++ .../beta/intake/runner/update/update_test.go | 277 +++++++++++++++++ internal/cmd/config/set/set.go | 4 + internal/cmd/config/unset/unset.go | 7 + internal/cmd/config/unset/unset_test.go | 3 + internal/pkg/config/config.go | 3 + internal/pkg/services/intake/client/client.go | 14 + 30 files changed, 2238 insertions(+) create mode 100644 docs/stackit_beta_intake.md create mode 100644 docs/stackit_beta_intake_runner.md create mode 100644 docs/stackit_beta_intake_runner_create.md create mode 100644 docs/stackit_beta_intake_runner_delete.md create mode 100644 docs/stackit_beta_intake_runner_describe.md create mode 100644 docs/stackit_beta_intake_runner_list.md create mode 100644 docs/stackit_beta_intake_runner_update.md create mode 100644 internal/cmd/beta/intake/intake.go create mode 100644 internal/cmd/beta/intake/runner/create/create.go create mode 100644 internal/cmd/beta/intake/runner/create/create_test.go create mode 100644 internal/cmd/beta/intake/runner/delete/delete.go create mode 100644 internal/cmd/beta/intake/runner/delete/delete_test.go create mode 100644 internal/cmd/beta/intake/runner/describe/describe.go create mode 100644 internal/cmd/beta/intake/runner/describe/describe_test.go create mode 100644 internal/cmd/beta/intake/runner/list/list.go create mode 100644 internal/cmd/beta/intake/runner/list/list_test.go create mode 100644 internal/cmd/beta/intake/runner/runner.go create mode 100644 internal/cmd/beta/intake/runner/update/update.go create mode 100644 internal/cmd/beta/intake/runner/update/update_test.go create mode 100644 internal/pkg/services/intake/client/client.go diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index 23097f8ca..c099db5b3 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -42,6 +42,7 @@ stackit beta [flags] * [stackit](./stackit.md) - Manage STACKIT resources using the command line * [stackit beta alb](./stackit_beta_alb.md) - Manages application loadbalancers +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex diff --git a/docs/stackit_beta_intake.md b/docs/stackit_beta_intake.md new file mode 100644 index 000000000..f44d3c12d --- /dev/null +++ b/docs/stackit_beta_intake.md @@ -0,0 +1,34 @@ +## stackit beta intake + +Provides functionality for intake + +### Synopsis + +Provides functionality for intake. + +``` +stackit beta intake [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta intake" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners + diff --git a/docs/stackit_beta_intake_runner.md b/docs/stackit_beta_intake_runner.md new file mode 100644 index 000000000..7d5c60ff3 --- /dev/null +++ b/docs/stackit_beta_intake_runner.md @@ -0,0 +1,38 @@ +## stackit beta intake runner + +Provides functionality for Intake Runners + +### Synopsis + +Provides functionality for Intake Runners. + +``` +stackit beta intake runner [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta intake runner" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake +* [stackit beta intake runner create](./stackit_beta_intake_runner_create.md) - Creates a new Intake Runner +* [stackit beta intake runner delete](./stackit_beta_intake_runner_delete.md) - Deletes an Intake Runner +* [stackit beta intake runner describe](./stackit_beta_intake_runner_describe.md) - Shows details of an Intake Runner +* [stackit beta intake runner list](./stackit_beta_intake_runner_list.md) - Lists all Intake Runners +* [stackit beta intake runner update](./stackit_beta_intake_runner_update.md) - Updates an Intake Runner + diff --git a/docs/stackit_beta_intake_runner_create.md b/docs/stackit_beta_intake_runner_create.md new file mode 100644 index 000000000..8903cef9d --- /dev/null +++ b/docs/stackit_beta_intake_runner_create.md @@ -0,0 +1,48 @@ +## stackit beta intake runner create + +Creates a new Intake Runner + +### Synopsis + +Creates a new Intake Runner. + +``` +stackit beta intake runner create [flags] +``` + +### Examples + +``` + Create a new Intake Runner with a display name and message capacity limits + $ stackit beta intake runner create --display-name my-runner --max-message-size-kib 1000 --max-messages-per-hour 5000 + + Create a new Intake Runner with a description and labels + $ stackit beta intake runner create --display-name my-runner --max-message-size-kib 1000 --max-messages-per-hour 5000 --description "Main runner for production" --labels="env=prod,team=billing" +``` + +### Options + +``` + --description string Description + --display-name string Display name + -h, --help Help for "stackit beta intake runner create" + --labels stringToString Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2" (default []) + --max-message-size-kib int Maximum message size in KiB + --max-messages-per-hour int Maximum number of messages per hour +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners + diff --git a/docs/stackit_beta_intake_runner_delete.md b/docs/stackit_beta_intake_runner_delete.md new file mode 100644 index 000000000..0fa94ae5f --- /dev/null +++ b/docs/stackit_beta_intake_runner_delete.md @@ -0,0 +1,40 @@ +## stackit beta intake runner delete + +Deletes an Intake Runner + +### Synopsis + +Deletes an Intake Runner. + +``` +stackit beta intake runner delete RUNNER_ID [flags] +``` + +### Examples + +``` + Delete an Intake Runner with ID "xxx" + $ stackit beta intake runner delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta intake runner delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners + diff --git a/docs/stackit_beta_intake_runner_describe.md b/docs/stackit_beta_intake_runner_describe.md new file mode 100644 index 000000000..11814b10d --- /dev/null +++ b/docs/stackit_beta_intake_runner_describe.md @@ -0,0 +1,43 @@ +## stackit beta intake runner describe + +Shows details of an Intake Runner + +### Synopsis + +Shows details of an Intake Runner. + +``` +stackit beta intake runner describe RUNNER_ID [flags] +``` + +### Examples + +``` + Get details of an Intake Runner with ID "xxx" + $ stackit beta intake runner describe xxx + + Get details of an Intake Runner with ID "xxx" in JSON format + $ stackit beta intake runner describe xxx --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta intake runner describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners + diff --git a/docs/stackit_beta_intake_runner_list.md b/docs/stackit_beta_intake_runner_list.md new file mode 100644 index 000000000..aaf5c9e59 --- /dev/null +++ b/docs/stackit_beta_intake_runner_list.md @@ -0,0 +1,47 @@ +## stackit beta intake runner list + +Lists all Intake Runners + +### Synopsis + +Lists all Intake Runners for the current project. + +``` +stackit beta intake runner list [flags] +``` + +### Examples + +``` + List all Intake Runners + $ stackit beta intake runner list + + List all Intake Runners in JSON format + $ stackit beta intake runner list --output-format json + + List up to 5 Intake Runners + $ stackit beta intake runner list --limit 5 +``` + +### Options + +``` + -h, --help Help for "stackit beta intake runner list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners + diff --git a/docs/stackit_beta_intake_runner_update.md b/docs/stackit_beta_intake_runner_update.md new file mode 100644 index 000000000..d02cb7c84 --- /dev/null +++ b/docs/stackit_beta_intake_runner_update.md @@ -0,0 +1,48 @@ +## stackit beta intake runner update + +Updates an Intake Runner + +### Synopsis + +Updates an Intake Runner. Only the specified fields are updated. + +``` +stackit beta intake runner update RUNNER_ID [flags] +``` + +### Examples + +``` + Update the display name of an Intake Runner with ID "xxx" + $ stackit beta intake runner update xxx --display-name "new-runner-name" + + Update the message capacity limits for an Intake Runner with ID "xxx" + $ stackit beta intake runner update xxx --max-message-size-kib 1000 --max-messages-per-hour 10000 +``` + +### Options + +``` + --description string Description + --display-name string Display name + -h, --help Help for "stackit beta intake runner update" + --labels stringToString Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2". (default []) + --max-message-size-kib int Maximum message size in KiB. Note: Overall message capacity cannot be decreased. + --max-messages-per-hour int Maximum number of messages per hour. Note: Overall message capacity cannot be decreased. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners + diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index 9b07e46b5..1b4549617 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -36,6 +36,7 @@ stackit config set [flags] --iaas-custom-endpoint string IaaS API base URL, used in calls to this API --identity-provider-custom-client-id string Identity Provider client ID, used for user authentication --identity-provider-custom-well-known-configuration string Identity Provider well-known OpenID configuration URL, used for user authentication + --intake-custom-endpoint string Intake API base URL, used in calls to this API --kms-custom-endpoint string KMS API base URL, used in calls to this API --load-balancer-custom-endpoint string Load Balancer API base URL, used in calls to this API --logme-custom-endpoint string LogMe API base URL, used in calls to this API diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 9d4c83088..cfe34ab0b 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -34,6 +34,7 @@ stackit config unset [flags] --iaas-custom-endpoint IaaS API base URL. If unset, uses the default base URL --identity-provider-custom-client-id Identity Provider client ID, used for user authentication --identity-provider-custom-well-known-configuration Identity Provider well-known OpenID configuration URL. If unset, uses the default identity provider + --intake-custom-endpoint Intake API base URL. If unset, uses the default base URL --kms-custom-endpoint KMS API base URL. If unset, uses the default base URL --load-balancer-custom-endpoint Load Balancer API base URL. If unset, uses the default base URL --logme-custom-endpoint LogMe API base URL. If unset, uses the default base URL diff --git a/go.mod b/go.mod index aff55ecea..36c488755 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index ce063455b..edd2192ab 100644 --- a/go.sum +++ b/go.sum @@ -573,6 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7g github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 h1:bkvq3Y4OcGyCR5N69tyY7ZTcrVN+htGTa2ZBJL5BQTQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0/go.mod h1:tg1rHvgFRG9gNCYnTepZFaSCBahhLLjkIb3nRbtyjDQ= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 h1:OdY3eXn98hWIhZBH8qQTFsYP6cag8B29UdwTjMwAjfw= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0/go.mod h1:mf+DQwwTVfc8MD0vwTNPzin2unKAIyQRYywv3wUyH38= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 h1:bgMV+hi/530htdSMAyRBrltR7Czinb56HQBT36wnVMU= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0/go.mod h1:QswbIN9TUYELIwkjO+Bu8Nk/FGcd3kZYDlf2n0PdFAk= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index b026da770..a60570613 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" "github.com/stackitcloud/stackit-cli/internal/cmd/params" @@ -39,5 +40,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(sqlserverflex.NewCmd(params)) cmd.AddCommand(alb.NewCmd(params)) + cmd.AddCommand(intake.NewCmd(params)) cmd.AddCommand(kms.NewCmd(params)) } diff --git a/internal/cmd/beta/intake/intake.go b/internal/cmd/beta/intake/intake.go new file mode 100644 index 000000000..96533f29c --- /dev/null +++ b/internal/cmd/beta/intake/intake.go @@ -0,0 +1,26 @@ +package intake + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +// NewCmd creates the 'stackit intake' command +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "intake", + Short: "Provides functionality for intake", + Long: "Provides functionality for intake.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { + cmd.AddCommand(runner.NewCmd(params)) +} diff --git a/internal/cmd/beta/intake/runner/create/create.go b/internal/cmd/beta/intake/runner/create/create.go new file mode 100644 index 000000000..1a6ed58ec --- /dev/null +++ b/internal/cmd/beta/intake/runner/create/create.go @@ -0,0 +1,170 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + displayNameFlag = "display-name" + maxMessageSizeKiBFlag = "max-message-size-kib" + maxMessagesPerHourFlag = "max-messages-per-hour" + descriptionFlag = "description" + labelFlag = "labels" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + DisplayName *string + MaxMessageSizeKiB *int64 + MaxMessagesPerHour *int64 + Description *string + Labels *map[string]string +} + +func NewCmd(p *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a new Intake Runner", + Long: "Creates a new Intake Runner.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a new Intake Runner with a display name and message capacity limits`, + `$ stackit beta intake runner create --display-name my-runner --max-message-size-kib 1000 --max-messages-per-hour 5000`), + examples.NewExample( + `Create a new Intake Runner with a description and labels`, + `$ stackit beta intake runner create --display-name my-runner --max-message-size-kib 1000 --max-messages-per-hour 5000 --description "Main runner for production" --labels="env=prod,team=billing"`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create an Intake Runner for project %q?", projectLabel) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create Intake Runner: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(p.Printer) + s.Start("Creating STACKIT Intake Runner") + _, err = wait.CreateOrUpdateIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resp.GetId()).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for STACKIT Intake Runner creation: %w", err) + } + s.Stop() + } + + return outputResult(p.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().Int64(maxMessageSizeKiBFlag, 0, "Maximum message size in KiB") + cmd.Flags().Int64(maxMessagesPerHourFlag, 0, "Maximum number of messages per hour") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringToString(labelFlag, nil, "Labels in key=value format, separated by commas. Example: --labels \"key1=value1,key2=value2\"") + + err := flags.MarkFlagsRequired(cmd, displayNameFlag, maxMessageSizeKiBFlag, maxMessagesPerHourFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + MaxMessageSizeKiB: flags.FlagToInt64Pointer(p, cmd, maxMessageSizeKiBFlag), + MaxMessagesPerHour: flags.FlagToInt64Pointer(p, cmd, maxMessagesPerHourFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiCreateIntakeRunnerRequest { + // Start building the request by calling the base method with path parameters + req := apiClient.CreateIntakeRunner(ctx, model.ProjectId, model.Region) + + // Create the payload struct with data from the input model + payload := intake.CreateIntakeRunnerPayload{ + DisplayName: model.DisplayName, + MaxMessageSizeKiB: model.MaxMessageSizeKiB, + MaxMessagesPerHour: model.MaxMessagesPerHour, + Description: model.Description, + Labels: model.Labels, + } + // Attach the payload to the request builder + req = req.CreateIntakeRunnerPayload(payload) + + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *intake.IntakeRunnerResponse) error { + return p.OutputResult(model.OutputFormat, resp, func() error { + if resp == nil { + p.Outputf("Triggered creation of Intake Runner for project %q, but no runner ID was returned.\n", projectLabel) + return nil + } + + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s Intake Runner for project %q. Runner ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/intake/runner/create/create_test.go b/internal/cmd/beta/intake/runner/create/create_test.go new file mode 100644 index 000000000..6ddcaa4a1 --- /dev/null +++ b/internal/cmd/beta/intake/runner/create/create_test.go @@ -0,0 +1,293 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// Define a unique key for the context to avoid collisions +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testDisplayName = "testrunner" + testMaxMessageSizeKiB = int64(1024) + testMaxMessagesPerHour = int64(10000) + testDescription = "This is a test runner" + testLabelsString = "env=test,team=dev" +) + +var ( + // testCtx dummy context for testing purposes + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + // testClient mock API client + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + + testLabels = map[string]string{"env": "test", "team": "dev"} +) + +// fixtureFlagValues generates a map of flag values for tests +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + maxMessageSizeKiBFlag: "1024", + maxMessagesPerHourFlag: "10000", + descriptionFlag: testDescription, + labelFlag: testLabelsString, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// fixtureInputModel generates an input model for tests +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + DisplayName: utils.Ptr(testDisplayName), + MaxMessageSizeKiB: utils.Ptr(testMaxMessageSizeKiB), + MaxMessagesPerHour: utils.Ptr(testMaxMessagesPerHour), + Description: utils.Ptr(testDescription), + Labels: utils.Ptr(testLabels), + } + for _, mod := range mods { + mod(model) + } + return model +} + +// fixtureCreatePayload generates a CreateIntakeRunnerPayload for tests +func fixtureCreatePayload(mods ...func(payload *intake.CreateIntakeRunnerPayload)) intake.CreateIntakeRunnerPayload { + payload := intake.CreateIntakeRunnerPayload{ + DisplayName: utils.Ptr(testDisplayName), + MaxMessageSizeKiB: utils.Ptr(testMaxMessageSizeKiB), + MaxMessagesPerHour: utils.Ptr(testMaxMessagesPerHour), + Description: utils.Ptr(testDescription), + Labels: utils.Ptr(testLabels), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +// fixtureRequest generates an API request for tests +func fixtureRequest(mods ...func(request *intake.ApiCreateIntakeRunnerRequest)) intake.ApiCreateIntakeRunnerRequest { + request := testClient.CreateIntakeRunner(testCtx, testProjectId, testRegion) + request = request.CreateIntakeRunnerPayload(fixtureCreatePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "display name missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, displayNameFlag) + }), + isValid: false, + }, + { + description: "max message size missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, maxMessageSizeKiBFlag) + }), + isValid: false, + }, + { + description: "max messages per hour missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, maxMessagesPerHourFlag) + }), + isValid: false, + }, + { + description: "required fields only", + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + maxMessageSizeKiBFlag: "1024", + maxMessagesPerHourFlag: "10000", + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.Labels = nil + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + parseInputWrapper := func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + } + testutils.TestParseInput(t, NewCmd, parseInputWrapper, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiCreateIntakeRunnerRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "no optionals", + model: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.Labels = nil + }), + expectedRequest: fixtureRequest(func(request *intake.ApiCreateIntakeRunnerRequest) { + *request = (*request).CreateIntakeRunnerPayload(fixtureCreatePayload(func(payload *intake.CreateIntakeRunnerPayload) { + payload.Description = nil + payload.Labels = nil + })) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + projectLabel string + resp *intake.IntakeRunnerResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{ + model: fixtureInputModel(), + projectLabel: "my-project", + resp: &intake.IntakeRunnerResponse{Id: utils.Ptr("runner-id-123")}, + }, + wantErr: false, + }, + { + name: "default output - async", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Async = true + }), + projectLabel: "my-project", + resp: &intake.IntakeRunnerResponse{Id: utils.Ptr("runner-id-123")}, + }, + wantErr: false, + }, + { + name: "json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: &intake.IntakeRunnerResponse{Id: utils.Ptr("runner-id-123")}, + }, + wantErr: false, + }, + { + name: "nil response - default output", + args: args{ + model: fixtureInputModel(), + resp: nil, + }, + wantErr: false, + }, + { + name: "nil response - json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: nil, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/runner/delete/delete.go b/internal/cmd/beta/intake/runner/delete/delete.go new file mode 100644 index 000000000..e74551a7d --- /dev/null +++ b/internal/cmd/beta/intake/runner/delete/delete.go @@ -0,0 +1,115 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" +) + +const ( + runnerIdArg = "RUNNER_ID" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + RunnerId string +} + +// NewCmd creates a new cobra command for deleting an Intake Runner +func NewCmd(p *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", runnerIdArg), + Short: "Deletes an Intake Runner", + Long: "Deletes an Intake Runner.", + Args: args.SingleArg(runnerIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete an Intake Runner with ID "xxx"`, + `$ stackit beta intake runner delete xxx`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete Intake Runner %q?", model.RunnerId) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + if err = req.Execute(); err != nil { + return fmt.Errorf("delete Intake Runner: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(p.Printer) + s.Start("Deleting STACKIT Intake Runner") + _, err = wait.DeleteIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.RunnerId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for STACKIT Intake Runner deletion: %w", err) + } + s.Stop() + } + + operationState := "Deleted" + if model.Async { + operationState = "Triggered deletion of" + } + p.Printer.Outputf("%s stackit Intake Runner %s \n", operationState, model.RunnerId) + + return nil + }, + } + return cmd +} + +// parseInput parses the command arguments and flags into a standardized model +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + runnerId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + RunnerId: runnerId, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to delete an Intake Runner +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiDeleteIntakeRunnerRequest { + req := apiClient.DeleteIntakeRunner(ctx, model.ProjectId, model.Region, model.RunnerId) + return req +} diff --git a/internal/cmd/beta/intake/runner/delete/delete_test.go b/internal/cmd/beta/intake/runner/delete/delete_test.go new file mode 100644 index 000000000..b99edac92 --- /dev/null +++ b/internal/cmd/beta/intake/runner/delete/delete_test.go @@ -0,0 +1,155 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// Define a unique key for the context to avoid collisions +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + // testCtx is a dummy context for testing purposes + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + // testClient is a mock API client + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testRunnerId = uuid.NewString() +) + +// fixtureArgValues generates a slice of arguments for tests +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRunnerId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// fixtureFlagValues generates a map of flag values for tests +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// fixtureInputModel generates an input model for tests +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + RunnerId: testRunnerId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// fixtureRequest generates an API request for tests +func fixtureRequest(mods ...func(request *intake.ApiDeleteIntakeRunnerRequest)) intake.ApiDeleteIntakeRunnerRequest { + request := testClient.DeleteIntakeRunner(testCtx, testProjectId, testRegion, testRunnerId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "runner id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiDeleteIntakeRunnerRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/intake/runner/describe/describe.go b/internal/cmd/beta/intake/runner/describe/describe.go new file mode 100644 index 000000000..b5ba12ae7 --- /dev/null +++ b/internal/cmd/beta/intake/runner/describe/describe.go @@ -0,0 +1,117 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + runnerIdArg = "RUNNER_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + RunnerId string +} + +func NewCmd(p *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", runnerIdArg), + Short: "Shows details of an Intake Runner", + Long: "Shows details of an Intake Runner.", + Args: args.SingleArg(runnerIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of an Intake Runner with ID "xxx"`, + `$ stackit beta intake runner describe xxx`), + examples.NewExample( + `Get details of an Intake Runner with ID "xxx" in JSON format`, + `$ stackit beta intake runner describe xxx --output-format json`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API to get a single runner + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get Intake Runner: %w", err) + } + + return outputResult(p.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + runnerId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + RunnerId: runnerId, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to get a single Intake Runner +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiGetIntakeRunnerRequest { + req := apiClient.GetIntakeRunner(ctx, model.ProjectId, model.Region, model.RunnerId) + return req +} + +// outputResult formats the API response and prints it to the console +func outputResult(p *print.Printer, outputFormat string, runner *intake.IntakeRunnerResponse) error { + if runner == nil { + return fmt.Errorf("received nil runner, could not display details") + } + return p.OutputResult(outputFormat, runner, func() error { + table := tables.NewTable() + table.SetHeader("Attribute", "Value") + table.AddRow("ID", runner.GetId()) + table.AddRow("Name", runner.GetDisplayName()) + table.AddRow("State", runner.GetState()) + table.AddRow("Created", runner.GetCreateTime()) + table.AddRow("Labels", runner.GetLabels()) + table.AddRow("Description", runner.GetDescription()) + table.AddRow("Max Message Size (KiB)", runner.GetMaxMessageSizeKiB()) + table.AddRow("Max Messages/Hour", runner.GetMaxMessagesPerHour()) + table.AddRow("Ingestion URI", runner.GetUri()) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/intake/runner/describe/describe_test.go b/internal/cmd/beta/intake/runner/describe/describe_test.go new file mode 100644 index 000000000..9235ac723 --- /dev/null +++ b/internal/cmd/beta/intake/runner/describe/describe_test.go @@ -0,0 +1,192 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testRunnerId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRunnerId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + RunnerId: testRunnerId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiGetIntakeRunnerRequest)) intake.ApiGetIntakeRunnerRequest { + request := testClient.GetIntakeRunner(testCtx, testProjectId, testRegion, testRunnerId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "runner id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiGetIntakeRunnerRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + runner *intake.IntakeRunnerResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", runner: &intake.IntakeRunnerResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, runner: &intake.IntakeRunnerResponse{}}, + wantErr: false, + }, + { + name: "yaml output", + args: args{outputFormat: print.YAMLOutputFormat, runner: &intake.IntakeRunnerResponse{}}, + wantErr: false, + }, + { + name: "nil runner", + args: args{runner: nil}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.runner); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/runner/list/list.go b/internal/cmd/beta/intake/runner/list/list.go new file mode 100644 index 000000000..d3df6751f --- /dev/null +++ b/internal/cmd/beta/intake/runner/list/list.go @@ -0,0 +1,152 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +const ( + limitFlag = "limit" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +// NewCmd creates a new cobra command for listing Intake Runners +func NewCmd(p *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all Intake Runners", + Long: "Lists all Intake Runners for the current project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all Intake Runners`, + `$ stackit beta intake runner list`), + examples.NewExample( + `List all Intake Runners in JSON format`, + `$ stackit beta intake runner list --output-format json`), + examples.NewExample( + `List up to 5 Intake Runners`, + `$ stackit beta intake runner list --limit 5`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list Intake Runners: %w", err) + } + runners := resp.GetIntakeRunners() + + // Truncate output + if model.Limit != nil && len(runners) > int(*model.Limit) { + runners = runners[:*model.Limit] + } + + projectLabel := model.ProjectId + if len(runners) == 0 { + projectLabel, err = projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + } + } + + return outputResult(p.Printer, model.OutputFormat, projectLabel, runners) + }, + } + configureFlags(cmd) + return cmd +} + +// configureFlags adds the --limit flag to the command +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +// parseInput parses the command flags into a standardized model +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to list Intake Runners +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiListIntakeRunnersRequest { + req := apiClient.ListIntakeRunners(ctx, model.ProjectId, model.Region) + // Note: we do support API pagination, but for consistency with other services, we fetch all items and apply + // client-side limit. + // A more advanced implementation could use the --limit flag to set the API's PageSize. + return req +} + +// outputResult formats the API response and prints it to the console +func outputResult(p *print.Printer, outputFormat, projectLabel string, runners []intake.IntakeRunnerResponse) error { + return p.OutputResult(outputFormat, runners, func() error { + if len(runners) == 0 { + p.Outputf("No intake runners found for project %q\n", projectLabel) + return nil + } + + table := tables.NewTable() + + table.SetHeader("ID", "NAME", "STATE") + for _, runner := range runners { + table.AddRow( + runner.GetId(), + runner.GetDisplayName(), + runner.GetState(), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/intake/runner/list/list_test.go b/internal/cmd/beta/intake/runner/list/list_test.go new file mode 100644 index 000000000..582adab2c --- /dev/null +++ b/internal/cmd/beta/intake/runner/list/list_test.go @@ -0,0 +1,197 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testLimit = int64(5) +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiListIntakeRunnersRequest)) intake.ApiListIntakeRunnersRequest { + request := testClient.ListIntakeRunners(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "with limit", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = strconv.FormatInt(testLimit, 10) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(testLimit) + }), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "limit is zero", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + { + description: "limit is negative", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-1" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiListIntakeRunnersRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + runners []intake.IntakeRunnerResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", runners: []intake.IntakeRunnerResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, runners: []intake.IntakeRunnerResponse{}}, + wantErr: false, + }, + { + name: "empty slice", + args: args{runners: []intake.IntakeRunnerResponse{}}, + wantErr: false, + }, + { + name: "nil slice", + args: args{runners: nil}, + wantErr: false, + }, + { + name: "empty intake runner in slice", + args: args{ + runners: []intake.IntakeRunnerResponse{{}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, "dummy-projectlabel", tt.args.runners); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/runner/runner.go b/internal/cmd/beta/intake/runner/runner.go new file mode 100644 index 000000000..0708b4ae2 --- /dev/null +++ b/internal/cmd/beta/intake/runner/runner.go @@ -0,0 +1,31 @@ +package runner + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "runner", + Short: "Provides functionality for Intake Runners", + Long: "Provides functionality for Intake Runners.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + // Pass the params down to each action command + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + + return cmd +} diff --git a/internal/cmd/beta/intake/runner/update/update.go b/internal/cmd/beta/intake/runner/update/update.go new file mode 100644 index 000000000..9ebb4a81e --- /dev/null +++ b/internal/cmd/beta/intake/runner/update/update.go @@ -0,0 +1,176 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" +) + +const ( + runnerIdArg = "RUNNER_ID" +) + +const ( + displayNameFlag = "display-name" + maxMessageSizeKiBFlag = "max-message-size-kib" + maxMessagesPerHourFlag = "max-messages-per-hour" + descriptionFlag = "description" + labelFlag = "labels" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + RunnerId string + DisplayName *string + MaxMessageSizeKiB *int64 + MaxMessagesPerHour *int64 + Description *string + Labels *map[string]string +} + +func NewCmd(p *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", runnerIdArg), + Short: "Updates an Intake Runner", + Long: "Updates an Intake Runner. Only the specified fields are updated.", + Args: args.SingleArg(runnerIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update the display name of an Intake Runner with ID "xxx"`, + `$ stackit beta intake runner update xxx --display-name "new-runner-name"`), + examples.NewExample( + `Update the message capacity limits for an Intake Runner with ID "xxx"`, + `$ stackit beta intake runner update xxx --max-message-size-kib 1000 --max-messages-per-hour 10000`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update Intake Runner: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(p.Printer) + s.Start("Updating STACKIT Intake Runner") + _, err = wait.CreateOrUpdateIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.RunnerId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for STACKIT Intake Runner update: %w", err) + } + s.Stop() + } + + return outputResult(p.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().Int64(maxMessageSizeKiBFlag, 0, "Maximum message size in KiB. Note: Overall message capacity cannot be decreased.") + cmd.Flags().Int64(maxMessagesPerHourFlag, 0, "Maximum number of messages per hour. Note: Overall message capacity cannot be decreased.") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringToString(labelFlag, nil, `Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2".`) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + runnerId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + RunnerId: runnerId, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + MaxMessageSizeKiB: flags.FlagToInt64Pointer(p, cmd, maxMessageSizeKiBFlag), + MaxMessagesPerHour: flags.FlagToInt64Pointer(p, cmd, maxMessagesPerHourFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), + } + + if model.DisplayName == nil && model.MaxMessageSizeKiB == nil && model.MaxMessagesPerHour == nil && model.Description == nil && model.Labels == nil { + return nil, &cliErr.EmptyUpdateError{} + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiUpdateIntakeRunnerRequest { + req := apiClient.UpdateIntakeRunner(ctx, model.ProjectId, model.Region, model.RunnerId) + + payload := intake.UpdateIntakeRunnerPayload{} + if model.DisplayName != nil { + payload.DisplayName = model.DisplayName + } + if model.MaxMessageSizeKiB != nil { + payload.MaxMessageSizeKiB = model.MaxMessageSizeKiB + } + if model.MaxMessagesPerHour != nil { + payload.MaxMessagesPerHour = model.MaxMessagesPerHour + } + if model.Description != nil { + payload.Description = model.Description + } + if model.Labels != nil { + payload.Labels = model.Labels + } + + req = req.UpdateIntakeRunnerPayload(payload) + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *intake.IntakeRunnerResponse) error { + return p.OutputResult(model.OutputFormat, resp, func() error { + if resp == nil { + p.Outputf("Triggered update of Intake Runner for project %q, but no runner ID was returned.\n", projectLabel) + return nil + } + + operationState := "Updated" + if model.Async { + operationState = "Triggered update of" + } + p.Outputf("%s Intake Runner for project %q. Runner ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/intake/runner/update/update_test.go b/internal/cmd/beta/intake/runner/update/update_test.go new file mode 100644 index 000000000..9b4ae7afa --- /dev/null +++ b/internal/cmd/beta/intake/runner/update/update_test.go @@ -0,0 +1,277 @@ +package update + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testRunnerId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRunnerId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: "new-runner-name", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + RunnerId: testRunnerId, + DisplayName: utils.Ptr("new-runner-name"), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiUpdateIntakeRunnerRequest)) intake.ApiUpdateIntakeRunnerRequest { + request := testClient.UpdateIntakeRunner(testCtx, testProjectId, testRegion, testRunnerId) + payload := intake.UpdateIntakeRunnerPayload{ + DisplayName: utils.Ptr("new-runner-name"), + } + request = request.UpdateIntakeRunnerPayload(payload) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no update flags provided", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + }, + isValid: false, + }, + { + description: "update all fields", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[maxMessageSizeKiBFlag] = "2048" + flagValues[maxMessagesPerHourFlag] = "10000" + flagValues[descriptionFlag] = "new description" + flagValues[labelFlag] = "env=prod,team=sre" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.MaxMessageSizeKiB = utils.Ptr(int64(2048)) + model.MaxMessagesPerHour = utils.Ptr(int64(10000)) + model.Description = utils.Ptr("new description") + model.Labels = utils.Ptr(map[string]string{"env": "prod", "team": "sre"}) + }), + }, + { + description: "no args", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiUpdateIntakeRunnerRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "update description and labels", + model: fixtureInputModel(func(model *inputModel) { + model.DisplayName = nil + model.Description = utils.Ptr("new-desc") + model.Labels = utils.Ptr(map[string]string{"key": "value"}) + }), + expectedRequest: fixtureRequest(func(request *intake.ApiUpdateIntakeRunnerRequest) { + payload := intake.UpdateIntakeRunnerPayload{ + Description: utils.Ptr("new-desc"), + Labels: utils.Ptr(map[string]string{"key": "value"}), + } + *request = (*request).UpdateIntakeRunnerPayload(payload) + }), + }, + { + description: "update all fields", + model: fixtureInputModel(func(model *inputModel) { + model.DisplayName = utils.Ptr("another-name") + model.MaxMessageSizeKiB = utils.Ptr(int64(4096)) + model.MaxMessagesPerHour = utils.Ptr(int64(20000)) + model.Description = utils.Ptr("final-desc") + model.Labels = utils.Ptr(map[string]string{"a": "b"}) + }), + expectedRequest: fixtureRequest(func(request *intake.ApiUpdateIntakeRunnerRequest) { + payload := intake.UpdateIntakeRunnerPayload{ + DisplayName: utils.Ptr("another-name"), + MaxMessageSizeKiB: utils.Ptr(int64(4096)), + MaxMessagesPerHour: utils.Ptr(int64(20000)), + Description: utils.Ptr("final-desc"), + Labels: utils.Ptr(map[string]string{"a": "b"}), + } + *request = (*request).UpdateIntakeRunnerPayload(payload) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + projectLabel string + resp *intake.IntakeRunnerResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{ + model: fixtureInputModel(), + projectLabel: "my-project", + resp: &intake.IntakeRunnerResponse{Id: utils.Ptr("runner-id-123")}, + }, + wantErr: false, + }, + { + name: "default output - async", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Async = true + }), + projectLabel: "my-project", + resp: &intake.IntakeRunnerResponse{Id: utils.Ptr("runner-id-123")}, + }, + wantErr: false, + }, + { + name: "json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: &intake.IntakeRunnerResponse{Id: utils.Ptr("runner-id-123")}, + }, + wantErr: false, + }, + { + name: "nil response - default output", + args: args{ + model: fixtureInputModel(), + resp: nil, + }, + wantErr: false, + }, + { + name: "nil response - json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: nil, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index e694e8901..7487f8ca3 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -47,6 +47,7 @@ const ( sqlServerFlexCustomEndpointFlag = "sqlserverflex-custom-endpoint" iaasCustomEndpointFlag = "iaas-custom-endpoint" tokenCustomEndpointFlag = "token-custom-endpoint" + intakeCustomEndpointFlag = "intake-custom-endpoint" ) type inputModel struct { @@ -161,6 +162,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(sqlServerFlexCustomEndpointFlag, "", "SQLServer Flex API base URL, used in calls to this API") cmd.Flags().String(iaasCustomEndpointFlag, "", "IaaS API base URL, used in calls to this API") cmd.Flags().String(tokenCustomEndpointFlag, "", "Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication.") + cmd.Flags().String(intakeCustomEndpointFlag, "", "Intake API base URL, used in calls to this API") err := viper.BindPFlag(config.SessionTimeLimitKey, cmd.Flags().Lookup(sessionTimeLimitFlag)) cobra.CheckErr(err) @@ -219,6 +221,8 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) err = viper.BindPFlag(config.TokenCustomEndpointKey, cmd.Flags().Lookup(tokenCustomEndpointFlag)) cobra.CheckErr(err) + err = viper.BindPFlag(config.IntakeCustomEndpointKey, cmd.Flags().Lookup(intakeCustomEndpointFlag)) + cobra.CheckErr(err) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index 28ed935b9..359248096 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -51,6 +51,7 @@ const ( sqlServerFlexCustomEndpointFlag = "sqlserverflex-custom-endpoint" iaasCustomEndpointFlag = "iaas-custom-endpoint" tokenCustomEndpointFlag = "token-custom-endpoint" + intakeCustomEndpointFlag = "intake-custom-endpoint" ) type inputModel struct { @@ -89,6 +90,7 @@ type inputModel struct { SQLServerFlexCustomEndpoint bool IaaSCustomEndpoint bool TokenCustomEndpoint bool + IntakeCustomEndpoint bool } func NewCmd(params *params.CmdParams) *cobra.Command { @@ -212,6 +214,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if model.TokenCustomEndpoint { viper.Set(config.TokenCustomEndpointKey, "") } + if model.IntakeCustomEndpoint { + viper.Set(config.IntakeCustomEndpointKey, "") + } err := config.Write() if err != nil { @@ -260,6 +265,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(sqlServerFlexCustomEndpointFlag, false, "SQLServer Flex API base URL. If unset, uses the default base URL") cmd.Flags().Bool(iaasCustomEndpointFlag, false, "IaaS API base URL. If unset, uses the default base URL") cmd.Flags().Bool(tokenCustomEndpointFlag, false, "Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication.") + cmd.Flags().Bool(intakeCustomEndpointFlag, false, "Intake API base URL. If unset, uses the default base URL") } func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { @@ -299,6 +305,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { SQLServerFlexCustomEndpoint: flags.FlagToBoolValue(p, cmd, sqlServerFlexCustomEndpointFlag), IaaSCustomEndpoint: flags.FlagToBoolValue(p, cmd, iaasCustomEndpointFlag), TokenCustomEndpoint: flags.FlagToBoolValue(p, cmd, tokenCustomEndpointFlag), + IntakeCustomEndpoint: flags.FlagToBoolValue(p, cmd, intakeCustomEndpointFlag), } p.DebugInputModel(model) diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index e48dff384..12eb2424f 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -44,6 +44,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool sqlServerFlexCustomEndpointFlag: true, iaasCustomEndpointFlag: true, tokenCustomEndpointFlag: true, + intakeCustomEndpointFlag: true, } for _, mod := range mods { mod(flagValues) @@ -84,6 +85,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { SQLServerFlexCustomEndpoint: true, IaaSCustomEndpoint: true, TokenCustomEndpoint: true, + IntakeCustomEndpoint: true, } for _, mod := range mods { mod(model) @@ -140,6 +142,7 @@ func TestParseInput(t *testing.T) { model.SQLServerFlexCustomEndpoint = false model.IaaSCustomEndpoint = false model.TokenCustomEndpoint = false + model.IntakeCustomEndpoint = false }), }, { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 9a03ac3b8..89cc4decb 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -48,6 +48,7 @@ const ( IaaSCustomEndpointKey = "iaas_custom_endpoint" TokenCustomEndpointKey = "token_custom_endpoint" GitCustomEndpointKey = "git_custom_endpoint" + IntakeCustomEndpointKey = "intake_custom_endpoint" ProjectNameKey = "project_name" DefaultProfileName = "default" @@ -108,6 +109,7 @@ var ConfigKeys = []string{ IaaSCustomEndpointKey, TokenCustomEndpointKey, GitCustomEndpointKey, + IntakeCustomEndpointKey, AlbCustomEndpoint, } @@ -195,6 +197,7 @@ func setConfigDefaults() { viper.SetDefault(IaaSCustomEndpointKey, "") viper.SetDefault(TokenCustomEndpointKey, "") viper.SetDefault(GitCustomEndpointKey, "") + viper.SetDefault(IntakeCustomEndpointKey, "") viper.SetDefault(AlbCustomEndpoint, "") } diff --git a/internal/pkg/services/intake/client/client.go b/internal/pkg/services/intake/client/client.go new file mode 100644 index 000000000..efb8d0cfd --- /dev/null +++ b/internal/pkg/services/intake/client/client.go @@ -0,0 +1,14 @@ +package client + +import ( + "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// ConfigureClient creates and configures a new Intake API client +func ConfigureClient(p *print.Printer, cliVersion string) (*intake.APIClient, error) { + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.IntakeCustomEndpointKey), true, genericclient.CreateApiClient[*intake.APIClient](intake.NewAPIClient)) +} From fa5b42a9d0d924f7dba480928abccf78c0b73583 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 17:35:30 +0000 Subject: [PATCH 220/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/kms (#1103) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 36c488755..56391d6a4 100644 --- a/go.mod +++ b/go.mod @@ -243,7 +243,7 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 + github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 diff --git a/go.sum b/go.sum index edd2192ab..4bb38a2ba 100644 --- a/go.sum +++ b/go.sum @@ -575,8 +575,8 @@ github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 h1:bkvq3Y4OcGyCR5N69 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0/go.mod h1:tg1rHvgFRG9gNCYnTepZFaSCBahhLLjkIb3nRbtyjDQ= github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 h1:OdY3eXn98hWIhZBH8qQTFsYP6cag8B29UdwTjMwAjfw= github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0/go.mod h1:mf+DQwwTVfc8MD0vwTNPzin2unKAIyQRYywv3wUyH38= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0 h1:bgMV+hi/530htdSMAyRBrltR7Czinb56HQBT36wnVMU= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.0/go.mod h1:QswbIN9TUYELIwkjO+Bu8Nk/FGcd3kZYDlf2n0PdFAk= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1/go.mod h1:Wh1NKX5ZI0FuIdYavOYu0Cjh0yA3S9rlm4j5g0vuPVI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638gOKTZRAnnQuMhYqaliuz/A8BcfjhU= From 01089965768aeb1b62615e8705174e51703f24c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 08:50:00 +0000 Subject: [PATCH 221/422] chore(deps): bump actions/checkout from 5 to 6 (#1106) --- .github/workflows/ci.yaml | 4 ++-- .github/workflows/release.yaml | 6 +++--- .github/workflows/renovate.yaml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1bf4b205f..48e304976 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Install go uses: actions/setup-go@v6 @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Check GoReleaser uses: goreleaser/goreleaser-action@v6 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8eb074ead..108d24521 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -23,7 +23,7 @@ jobs: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_TOKEN }} steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: # Allow goreleaser to access older tag information. fetch-depth: 0 @@ -106,7 +106,7 @@ jobs: AWS_SECRET_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SECRET_ACCESS_KEY }} steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 # use the artifacts from the "goreleaser" job - name: Download artifacts from workflow @@ -144,7 +144,7 @@ jobs: AWS_ENDPOINT_URL: https://object.storage.eu01.onstackit.cloud steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Download artifacts from workflow uses: actions/download-artifact@v6 diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 804c3206d..8c230c100 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Self-hosted Renovate uses: renovatebot/github-action@v44.0.3 with: From 3a8198364b0f8b5c65c73216e4e500ec9c4efe9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 10:20:08 +0100 Subject: [PATCH 222/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/git (#1101) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 56391d6a4..322507bdf 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 - github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 diff --git a/go.sum b/go.sum index 4bb38a2ba..a83c30625 100644 --- a/go.sum +++ b/go.sum @@ -569,8 +569,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= -github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0 h1:zuoJnsLnjxdQcQbs7gUXYzrN0Ip5NXj+6LFBp1EO6cg= -github.com/stackitcloud/stackit-sdk-go/services/git v0.9.0/go.mod h1:AXFfYBJZIW1o0W0zZEb/proQMhMsb3Nn5E1htS8NDPE= +github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 h1:RgWfaWDY8ZGZp5gEBe/A1r7s5NCRuLiYuHhscH6Ej9U= +github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 h1:bkvq3Y4OcGyCR5N69tyY7ZTcrVN+htGTa2ZBJL5BQTQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0/go.mod h1:tg1rHvgFRG9gNCYnTepZFaSCBahhLLjkIb3nRbtyjDQ= github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 h1:OdY3eXn98hWIhZBH8qQTFsYP6cag8B29UdwTjMwAjfw= From 63a0aae1932a7e52b5545f5cae92050107aed711 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 09:29:18 +0000 Subject: [PATCH 223/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/opensearch (#1102) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 322507bdf..cbc6d3613 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 diff --git a/go.sum b/go.sum index a83c30625..6bd8ca723 100644 --- a/go.sum +++ b/go.sum @@ -589,8 +589,8 @@ github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1/go.mod h1:h4aX5tyTQoO6KLrugkvfkqgKTjIzh7e4q9N92kT5OBs= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 h1:MA5i1ScjXLWe5CYeFCLHeZzNS1AH4mbx1kUyiVbxKjI= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1 h1:50n87uZn0EvSP9hJGLqd3Wm2hfqbyh7BMGGCk7axgqA= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.1/go.mod h1:jfguuSPa56Z5Bzs/Xg/CI37XzPo5Zn5lzC5LhfuT8Qc= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqmaQF/OjDw4MwDUbmhwlNBTi9zHdwsXJ3ug= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2/go.mod h1:QenOJF1LD39d/arGFGZFCzHoQuwF6VuWCvS8CbdoMBw= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1/go.mod h1:hyhw+I19NtjKmRLcUkY4boaTxnYSPFGbpn4RxvGqH2s= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 h1:ALrDCBih8Fu8e6530KdOjuH0iMxOLntO381BbKFlTFY= From 69306e34c7f3310ac77c948d70fc518c9d6b68ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 10:28:22 +0000 Subject: [PATCH 224/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability (#1104) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cbc6d3613..460ee1488 100644 --- a/go.mod +++ b/go.mod @@ -248,7 +248,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index 6bd8ca723..ce3834241 100644 --- a/go.sum +++ b/go.sum @@ -587,8 +587,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/a github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7R74xuH/ztcPrDIuMp2KV3QQMjeE7lFudboM= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1/go.mod h1:h4aX5tyTQoO6KLrugkvfkqgKTjIzh7e4q9N92kT5OBs= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0 h1:MA5i1ScjXLWe5CYeFCLHeZzNS1AH4mbx1kUyiVbxKjI= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.0/go.mod h1:tJEOi6L0le4yQZPGwalup/PZ13gqs1aCQDqlUs2cYW0= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1/go.mod h1:vapb/sJqbHlf+c7pZWdE9GqrbyI8wesGvUc9o7oJ1Xk= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqmaQF/OjDw4MwDUbmhwlNBTi9zHdwsXJ3ug= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2/go.mod h1:QenOJF1LD39d/arGFGZFCzHoQuwF6VuWCvS8CbdoMBw= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= From 7c49ae1772389c4e091eb8c779b357f5e494461a Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 24 Nov 2025 12:05:17 +0100 Subject: [PATCH 225/422] fix(deps): update module github.com/jedib0t/go-pretty/v6 to v6.7.5 (#1105) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 460ee1488..37dc9c476 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.7.3 + github.com/jedib0t/go-pretty/v6 v6.7.5 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.1 diff --git a/go.sum b/go.sum index ce3834241..56bc40147 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.7.3 h1:i6IhmHUcZxxvxdgRTcIQk5N3ZMZqyQQyXLHDWxMxb3Y= -github.com/jedib0t/go-pretty/v6 v6.7.3/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3UzhtuiM= +github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From 5b700d95c61bca13a3bd5492752a813da71e0ceb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:52:08 +0100 Subject: [PATCH 226/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/secretsmanager (#1112) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 37dc9c476..b17c57e91 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 diff --git a/go.sum b/go.sum index 56bc40147..a72d1eee9 100644 --- a/go.sum +++ b/go.sum @@ -601,8 +601,8 @@ github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 h1:en8Io github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0/go.mod h1:0wVdzrB4PhwhTE6drOVA6rETTmJ+k3eHa0neuxpDM/g= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oPt08I2WLsxJDoVDsPMW2VkvKW7/SlUv10= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1/go.mod h1:tip0Ob6x06luy3CmRrmnCMtU5cha95fQLdvZlno3J4w= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1 h1:WKFzlHllql3JsVcAq+Y1m5pSMkvwp1qH3Vf2N7i8CPg= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.1/go.mod h1:WGMFtGugBmUxI+nibI7eUZIQk4AGlDvwqX+m17W1y5w= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 h1:tfKC4Z6Uah9AQZrtCn/ytqOgc//ChQRfJ6ozxovgads= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2/go.mod h1:wV7/BUV3BCLq5+E1bHXrKKt/eOPVdWgLArWLAq7rZ/U= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 h1:hcHX2n5pUsOcv2PPPbSJph1fQ/I6P7g7781T1f1ycEI= From 34053aada0efab5041af673b1fdabbdc2b503ae3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:01:25 +0000 Subject: [PATCH 227/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverbackup (#1111) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b17c57e91..6cf90af5f 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 diff --git a/go.sum b/go.sum index a72d1eee9..79e862952 100644 --- a/go.sum +++ b/go.sum @@ -603,8 +603,8 @@ github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oP github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1/go.mod h1:tip0Ob6x06luy3CmRrmnCMtU5cha95fQLdvZlno3J4w= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2 h1:tfKC4Z6Uah9AQZrtCn/ytqOgc//ChQRfJ6ozxovgads= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.2/go.mod h1:wV7/BUV3BCLq5+E1bHXrKKt/eOPVdWgLArWLAq7rZ/U= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 h1:LONKouoyrgDfu4Tu152YFjd5cw3SoG8P7PHdd8tsBOU= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3/go.mod h1:mCiDOqMHQKM9cFs5/GULaYz6Ni0QA2TTMQZJcj4GFUE= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 h1:hcHX2n5pUsOcv2PPPbSJph1fQ/I6P7g7781T1f1ycEI= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1/go.mod h1:jZwTg3wU4/UxgNJ7TKlFZ3dTIlnfvppnW8kJTc4UXy8= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 h1:crKlHl7QVF97A8CTBK3PBtVpO9c/7qwFvRJi5UN/F7Y= From bb0a5e6ab088b60cbccf7794b2f22e7d4dbca298 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:19:02 +0100 Subject: [PATCH 228/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1110) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6cf90af5f..98382a6a2 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.30.0 diff --git a/go.sum b/go.sum index 79e862952..067a35f22 100644 --- a/go.sum +++ b/go.sum @@ -611,8 +611,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 h1:crKlHl github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0 h1:V6RFvybDeJvvmT3g7/BZodF0gozz3TEpahbpiTftbeY= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.4.0/go.mod h1:xRBgpJ8P5Nf1T5tD0tGAeNg1FNQzx5VF7qqOXt2Fp3s= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miWlS5Dvo+cW90hbePaxOyWF67EE= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0/go.mod h1:/Ujlw+qo6RgKm69dD8y6MgmJFcUmrHjuJPO6VFoQX9U= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 h1:aW8ehdoNRaCEs3xDr+YnGb6pru8zZTB8f7kl5lozlJE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2/go.mod h1:Jsry+gfhuXv2P0ldfa48BaL605NhDjdQMgaoV8czlbo= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= From 5d8a48c045e56ec8a22b2fc943b019eb7e2d2031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:27:53 +0000 Subject: [PATCH 229/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverupdate (#1109) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 98382a6a2..cdccad46f 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 diff --git a/go.sum b/go.sum index 067a35f22..4323cb7d3 100644 --- a/go.sum +++ b/go.sum @@ -605,8 +605,8 @@ github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 h1:LONKouoyrgDfu4Tu152YFjd5cw3SoG8P7PHdd8tsBOU= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3/go.mod h1:mCiDOqMHQKM9cFs5/GULaYz6Ni0QA2TTMQZJcj4GFUE= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1 h1:hcHX2n5pUsOcv2PPPbSJph1fQ/I6P7g7781T1f1ycEI= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.1/go.mod h1:jZwTg3wU4/UxgNJ7TKlFZ3dTIlnfvppnW8kJTc4UXy8= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 h1:ubaIeflBZ70evMhU5Xl4NzzDUTk0Z309jnv18OikXgs= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2/go.mod h1:NH6dyKSkJ0WezDgIpXr5PkhSGUXJvwEFcsQmeGScDs8= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 h1:crKlHl7QVF97A8CTBK3PBtVpO9c/7qwFvRJi5UN/F7Y= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= From ce65339f8abc44f58b514fff977bdf5597f7cd1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:39:36 +0000 Subject: [PATCH 230/422] chore(deps): bump renovatebot/github-action from 44.0.3 to 44.0.4 (#1113) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 8c230c100..8551dd43e 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.0.3 + uses: renovatebot/github-action@v44.0.4 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From c573f95684616d093c560d6930e8be39ed9240a5 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Tue, 25 Nov 2025 14:52:38 +0100 Subject: [PATCH 231/422] feat(kms) describe key, keyring, wrappingkey (#1107) * feat(kms) describe key, keyring, wrappingkey * fix(kms): do not reuse buffer during output tests * fix(kms) use constant Time for TestOutputResult for constant table widths --- docs/stackit_beta_kms_key.md | 1 + docs/stackit_beta_kms_key_describe.md | 41 ++++ docs/stackit_beta_kms_keyring.md | 1 + docs/stackit_beta_kms_keyring_describe.md | 40 ++++ docs/stackit_beta_kms_wrapping-key.md | 1 + .../stackit_beta_kms_wrapping-key_describe.md | 41 ++++ .../cmd/beta/kms/key/describe/describe.go | 131 +++++++++++ .../beta/kms/key/describe/describe_test.go | 222 ++++++++++++++++++ internal/cmd/beta/kms/key/key.go | 2 + .../cmd/beta/kms/keyring/describe/describe.go | 106 +++++++++ .../kms/keyring/describe/describe_test.go | 183 +++++++++++++++ internal/cmd/beta/kms/keyring/keyring.go | 2 + .../beta/kms/wrappingkey/describe/describe.go | 131 +++++++++++ .../kms/wrappingkey/describe/describe_test.go | 215 +++++++++++++++++ .../cmd/beta/kms/wrappingkey/wrappingkey.go | 2 + 15 files changed, 1119 insertions(+) create mode 100644 docs/stackit_beta_kms_key_describe.md create mode 100644 docs/stackit_beta_kms_keyring_describe.md create mode 100644 docs/stackit_beta_kms_wrapping-key_describe.md create mode 100644 internal/cmd/beta/kms/key/describe/describe.go create mode 100644 internal/cmd/beta/kms/key/describe/describe_test.go create mode 100644 internal/cmd/beta/kms/keyring/describe/describe.go create mode 100644 internal/cmd/beta/kms/keyring/describe/describe_test.go create mode 100644 internal/cmd/beta/kms/wrappingkey/describe/describe.go create mode 100644 internal/cmd/beta/kms/wrappingkey/describe/describe_test.go diff --git a/docs/stackit_beta_kms_key.md b/docs/stackit_beta_kms_key.md index 631808f53..a22f3d97b 100644 --- a/docs/stackit_beta_kms_key.md +++ b/docs/stackit_beta_kms_key.md @@ -32,6 +32,7 @@ stackit beta kms key [flags] * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta kms key create](./stackit_beta_kms_key_create.md) - Creates a KMS key * [stackit beta kms key delete](./stackit_beta_kms_key_delete.md) - Deletes a KMS key +* [stackit beta kms key describe](./stackit_beta_kms_key_describe.md) - Describe a KMS key * [stackit beta kms key import](./stackit_beta_kms_key_import.md) - Import a KMS key * [stackit beta kms key list](./stackit_beta_kms_key_list.md) - List all KMS keys * [stackit beta kms key restore](./stackit_beta_kms_key_restore.md) - Restore a key diff --git a/docs/stackit_beta_kms_key_describe.md b/docs/stackit_beta_kms_key_describe.md new file mode 100644 index 000000000..05e876491 --- /dev/null +++ b/docs/stackit_beta_kms_key_describe.md @@ -0,0 +1,41 @@ +## stackit beta kms key describe + +Describe a KMS key + +### Synopsis + +Describe a KMS key + +``` +stackit beta kms key describe KEY_ID [flags] +``` + +### Examples + +``` + Describe a KMS key with ID xxx of keyring yyy + $ stackit beta kms key describe xxx --keyring-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta kms key describe" + --keyring-id string Key Ring ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys + diff --git a/docs/stackit_beta_kms_keyring.md b/docs/stackit_beta_kms_keyring.md index 6e65f3a47..2d87f99d3 100644 --- a/docs/stackit_beta_kms_keyring.md +++ b/docs/stackit_beta_kms_keyring.md @@ -32,5 +32,6 @@ stackit beta kms keyring [flags] * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta kms keyring create](./stackit_beta_kms_keyring_create.md) - Creates a KMS key ring * [stackit beta kms keyring delete](./stackit_beta_kms_keyring_delete.md) - Deletes a KMS key ring +* [stackit beta kms keyring describe](./stackit_beta_kms_keyring_describe.md) - Describe a KMS key ring * [stackit beta kms keyring list](./stackit_beta_kms_keyring_list.md) - Lists all KMS key rings diff --git a/docs/stackit_beta_kms_keyring_describe.md b/docs/stackit_beta_kms_keyring_describe.md new file mode 100644 index 000000000..9b1381dc0 --- /dev/null +++ b/docs/stackit_beta_kms_keyring_describe.md @@ -0,0 +1,40 @@ +## stackit beta kms keyring describe + +Describe a KMS key ring + +### Synopsis + +Describe a KMS key ring + +``` +stackit beta kms keyring describe KEYRING_ID [flags] +``` + +### Examples + +``` + Describe a KMS key ring with ID xxx + $ stackit beta kms keyring describe xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta kms keyring describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings + diff --git a/docs/stackit_beta_kms_wrapping-key.md b/docs/stackit_beta_kms_wrapping-key.md index c10cb4946..2cef6b863 100644 --- a/docs/stackit_beta_kms_wrapping-key.md +++ b/docs/stackit_beta_kms_wrapping-key.md @@ -32,5 +32,6 @@ stackit beta kms wrapping-key [flags] * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta kms wrapping-key create](./stackit_beta_kms_wrapping-key_create.md) - Creates a KMS wrapping key * [stackit beta kms wrapping-key delete](./stackit_beta_kms_wrapping-key_delete.md) - Deletes a KMS wrapping key +* [stackit beta kms wrapping-key describe](./stackit_beta_kms_wrapping-key_describe.md) - Describe a KMS wrapping key * [stackit beta kms wrapping-key list](./stackit_beta_kms_wrapping-key_list.md) - Lists all KMS wrapping keys diff --git a/docs/stackit_beta_kms_wrapping-key_describe.md b/docs/stackit_beta_kms_wrapping-key_describe.md new file mode 100644 index 000000000..6e82cd595 --- /dev/null +++ b/docs/stackit_beta_kms_wrapping-key_describe.md @@ -0,0 +1,41 @@ +## stackit beta kms wrapping-key describe + +Describe a KMS wrapping key + +### Synopsis + +Describe a KMS wrapping key + +``` +stackit beta kms wrapping-key describe WRAPPING_KEY_ID [flags] +``` + +### Examples + +``` + Describe a KMS wrapping key with ID xxx of keyring yyy + $ stackit beta kms wrappingkey describe xxx --keyring-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta kms wrapping-key describe" + --keyring-id string Key Ring ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys + diff --git a/internal/cmd/beta/kms/key/describe/describe.go b/internal/cmd/beta/kms/key/describe/describe.go new file mode 100644 index 000000000..113cf96de --- /dev/null +++ b/internal/cmd/beta/kms/key/describe/describe.go @@ -0,0 +1,131 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + argKeyID = "KEY_ID" + flagKeyRingID = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyID string + KeyRingID string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", argKeyID), + Short: "Describe a KMS key", + Long: "Describe a KMS key", + Args: args.SingleArg(argKeyID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a KMS key with ID xxx of keyring yyy`, + `$ stackit beta kms key describe xxx --keyring-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get key: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), flagKeyRingID, "Key Ring ID") + err := flags.MarkFlagsRequired(cmd, flagKeyRingID) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, args []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + model := &inputModel{ + GlobalFlagModel: globalFlags, + KeyID: args[0], + KeyRingID: flags.FlagToStringValue(p, cmd, flagKeyRingID), + } + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiGetKeyRequest { + return apiClient.GetKey(ctx, model.ProjectId, model.Region, model.KeyRingID, model.KeyID) +} + +func outputResult(p *print.Printer, outputFormat string, key *kms.Key) error { + if key == nil { + return fmt.Errorf("key response is empty") + } + return p.OutputResult(outputFormat, key, func() error { + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(key.Id)) + table.AddSeparator() + table.AddRow("DISPLAY NAME", utils.PtrString(key.DisplayName)) + table.AddSeparator() + table.AddRow("CREATED AT", utils.PtrString(key.CreatedAt)) + table.AddSeparator() + table.AddRow("STATE", utils.PtrString(key.State)) + table.AddSeparator() + table.AddRow("DESCRIPTION", utils.PtrString(key.Description)) + table.AddSeparator() + table.AddRow("ACCESS SCOPE", utils.PtrString(key.AccessScope)) + table.AddSeparator() + table.AddRow("ALGORITHM", utils.PtrString(key.Algorithm)) + table.AddSeparator() + table.AddRow("DELETION DATE", utils.PtrString(key.DeletionDate)) + table.AddSeparator() + table.AddRow("IMPORT ONLY", utils.PtrString(key.ImportOnly)) + table.AddSeparator() + table.AddRow("KEYRING ID", utils.PtrString(key.KeyRingId)) + table.AddSeparator() + table.AddRow("PROTECTION", utils.PtrString(key.Protection)) + table.AddSeparator() + table.AddRow("PURPOSE", utils.PtrString(key.Purpose)) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/kms/key/describe/describe_test.go b/internal/cmd/beta/kms/key/describe/describe_test.go new file mode 100644 index 000000000..6abb30a09 --- /dev/null +++ b/internal/cmd/beta/kms/key/describe/describe_test.go @@ -0,0 +1,222 @@ +package describe + +import ( + "bytes" + "context" + "fmt" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &kms.APIClient{} +var testProjectId = uuid.NewString() +var testKeyRingID = uuid.NewString() +var testKeyID = uuid.NewString() +var testTime = time.Time{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + flagKeyRingID: testKeyRingID, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyID: testKeyID, + KeyRingID: testKeyRingID, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: []string{testKeyID}, + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: []string{testKeyID}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "invalid key id", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing key ring id", + argValues: []string{testKeyID}, + flagValues: fixtureFlagValues(func(m map[string]string) { delete(m, flagKeyRingID) }), + isValid: false, + }, + { + description: "invalid key ring id", + argValues: []string{testKeyID}, + flagValues: fixtureFlagValues(func(m map[string]string) { + m[flagKeyRingID] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing project id", + argValues: []string{testKeyID}, + flagValues: fixtureFlagValues(func(m map[string]string) { delete(m, globalflags.ProjectIdFlag) }), + isValid: false, + }, + { + description: "invalid project id", + argValues: []string{testKeyID}, + flagValues: fixtureFlagValues(func(m map[string]string) { m[globalflags.ProjectIdFlag] = "invalid-uuid" }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + got := buildRequest(testCtx, fixtureInputModel(), testClient) + want := testClient.GetKey(testCtx, testProjectId, testRegion, testKeyRingID, testKeyID) + diff := cmp.Diff(got, want, + cmp.AllowUnexported(want), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("buildRequest() mismatch (-want +got):\n%s", diff) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + outputFmt string + keyRing *kms.Key + wantErr bool + expected string + }{ + { + description: "empty", + outputFmt: "table", + wantErr: true, + }, + { + description: "table format", + outputFmt: "table", + keyRing: &kms.Key{ + AccessScope: utils.Ptr(kms.ACCESSSCOPE_PUBLIC), + Algorithm: utils.Ptr(kms.ALGORITHM_AES_256_GCM), + CreatedAt: utils.Ptr(testTime), + DeletionDate: nil, + Description: utils.Ptr("very secure and secret key"), + DisplayName: utils.Ptr("Test Key"), + Id: utils.Ptr(testKeyID), + ImportOnly: utils.Ptr(true), + KeyRingId: utils.Ptr(testKeyRingID), + Protection: utils.Ptr(kms.PROTECTION_SOFTWARE), + Purpose: utils.Ptr(kms.PURPOSE_SYMMETRIC_ENCRYPT_DECRYPT), + State: utils.Ptr(kms.KEYSTATE_ACTIVE), + }, + expected: fmt.Sprintf(` + ID │ %-37s +───────────────┼────────────────────────────────────── + DISPLAY NAME │ Test Key +───────────────┼────────────────────────────────────── + CREATED AT │ %-37s +───────────────┼────────────────────────────────────── + STATE │ active +───────────────┼────────────────────────────────────── + DESCRIPTION │ very secure and secret key +───────────────┼────────────────────────────────────── + ACCESS SCOPE │ PUBLIC +───────────────┼────────────────────────────────────── + ALGORITHM │ aes_256_gcm +───────────────┼────────────────────────────────────── + DELETION DATE │ +───────────────┼────────────────────────────────────── + IMPORT ONLY │ true +───────────────┼────────────────────────────────────── + KEYRING ID │ %-37s +───────────────┼────────────────────────────────────── + PROTECTION │ software +───────────────┼────────────────────────────────────── + PURPOSE │ symmetric_encrypt_decrypt + +`, + testKeyID, + testTime, + testKeyRingID, + ), + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + var buf bytes.Buffer + p.Cmd.SetOut(&buf) + if err := outputResult(p, tt.outputFmt, tt.keyRing); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + diff := cmp.Diff(buf.String(), tt.expected) + if diff != "" { + t.Fatalf("outputResult() output mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/kms/key/key.go b/internal/cmd/beta/kms/key/key.go index 4b2f7d8fa..b6ff239bc 100644 --- a/internal/cmd/beta/kms/key/key.go +++ b/internal/cmd/beta/kms/key/key.go @@ -3,6 +3,7 @@ package key import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/importKey" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/restore" @@ -33,4 +34,5 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(restore.NewCmd(params)) cmd.AddCommand(rotate.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } diff --git a/internal/cmd/beta/kms/keyring/describe/describe.go b/internal/cmd/beta/kms/keyring/describe/describe.go new file mode 100644 index 000000000..f9dc11d0a --- /dev/null +++ b/internal/cmd/beta/kms/keyring/describe/describe.go @@ -0,0 +1,106 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + argKeyRingID = "KEYRING_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + KeyRingID string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", argKeyRingID), + Short: "Describe a KMS key ring", + Long: "Describe a KMS key ring", + Args: args.SingleArg(argKeyRingID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a KMS key ring with ID xxx`, + `$ stackit beta kms keyring describe xxx`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get key ring: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, args []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + model := &inputModel{ + GlobalFlagModel: globalFlags, + KeyRingID: args[0], + } + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiGetKeyRingRequest { + return apiClient.GetKeyRing(ctx, model.ProjectId, model.Region, model.KeyRingID) +} + +func outputResult(p *print.Printer, outputFormat string, keyRing *kms.KeyRing) error { + if keyRing == nil { + return fmt.Errorf("key ring response is empty") + } + return p.OutputResult(outputFormat, keyRing, func() error { + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(keyRing.Id)) + table.AddSeparator() + table.AddRow("DISPLAY NAME", utils.PtrString(keyRing.DisplayName)) + table.AddSeparator() + table.AddRow("CREATED AT", utils.PtrString(keyRing.CreatedAt)) + table.AddSeparator() + table.AddRow("STATE", utils.PtrString(keyRing.State)) + table.AddSeparator() + table.AddRow("DESCRIPTION", utils.PtrString(keyRing.Description)) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/kms/keyring/describe/describe_test.go b/internal/cmd/beta/kms/keyring/describe/describe_test.go new file mode 100644 index 000000000..bdc3caa88 --- /dev/null +++ b/internal/cmd/beta/kms/keyring/describe/describe_test.go @@ -0,0 +1,183 @@ +package describe + +import ( + "bytes" + "context" + "fmt" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &kms.APIClient{} +var testProjectId = uuid.NewString() +var testKeyRingID = uuid.NewString() +var testTime = time.Time{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingID: testKeyRingID, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: []string{testKeyRingID}, + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: []string{testKeyRingID}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "invalid key ring id", + argValues: []string{"!invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing project id", + argValues: []string{testKeyRingID}, + flagValues: fixtureFlagValues(func(m map[string]string) { delete(m, globalflags.ProjectIdFlag) }), + isValid: false, + }, + { + description: "invalid project id", + argValues: []string{testKeyRingID}, + flagValues: fixtureFlagValues(func(m map[string]string) { m[globalflags.ProjectIdFlag] = "invalid-uuid" }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + got := buildRequest(testCtx, fixtureInputModel(), testClient) + want := testClient.GetKeyRing(testCtx, testProjectId, testRegion, testKeyRingID) + diff := cmp.Diff(got, want, + cmp.AllowUnexported(want), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("buildRequest() mismatch (-want +got):\n%s", diff) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + outputFmt string + keyRing *kms.KeyRing + wantErr bool + expected string + }{ + { + description: "empty", + outputFmt: "table", + wantErr: true, + }, + { + description: "table format", + outputFmt: "table", + keyRing: &kms.KeyRing{ + Id: utils.Ptr(testKeyRingID), + DisplayName: utils.Ptr("Test Key Ring"), + CreatedAt: utils.Ptr(testTime), + Description: utils.Ptr("This is a test key ring."), + State: utils.Ptr(kms.KEYRINGSTATE_ACTIVE), + }, + expected: fmt.Sprintf(` + ID │ %-37s +──────────────┼────────────────────────────────────── + DISPLAY NAME │ Test Key Ring +──────────────┼────────────────────────────────────── + CREATED AT │ %-37s +──────────────┼────────────────────────────────────── + STATE │ active +──────────────┼────────────────────────────────────── + DESCRIPTION │ This is a test key ring. + +`, + testKeyRingID, + testTime, + ), + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + var buf bytes.Buffer + p.Cmd.SetOut(&buf) + if err := outputResult(p, tt.outputFmt, tt.keyRing); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + diff := cmp.Diff(buf.String(), tt.expected) + if diff != "" { + t.Fatalf("outputResult() output mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/kms/keyring/keyring.go b/internal/cmd/beta/kms/keyring/keyring.go index 7a42ce131..f948fae41 100644 --- a/internal/cmd/beta/kms/keyring/keyring.go +++ b/internal/cmd/beta/kms/keyring/keyring.go @@ -3,6 +3,7 @@ package keyring import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/list" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -27,4 +28,5 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } diff --git a/internal/cmd/beta/kms/wrappingkey/describe/describe.go b/internal/cmd/beta/kms/wrappingkey/describe/describe.go new file mode 100644 index 000000000..2c25a288e --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/describe/describe.go @@ -0,0 +1,131 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +const ( + argWrappingKeyID = "WRAPPING_KEY_ID" + flagKeyRingID = "keyring-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + WrappingKeyID string + KeyRingID string +} + +func NewCmd(params *params.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", argWrappingKeyID), + Short: "Describe a KMS wrapping key", + Long: "Describe a KMS wrapping key", + Args: args.SingleArg(argWrappingKeyID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a KMS wrapping key with ID xxx of keyring yyy`, + `$ stackit beta kms wrappingkey describe xxx --keyring-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get wrapping key: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), flagKeyRingID, "Key Ring ID") + err := flags.MarkFlagsRequired(cmd, flagKeyRingID) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, args []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + model := &inputModel{ + GlobalFlagModel: globalFlags, + WrappingKeyID: args[0], + KeyRingID: flags.FlagToStringValue(p, cmd, flagKeyRingID), + } + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *kms.APIClient) kms.ApiGetWrappingKeyRequest { + return apiClient.GetWrappingKey(ctx, model.ProjectId, model.Region, model.KeyRingID, model.WrappingKeyID) +} + +func outputResult(p *print.Printer, outputFormat string, wrappingKey *kms.WrappingKey) error { + if wrappingKey == nil { + return fmt.Errorf("wrapping key response is empty") + } + return p.OutputResult(outputFormat, wrappingKey, func() error { + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(wrappingKey.Id)) + table.AddSeparator() + table.AddRow("DISPLAY NAME", utils.PtrString(wrappingKey.DisplayName)) + table.AddSeparator() + table.AddRow("CREATED AT", utils.PtrString(wrappingKey.CreatedAt)) + table.AddSeparator() + table.AddRow("STATE", utils.PtrString(wrappingKey.State)) + table.AddSeparator() + table.AddRow("DESCRIPTION", utils.PtrString(wrappingKey.Description)) + table.AddSeparator() + table.AddRow("ACCESS SCOPE", utils.PtrString(wrappingKey.AccessScope)) + table.AddSeparator() + table.AddRow("ALGORITHM", utils.PtrString(wrappingKey.Algorithm)) + table.AddSeparator() + table.AddRow("EXPIRES AT", utils.PtrString(wrappingKey.ExpiresAt)) + table.AddSeparator() + table.AddRow("KEYRING ID", utils.PtrString(wrappingKey.KeyRingId)) + table.AddSeparator() + table.AddRow("PROTECTION", utils.PtrString(wrappingKey.Protection)) + table.AddSeparator() + table.AddRow("PUBLIC KEY", utils.PtrString(wrappingKey.PublicKey)) + table.AddSeparator() + table.AddRow("PURPOSE", utils.PtrString(wrappingKey.Purpose)) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go b/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go new file mode 100644 index 000000000..9589b33fb --- /dev/null +++ b/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go @@ -0,0 +1,215 @@ +package describe + +import ( + "bytes" + "context" + "fmt" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &kms.APIClient{} +var testProjectId = uuid.NewString() +var testKeyRingID = uuid.NewString() +var testWrappingKeyID = uuid.NewString() +var testTime = time.Time{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + flagKeyRingID: testKeyRingID, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + KeyRingID: testKeyRingID, + WrappingKeyID: testWrappingKeyID, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: []string{testWrappingKeyID}, + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: []string{testWrappingKeyID}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "invalid key ring id", + argValues: []string{testWrappingKeyID}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[flagKeyRingID] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing project id", + argValues: []string{testWrappingKeyID}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "invalid project id", + argValues: []string{testWrappingKeyID}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + got := buildRequest(testCtx, fixtureInputModel(), testClient) + want := testClient.GetWrappingKey(testCtx, testProjectId, testRegion, testKeyRingID, testWrappingKeyID) + diff := cmp.Diff(got, want, + cmp.AllowUnexported(want), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("buildRequest() mismatch (-want +got):\n%s", diff) + } +} +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + outputFmt string + keyRing *kms.WrappingKey + wantErr bool + expected string + }{ + { + description: "empty", + outputFmt: "table", + wantErr: true, + }, + { + description: "table format", + outputFmt: "table", + keyRing: &kms.WrappingKey{ + Id: utils.Ptr(testWrappingKeyID), + DisplayName: utils.Ptr("Test Key Ring"), + CreatedAt: utils.Ptr(testTime), + Description: utils.Ptr("This is a test key ring."), + State: utils.Ptr(kms.WRAPPINGKEYSTATE_ACTIVE), + AccessScope: utils.Ptr(kms.ACCESSSCOPE_PUBLIC), + Algorithm: utils.Ptr(kms.WRAPPINGALGORITHM__2048_OAEP_SHA256), + ExpiresAt: utils.Ptr(testTime), + KeyRingId: utils.Ptr(testKeyRingID), + Protection: utils.Ptr(kms.PROTECTION_SOFTWARE), + PublicKey: utils.Ptr("-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQ...\n-----END PUBLIC KEY-----"), + Purpose: utils.Ptr(kms.WRAPPINGPURPOSE_ASYMMETRIC_KEY), + }, + expected: fmt.Sprintf(` + ID │ %-46s +──────────────┼─────────────────────────────────────────────── + DISPLAY NAME │ Test Key Ring +──────────────┼─────────────────────────────────────────────── + CREATED AT │ %-46s +──────────────┼─────────────────────────────────────────────── + STATE │ active +──────────────┼─────────────────────────────────────────────── + DESCRIPTION │ This is a test key ring. +──────────────┼─────────────────────────────────────────────── + ACCESS SCOPE │ PUBLIC +──────────────┼─────────────────────────────────────────────── + ALGORITHM │ rsa_2048_oaep_sha256 +──────────────┼─────────────────────────────────────────────── + EXPIRES AT │ %-46s +──────────────┼─────────────────────────────────────────────── + KEYRING ID │ %-46s +──────────────┼─────────────────────────────────────────────── + PROTECTION │ software +──────────────┼─────────────────────────────────────────────── + PUBLIC KEY │ -----BEGIN PUBLIC KEY----- + │ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQ... + │ -----END PUBLIC KEY----- +──────────────┼─────────────────────────────────────────────── + PURPOSE │ wrap_asymmetric_key + +`, + testWrappingKeyID, + testTime, + testTime, + testKeyRingID), + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + var buf bytes.Buffer + p.Cmd.SetOut(&buf) + if err := outputResult(p, tt.outputFmt, tt.keyRing); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + diff := cmp.Diff(buf.String(), tt.expected) + if diff != "" { + t.Fatalf("outputResult() output mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go b/internal/cmd/beta/kms/wrappingkey/wrappingkey.go index 00184a521..168808e37 100644 --- a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go +++ b/internal/cmd/beta/kms/wrappingkey/wrappingkey.go @@ -3,6 +3,7 @@ package wrappingkey import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/list" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -27,4 +28,5 @@ func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } From 7dbd264aa82dde17ec1cdcaae763c882294865d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:21:24 +0000 Subject: [PATCH 232/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#1118) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cdccad46f..3ace14a71 100644 --- a/go.mod +++ b/go.mod @@ -249,7 +249,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/go.sum b/go.sum index 4323cb7d3..6f56c4c97 100644 --- a/go.sum +++ b/go.sum @@ -593,8 +593,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqm github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2/go.mod h1:QenOJF1LD39d/arGFGZFCzHoQuwF6VuWCvS8CbdoMBw= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1/go.mod h1:hyhw+I19NtjKmRLcUkY4boaTxnYSPFGbpn4RxvGqH2s= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1 h1:ALrDCBih8Fu8e6530KdOjuH0iMxOLntO381BbKFlTFY= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.1/go.mod h1:+qGWSehoV0Js3FalgvT/bOgPj+UqW4I7lP5s8uAxP+o= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4H1thfEEsDq+O0Ce0hNhdbkJ5eDdGEoE= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 h1:8uPt82Ez34OYMOijjEYxB1zUW6kiybkt6veQKl0AL68= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1/go.mod h1:1Y2GEICmZDt+kr8aGnBx/sjYVAIYHmtfC8xYi9oxNEE= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 h1:en8IomJeGqZZgGOyLH53PNDCv2F/x4zURz4mGSlhTKs= From 36bd0f52f30ae92a8d42eb57214164fe9ecca5d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:31:04 +0000 Subject: [PATCH 233/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1117) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3ace14a71..922626d6f 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.0 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 diff --git a/go.sum b/go.sum index 6f56c4c97..2468f2453 100644 --- a/go.sum +++ b/go.sum @@ -563,8 +563,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.20.0 h1:4rrUk6uT1g4nOn5/g1uXukP07Tux/o5xbMz/f/qE1rY= github.com/stackitcloud/stackit-sdk-go/core v0.20.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1 h1:DaJkEN/6l+AJEQ3Dr+3IdKM4jywDQsTvuYHmRvFj3ho= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.1/go.mod h1:SzA+UsSNv4D9IvNT7hwYPewgAvUgj5WXIU2tZ0XaMBI= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 h1:x7ndqw6yaOw+TmThNeAkI+eN9vK5hWgjIJlFZrYPREo= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2/go.mod h1:wbPNu6e5r/5xhzznCKbC7fEJahrAOb89gmaIm+0w2/s= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= From 7570af4a2b646c5cd876499000224dfb48fb4b81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:59:26 +0100 Subject: [PATCH 234/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#1116) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 922626d6f..7df5a05df 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 diff --git a/go.sum b/go.sum index 2468f2453..0cfbb3753 100644 --- a/go.sum +++ b/go.sum @@ -583,8 +583,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638g github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2/go.mod h1:OlGmMlXKp33ZYpUm9TqaLYf8SdzhDW5uBKcbgq1zXOk= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIeh5XB2Ews2B9Lj5DJlMWIEJh60FfZ4Y= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2 h1:BQ+qAkVS/aGHepE/+gVsvSg1sRkPOyIUI/jkCyUOrWg= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.2/go.mod h1:oc8Mpwl7O6EZwG0YxfhOzNCJwNQBWK5rFh764OtxoMY= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 h1:tGa+NcjNKTWvChN+0OMdLomb9Jod4MmY6YAiPTJMgfo= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3/go.mod h1:ciuOzwN5GcqplRy95fXRaS44dFmhfNxvmzTl/ALwV/k= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7R74xuH/ztcPrDIuMp2KV3QQMjeE7lFudboM= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1/go.mod h1:h4aX5tyTQoO6KLrugkvfkqgKTjIzh7e4q9N92kT5OBs= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= From 2dda12a4a96c0f2e55993d2cd78aaf4a31d1784d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:07:54 +0000 Subject: [PATCH 235/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#1115) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7df5a05df..893989a6b 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 diff --git a/go.sum b/go.sum index 0cfbb3753..01c693f96 100644 --- a/go.sum +++ b/go.sum @@ -607,8 +607,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 h1:LONKouoyr github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3/go.mod h1:mCiDOqMHQKM9cFs5/GULaYz6Ni0QA2TTMQZJcj4GFUE= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 h1:ubaIeflBZ70evMhU5Xl4NzzDUTk0Z309jnv18OikXgs= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2/go.mod h1:NH6dyKSkJ0WezDgIpXr5PkhSGUXJvwEFcsQmeGScDs8= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1 h1:crKlHl7QVF97A8CTBK3PBtVpO9c/7qwFvRJi5UN/F7Y= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.1/go.mod h1:QCrAW/Rmf+styT25ke8cUV6hDHpdKNmAY14kkJ3+Fd8= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 h1:+S5yPftGLH99ByzDCwzdI927bvKOKMQxMkd/tuPeQTE= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2/go.mod h1:gaHXopzXPDP1AmquUVhMmz9opAr2QYVBL0XbBdPtB7s= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miWlS5Dvo+cW90hbePaxOyWF67EE= From 8e1489be2122bb33185f5bd638cdabc655453d2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 09:08:40 +0100 Subject: [PATCH 236/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceenablement (#1123) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 893989a6b..3d1233690 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 github.com/zalando/go-keyring v0.2.6 diff --git a/go.sum b/go.sum index 01c693f96..5f93fd0e8 100644 --- a/go.sum +++ b/go.sum @@ -609,8 +609,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 h1:ubaIeflBZ github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2/go.mod h1:NH6dyKSkJ0WezDgIpXr5PkhSGUXJvwEFcsQmeGScDs8= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 h1:+S5yPftGLH99ByzDCwzdI927bvKOKMQxMkd/tuPeQTE= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2/go.mod h1:gaHXopzXPDP1AmquUVhMmz9opAr2QYVBL0XbBdPtB7s= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2 h1:s2iag/Gc4tuQH7x5I0n4mQWVhpfl/cj+SVNAFAB5ck0= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.2/go.mod h1:DFEamKVoOjm/rjMwzfZK0Zg/hwsSkXOibdA4HcC6swk= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL+rpQZWXZazL8w8DqXYxGbIOInaUc155BWTshNRA= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3/go.mod h1:icu5WtsZ8c57/pUrXeFLmZu29Qhwr/rsjTkVRWJYTqY= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miWlS5Dvo+cW90hbePaxOyWF67EE= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0/go.mod h1:/Ujlw+qo6RgKm69dD8y6MgmJFcUmrHjuJPO6VFoQX9U= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 h1:aW8ehdoNRaCEs3xDr+YnGb6pru8zZTB8f7kl5lozlJE= From e72410c13fa603be36d6ae50fe25e51c8064e0a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 09:56:42 +0100 Subject: [PATCH 237/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/dns (#1122) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3d1233690..bc5f4fc17 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.20.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 diff --git a/go.sum b/go.sum index 5f93fd0e8..14abaf6bd 100644 --- a/go.sum +++ b/go.sum @@ -567,8 +567,8 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 h1:x7ndqw6yaOw+TmThNe github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2/go.mod h1:wbPNu6e5r/5xhzznCKbC7fEJahrAOb89gmaIm+0w2/s= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1 h1:CnhAMLql0MNmAeq4roQKN8OpSKX4FSgTU6Eu6detB4I= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.1/go.mod h1:7Bx85knfNSBxulPdJUFuBePXNee3cO+sOTYnUG6M+iQ= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0eb68ZD2KL1C8OFD8RG2sWMQGL6o= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 h1:RgWfaWDY8ZGZp5gEBe/A1r7s5NCRuLiYuHhscH6Ej9U= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 h1:bkvq3Y4OcGyCR5N69tyY7ZTcrVN+htGTa2ZBJL5BQTQ= From 74d5ceb890ac81841781d8691e09aeb66797c999 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Nov 2025 09:05:38 +0000 Subject: [PATCH 238/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1121) --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index bc5f4fc17..27390aaa3 100644 --- a/go.mod +++ b/go.mod @@ -20,12 +20,12 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 diff --git a/go.sum b/go.sum index 14abaf6bd..4e7df87f2 100644 --- a/go.sum +++ b/go.sum @@ -571,8 +571,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0e github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 h1:RgWfaWDY8ZGZp5gEBe/A1r7s5NCRuLiYuHhscH6Ej9U= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0 h1:bkvq3Y4OcGyCR5N69tyY7ZTcrVN+htGTa2ZBJL5BQTQ= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.0/go.mod h1:tg1rHvgFRG9gNCYnTepZFaSCBahhLLjkIb3nRbtyjDQ= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 h1:afGHMCqBM/E/FPUvbfSTFb9ddI+eDm2a7DpWPCkxMzs= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2/go.mod h1:/DlO7+cOqyYKROIxkBYIUdMoEfFevkVXhsShglxyUOQ= github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 h1:OdY3eXn98hWIhZBH8qQTFsYP6cag8B29UdwTjMwAjfw= github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0/go.mod h1:mf+DQwwTVfc8MD0vwTNPzin2unKAIyQRYywv3wUyH38= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= @@ -597,8 +597,8 @@ github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 h1:8uPt82Ez34OYMOijjEYxB1zUW6kiybkt6veQKl0AL68= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1/go.mod h1:1Y2GEICmZDt+kr8aGnBx/sjYVAIYHmtfC8xYi9oxNEE= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0 h1:en8IomJeGqZZgGOyLH53PNDCv2F/x4zURz4mGSlhTKs= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.0/go.mod h1:0wVdzrB4PhwhTE6drOVA6rETTmJ+k3eHa0neuxpDM/g= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 h1:KDa5sy6NSzMOXaf4a9skxOm8oUoleI45fLbD3ww7qsc= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1/go.mod h1:+k3iHkWpehO+FLC5WsW7eGhYdNjDklYqRcpIxQBLbZg= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oPt08I2WLsxJDoVDsPMW2VkvKW7/SlUv10= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1/go.mod h1:tip0Ob6x06luy3CmRrmnCMtU5cha95fQLdvZlno3J4w= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= From 67440f2cc21072c1a5901e688ce39efc77a8a8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 27 Nov 2025 11:11:46 +0100 Subject: [PATCH 239/422] fix(alb): print valid JSON/YAML output for list cmds (#1045) relates to STACKITCLI-273 / #893 --- internal/cmd/beta/alb/list/list.go | 25 +++++++++---------- internal/cmd/beta/alb/list/list_test.go | 20 +++++++++------ .../observability-credentials/list/list.go | 18 ++++++------- internal/cmd/beta/alb/plans/plans.go | 18 ++++++------- internal/cmd/beta/alb/plans/plans_test.go | 6 +++-- 5 files changed, 44 insertions(+), 43 deletions(-) diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index 2c4d8924d..292e2e3ae 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -25,8 +25,7 @@ type inputModel struct { } const ( - labelSelectorFlag = "label-selector" - limitFlag = "limit" + limitFlag = "limit" ) func NewCmd(params *params.CmdParams) *cobra.Command { @@ -73,19 +72,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list load balancerse: %w", err) } + items := response.GetLoadBalancers() - if items := response.LoadBalancers; items == nil || len(*items) == 0 { - params.Printer.Info("No load balancers found for project %q", projectLabel) - } else { - if model.Limit != nil && len(*items) > int(*model.Limit) { - *items = (*items)[:*model.Limit] - } - if err := outputResult(params.Printer, model.OutputFormat, *items); err != nil { - return fmt.Errorf("output loadbalancers: %w", err) - } + // Truncate output + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] } - return nil + return outputResult(params.Printer, model.OutputFormat, projectLabel, items) }, } @@ -125,8 +119,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie return request } -func outputResult(p *print.Printer, outputFormat string, items []alb.LoadBalancer) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, items []alb.LoadBalancer) error { return p.OutputResult(outputFormat, items, func() error { + if len(items) == 0 { + p.Outputf("No load balancers found for project %q", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("NAME", "EXTERNAL ADDRESS", "REGION", "STATUS", "VERSION", "ERRORS") for i := range items { diff --git a/internal/cmd/beta/alb/list/list_test.go b/internal/cmd/beta/alb/list/list_test.go index c623ea0b8..5ffc642e2 100644 --- a/internal/cmd/beta/alb/list/list_test.go +++ b/internal/cmd/beta/alb/list/list_test.go @@ -5,6 +5,8 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -19,11 +21,14 @@ import ( type testCtxKey struct{} var ( - testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") - testClient = &alb.APIClient{} - testProjectId = uuid.NewString() - testRegion = "eu01" - testLimit int64 = 10 + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &alb.APIClient{} + testProjectId = uuid.NewString() +) + +const ( + testRegion = "eu01" + testLimit int64 = 10 ) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { @@ -41,7 +46,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ GlobalFlagModel: &globalflags.GlobalFlagModel{ProjectId: testProjectId, Region: testRegion, Verbosity: globalflags.VerbosityDefault}, - Limit: &testLimit, + Limit: utils.Ptr(testLimit), } for _, mod := range mods { mod(model) @@ -136,6 +141,7 @@ func TestBuildRequest(t *testing.T) { func Test_outputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string items []alb.LoadBalancer } tests := []struct { @@ -164,7 +170,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.items); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index 961455b53..51347cae2 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -68,13 +68,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list credentials: %w", err) } + items := resp.GetCredentials() - if resp.Credentials == nil || len(*resp.Credentials) == 0 { - params.Printer.Info("No credentials found\n") - return nil - } - - items := *resp.Credentials + // Truncate output if model.Limit != nil && len(items) > int(*model.Limit) { items = items[:*model.Limit] } @@ -116,12 +112,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie } func outputResult(p *print.Printer, outputFormat string, items []alb.CredentialsResponse) error { - if items == nil { - p.Outputln("no credentials found") - return nil - } - return p.OutputResult(outputFormat, items, func() error { + if len(items) == 0 { + p.Outputf("No credentials found\n") + return nil + } + table := tables.NewTable() table.SetHeader("CREDENTIAL REF", "DISPLAYNAME", "USERNAME", "REGION") diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index 6bb5e01fc..0724860a1 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -62,16 +62,9 @@ func NewCmd(params *params.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("list plans: %w", err) } + items := response.GetValidPlans() - if items := response.ValidPlans; items == nil || len(*items) == 0 { - params.Printer.Info("No plans found for project %q", projectLabel) - } else { - if err := outputResult(params.Printer, model.OutputFormat, *items); err != nil { - return fmt.Errorf("output plans: %w", err) - } - } - - return nil + return outputResult(params.Printer, model.OutputFormat, projectLabel, items) }, } @@ -98,8 +91,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *alb.APIClie return request } -func outputResult(p *print.Printer, outputFormat string, items []alb.PlanDetails) error { +func outputResult(p *print.Printer, outputFormat, projectLabel string, items []alb.PlanDetails) error { return p.OutputResult(outputFormat, items, func() error { + if len(items) == 0 { + p.Outputf("No plans found for project %q", projectLabel) + return nil + } + table := tables.NewTable() table.SetHeader("PLAN ID", "NAME", "FLAVOR", "MAX CONNS", "DESCRIPTION") for _, item := range items { diff --git a/internal/cmd/beta/alb/plans/plans_test.go b/internal/cmd/beta/alb/plans/plans_test.go index 1a31d711b..ebb7ed8f0 100644 --- a/internal/cmd/beta/alb/plans/plans_test.go +++ b/internal/cmd/beta/alb/plans/plans_test.go @@ -21,9 +21,10 @@ var ( testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") testClient = &alb.APIClient{} testProjectId = uuid.NewString() - testRegion = "eu01" ) +const testRegion = "eu01" + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, @@ -132,6 +133,7 @@ func TestBuildRequest(t *testing.T) { func Test_outputResult(t *testing.T) { type args struct { outputFormat string + projectLabel string items []alb.PlanDetails } tests := []struct { @@ -160,7 +162,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.items); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From d98da15248c04766b2eac344d89539e30286c52d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 09:14:55 +0100 Subject: [PATCH 240/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mariadb (#1129) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 27390aaa3..c01feafd1 100644 --- a/go.mod +++ b/go.mod @@ -246,7 +246,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 diff --git a/go.sum b/go.sum index 4e7df87f2..7eeff2bf4 100644 --- a/go.sum +++ b/go.sum @@ -581,8 +581,8 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVE github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638gOKTZRAnnQuMhYqaliuz/A8BcfjhU= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2/go.mod h1:OlGmMlXKp33ZYpUm9TqaLYf8SdzhDW5uBKcbgq1zXOk= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1 h1:Db/ebOL2vbpIeh5XB2Ews2B9Lj5DJlMWIEJh60FfZ4Y= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.1/go.mod h1:8jdN4v2euK3f9gfdzbRi8e4nBJ8g/Q5YF9aPB4M4fCQ= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2 h1:SfRbw3DxvDnZF2q6D9xfSy8EKHyrG5TgLMP0qRW8r9o= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2/go.mod h1:VmXwRQHZsGUjGWdLf8d2WhKNyuPi5+JgCAF/meOp4DE= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 h1:tGa+NcjNKTWvChN+0OMdLomb9Jod4MmY6YAiPTJMgfo= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3/go.mod h1:ciuOzwN5GcqplRy95fXRaS44dFmhfNxvmzTl/ALwV/k= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7R74xuH/ztcPrDIuMp2KV3QQMjeE7lFudboM= From da73b8fd730fb9f711a83a9574289c17099a7501 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 08:24:31 +0000 Subject: [PATCH 241/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/redis (#1128) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c01feafd1..bd67ff359 100644 --- a/go.mod +++ b/go.mod @@ -250,7 +250,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.38.0 // indirect diff --git a/go.sum b/go.sum index 7eeff2bf4..3e9a56c8f 100644 --- a/go.sum +++ b/go.sum @@ -595,8 +595,8 @@ github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1/go.mod h1:hyhw+I19NtjKmRLcUkY4boaTxnYSPFGbpn4RxvGqH2s= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4H1thfEEsDq+O0Ce0hNhdbkJ5eDdGEoE= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1 h1:8uPt82Ez34OYMOijjEYxB1zUW6kiybkt6veQKl0AL68= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.1/go.mod h1:1Y2GEICmZDt+kr8aGnBx/sjYVAIYHmtfC8xYi9oxNEE= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2 h1:VWx+u5b9r+HEm2rCtGlS7OFKl6Fnqe6s2xyCBA3IbM8= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2/go.mod h1:fg1pAqju7q5A696aiok2L4SHZIjZCCiBCpsm7FrQZMA= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 h1:KDa5sy6NSzMOXaf4a9skxOm8oUoleI45fLbD3ww7qsc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1/go.mod h1:+k3iHkWpehO+FLC5WsW7eGhYdNjDklYqRcpIxQBLbZg= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oPt08I2WLsxJDoVDsPMW2VkvKW7/SlUv10= From e1823682316c41d198159315f03eb342728dd06b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 08:34:22 +0000 Subject: [PATCH 242/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/runcommand (#1127) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bd67ff359..5d51e5f9a 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 diff --git a/go.sum b/go.sum index 3e9a56c8f..c53db8904 100644 --- a/go.sum +++ b/go.sum @@ -599,8 +599,8 @@ github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2 h1:VWx+u5b9r+HEm2r github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2/go.mod h1:fg1pAqju7q5A696aiok2L4SHZIjZCCiBCpsm7FrQZMA= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 h1:KDa5sy6NSzMOXaf4a9skxOm8oUoleI45fLbD3ww7qsc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1/go.mod h1:+k3iHkWpehO+FLC5WsW7eGhYdNjDklYqRcpIxQBLbZg= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1 h1:CPIuqhQw+oPt08I2WLsxJDoVDsPMW2VkvKW7/SlUv10= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.1/go.mod h1:tip0Ob6x06luy3CmRrmnCMtU5cha95fQLdvZlno3J4w= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 h1:Jts49V7XvLLr7MwI9o5Mo0NW3iUVVt8DtqNqRDt6ags= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2/go.mod h1:hV1rmsyb3jlL5kWO+flhtXTbm5EM9vU+BJsV4U/YEUU= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 h1:LONKouoyrgDfu4Tu152YFjd5cw3SoG8P7PHdd8tsBOU= From 5102b0afa2098fd39bea2f94bacdd27a1b06c3c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 09:44:40 +0100 Subject: [PATCH 243/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/authorization (#1120) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5d51e5f9a..1c480a62e 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 diff --git a/go.sum b/go.sum index c53db8904..73058335f 100644 --- a/go.sum +++ b/go.sum @@ -565,8 +565,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.20.0 h1:4rrUk6uT1g4nOn5/g1uXukP07 github.com/stackitcloud/stackit-sdk-go/core v0.20.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 h1:x7ndqw6yaOw+TmThNeAkI+eN9vK5hWgjIJlFZrYPREo= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2/go.mod h1:wbPNu6e5r/5xhzznCKbC7fEJahrAOb89gmaIm+0w2/s= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0 h1:7ZKd3b+E/R4TEVShLTXxx5FrsuDuJBOyuVOuKTMa4mo= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.9.0/go.mod h1:/FoXa6hF77Gv8brrvLBCKa5ie1Xy9xn39yfHwaln9Tw= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5CuPb5ixdMHx4tKjmsQkMn0Hpj0xJ+aNDimKnk= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0/go.mod h1:40XVgsSOcVCjoIAsbSycDh8Ikp2y88AdAeqwqIIHvZE= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0eb68ZD2KL1C8OFD8RG2sWMQGL6o= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 h1:RgWfaWDY8ZGZp5gEBe/A1r7s5NCRuLiYuHhscH6Ej9U= From bdcdd1151e71aaac624f5de2132832057a757d4e Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Fri, 28 Nov 2025 09:57:57 +0100 Subject: [PATCH 244/422] chore: increase linter timeout (#1131) --- golang-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/golang-ci.yaml b/golang-ci.yaml index 3487f7456..611e2e172 100644 --- a/golang-ci.yaml +++ b/golang-ci.yaml @@ -7,7 +7,7 @@ run: concurrency: 4 # timeout for analysis, e.g. 30s, 5m, default is 1m - timeout: 5m + timeout: 10m linters-settings: goimports: # put imports beginning with prefix after 3rd-party packages; From bb0b77b509e0b63d9f2308c1c82b5cb1820bab95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 15:29:23 +0100 Subject: [PATCH 245/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/intake (#1132) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1c480a62e..1d1b566c7 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 - github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 + github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 diff --git a/go.sum b/go.sum index 73058335f..6c5568826 100644 --- a/go.sum +++ b/go.sum @@ -573,8 +573,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 h1:RgWfaWDY8ZGZp5gEBe github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 h1:afGHMCqBM/E/FPUvbfSTFb9ddI+eDm2a7DpWPCkxMzs= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2/go.mod h1:/DlO7+cOqyYKROIxkBYIUdMoEfFevkVXhsShglxyUOQ= -github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0 h1:OdY3eXn98hWIhZBH8qQTFsYP6cag8B29UdwTjMwAjfw= -github.com/stackitcloud/stackit-sdk-go/services/intake v0.3.0/go.mod h1:mf+DQwwTVfc8MD0vwTNPzin2unKAIyQRYywv3wUyH38= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 h1:KwjR5L+IoUbRYS8k3dyqHgtBUuq8cqRPrUrzzZSSnRI= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0/go.mod h1:Nea8wkoPGvcjKCsjfbAB3pE3kA7oZLi+Zk9hUtunjRI= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1/go.mod h1:Wh1NKX5ZI0FuIdYavOYu0Cjh0yA3S9rlm4j5g0vuPVI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= From 6a53617685574ec0088ab1ca5284144012edf3e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Nov 2025 14:40:03 +0000 Subject: [PATCH 246/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#1133) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1d1b566c7..1b9b1d69c 100644 --- a/go.mod +++ b/go.mod @@ -244,7 +244,7 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 diff --git a/go.sum b/go.sum index 6c5568826..390cffab1 100644 --- a/go.sum +++ b/go.sum @@ -577,8 +577,8 @@ github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 h1:KwjR5L+IoUbRYS8 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0/go.mod h1:Nea8wkoPGvcjKCsjfbAB3pE3kA7oZLi+Zk9hUtunjRI= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1/go.mod h1:Wh1NKX5ZI0FuIdYavOYu0Cjh0yA3S9rlm4j5g0vuPVI= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0 h1:q33ZaCBVEBUsnMDxYyuJKtJvGcE5nKgvuPed3s8zXNI= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.0/go.mod h1:20QOZ3rBC9wTGgzXzLz9M6YheX0VaxWE0/JI+s8On7k= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 h1:BHNjq4+OsmVrGu1KBOv0dh/++nwysyINtAUTxNFz2Uo= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1/go.mod h1:sTV6ylmBoMOrOxUED8Ebts4a1PaJSPLtmNh5m+s5fus= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638gOKTZRAnnQuMhYqaliuz/A8BcfjhU= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2/go.mod h1:OlGmMlXKp33ZYpUm9TqaLYf8SdzhDW5uBKcbgq1zXOk= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2 h1:SfRbw3DxvDnZF2q6D9xfSy8EKHyrG5TgLMP0qRW8r9o= From 58a4b77aaad4a2c62dd503abe75f563ca2742f51 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Fri, 28 Nov 2025 17:19:33 +0100 Subject: [PATCH 247/422] fix: log browser url to stderr instead of stdout (#1136) fixes #1125 --- internal/pkg/auth/user_login.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index 2ec2040dd..c01dbccba 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -245,8 +245,8 @@ func AuthorizeUser(p *print.Printer, isReauthentication bool) error { } // Print the link - p.Outputln("Your browser has been opened to visit:\n") - p.Outputf("%s\n\n", authorizationURL) + p.Info("Your browser has been opened to visit:\n\n") + p.Info("%s\n\n", authorizationURL) // Start the blocking web server loop // It will exit when the handlers get fired and call server.Close() From 21985b286e47786027bf26ad2d5c2a2ef13edec1 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 1 Dec 2025 14:44:33 +0100 Subject: [PATCH 248/422] fix(deps): update module github.com/goccy/go-yaml to v1.19.0 (#1137) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1b9b1d69c..2857d30bd 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.24.0 require ( github.com/fatih/color v1.18.0 - github.com/goccy/go-yaml v1.18.0 + github.com/goccy/go-yaml v1.19.0 github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 390cffab1..d1d11505a 100644 --- a/go.sum +++ b/go.sum @@ -213,8 +213,8 @@ github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUW github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= -github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= +github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= From 437c1adc5cd466374b3c4efc301adcf26a288e7c Mon Sep 17 00:00:00 2001 From: Piet van der Meulen Date: Mon, 1 Dec 2025 16:17:18 +0100 Subject: [PATCH 249/422] feat(mongodbflex): add readAnyDatabase and stackitAdmin roles for users (#1049) Co-authored-by: Ruben Hoenle --- docs/stackit_mongodbflex_user_create.md | 2 +- docs/stackit_mongodbflex_user_update.md | 2 +- internal/cmd/mongodbflex/user/create/create.go | 4 ++-- internal/cmd/mongodbflex/user/update/update.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/stackit_mongodbflex_user_create.md b/docs/stackit_mongodbflex_user_create.md index 99075fee8..e8d4cdace 100644 --- a/docs/stackit_mongodbflex_user_create.md +++ b/docs/stackit_mongodbflex_user_create.md @@ -29,7 +29,7 @@ stackit mongodbflex user create [flags] --database string The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it -h, --help Help for "stackit mongodbflex user create" --instance-id string ID of the instance - --role strings Roles of the user, possible values are ["read" "readWrite" "readWriteAnyDatabase"] (default [read]) + --role strings Roles of the user, possible values are ["read" "readWrite" "readAnyDatabase" "readWriteAnyDatabase" "stackitAdmin"]. The "readAnyDatabase", "readWriteAnyDatabase" and "stackitAdmin" roles will always be created in the admin database. (default [read]) --username string Username of the user. If not specified, a random username will be assigned ``` diff --git a/docs/stackit_mongodbflex_user_update.md b/docs/stackit_mongodbflex_user_update.md index 31a674972..02e0d42af 100644 --- a/docs/stackit_mongodbflex_user_update.md +++ b/docs/stackit_mongodbflex_user_update.md @@ -23,7 +23,7 @@ stackit mongodbflex user update USER_ID [flags] --database string The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it -h, --help Help for "stackit mongodbflex user update" --instance-id string ID of the instance - --role strings Roles of the user, possible values are ["read" "readWrite" "readWriteAnyDatabase"] (default []) + --role strings Roles of the user, possible values are ["read" "readWrite" "readAnyDatabase" "readWriteAnyDatabase" "stackitAdmin"]. The "readAnyDatabase", "readWriteAnyDatabase" and "stackitAdmin" roles will always be created in the admin database. (default []) ``` ### Options inherited from parent commands diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index f589c3996..cfeb7b6ba 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -101,12 +101,12 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { - roleOptions := []string{"read", "readWrite", "readWriteAnyDatabase"} + roleOptions := []string{"read", "readWrite", "readAnyDatabase", "readWriteAnyDatabase", "stackitAdmin"} cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the instance") cmd.Flags().String(usernameFlag, "", "Username of the user. If not specified, a random username will be assigned") cmd.Flags().String(databaseFlag, "", "The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it") - cmd.Flags().Var(flags.EnumSliceFlag(false, rolesDefault, roleOptions...), roleFlag, fmt.Sprintf("Roles of the user, possible values are %q", roleOptions)) + cmd.Flags().Var(flags.EnumSliceFlag(false, rolesDefault, roleOptions...), roleFlag, fmt.Sprintf("Roles of the user, possible values are %q. The \"readAnyDatabase\", \"readWriteAnyDatabase\" and \"stackitAdmin\" roles will always be created in the admin database.", roleOptions)) err := flags.MarkFlagsRequired(cmd, instanceIdFlag, databaseFlag) cobra.CheckErr(err) diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index df408025e..a8fcfee3e 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -97,11 +97,11 @@ func NewCmd(params *params.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { - roleOptions := []string{"read", "readWrite", "readWriteAnyDatabase"} + roleOptions := []string{"read", "readWrite", "readAnyDatabase", "readWriteAnyDatabase", "stackitAdmin"} cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the instance") cmd.Flags().String(databaseFlag, "", "The database inside the MongoDB instance that the user has access to. If it does not exist, it will be created once the user writes to it") - cmd.Flags().Var(flags.EnumSliceFlag(false, nil, roleOptions...), roleFlag, fmt.Sprintf("Roles of the user, possible values are %q", roleOptions)) + cmd.Flags().Var(flags.EnumSliceFlag(false, nil, roleOptions...), roleFlag, fmt.Sprintf("Roles of the user, possible values are %q. The \"readAnyDatabase\", \"readWriteAnyDatabase\" and \"stackitAdmin\" roles will always be created in the admin database.", roleOptions)) err := flags.MarkFlagsRequired(cmd, instanceIdFlag) cobra.CheckErr(err) From f352d44020ea2c7e2820d70fc125b4dc82ab766d Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Mon, 1 Dec 2025 16:52:31 +0100 Subject: [PATCH 250/422] fix: refresh token flow uses x-www-form encoding (#1135) --- internal/pkg/auth/user_token_flow.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/pkg/auth/user_token_flow.go b/internal/pkg/auth/user_token_flow.go index 215db2fa3..cdb852f77 100644 --- a/internal/pkg/auth/user_token_flow.go +++ b/internal/pkg/auth/user_token_flow.go @@ -6,6 +6,7 @@ import ( "io" "net/http" "net/url" + "strings" "time" "github.com/golang-jwt/jwt/v5" @@ -166,21 +167,21 @@ func buildRequestToRefreshTokens(utf *userTokenFlow) (*http.Request, error) { return nil, err } + form := url.Values{} + form.Set("grant_type", "refresh_token") + form.Set("client_id", idpClientID) + form.Set("refresh_token", utf.refreshToken) + req, err := http.NewRequest( http.MethodPost, utf.tokenEndpoint, - http.NoBody, + strings.NewReader(form.Encode()), ) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + if err != nil { return nil, err } - reqQuery := url.Values{} - reqQuery.Set("grant_type", "refresh_token") - reqQuery.Set("client_id", idpClientID) - reqQuery.Set("refresh_token", utf.refreshToken) - reqQuery.Set("token_format", "jwt") - req.URL.RawQuery = reqQuery.Encode() - return req, nil } From afbf59d3aa0a81af2c898f4dd62432f57ef185b5 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 2 Dec 2025 08:59:29 +0100 Subject: [PATCH 251/422] chore(deps): update renovatebot/github-action action to v44.0.5 (#1141) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 8551dd43e..d9eddd18a 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.0.4 + uses: renovatebot/github-action@v44.0.5 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From d5e084927b9028bb3edce474e73141b839adf5f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 08:08:35 +0000 Subject: [PATCH 252/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex (#1139) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2857d30bd..0a1369791 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.30.0 golang.org/x/oauth2 v0.33.0 diff --git a/go.sum b/go.sum index d1d11505a..94e312bbd 100644 --- a/go.sum +++ b/go.sum @@ -613,8 +613,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3/go.mod h1:icu5WtsZ8c57/pUrXeFLmZu29Qhwr/rsjTkVRWJYTqY= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miWlS5Dvo+cW90hbePaxOyWF67EE= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0/go.mod h1:/Ujlw+qo6RgKm69dD8y6MgmJFcUmrHjuJPO6VFoQX9U= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2 h1:aW8ehdoNRaCEs3xDr+YnGb6pru8zZTB8f7kl5lozlJE= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.2/go.mod h1:Jsry+gfhuXv2P0ldfa48BaL605NhDjdQMgaoV8czlbo= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.3 h1:TFefEGGxvcI7euqyosbLS/zSEOy+3JMGOirW3vNj/84= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.3/go.mod h1:Jsry+gfhuXv2P0ldfa48BaL605NhDjdQMgaoV8czlbo= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From b824fb3173b03a0650dbe6989e322b779dc94465 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 2 Dec 2025 10:25:49 +0100 Subject: [PATCH 253/422] chore(linter): remove duplicate linter timeout configuration (#1142) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a3b64bb3d..836e41ad4 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ ROOT_DIR ?= $(shell git rev-parse --show-toplevel) SCRIPTS_BASE ?= $(ROOT_DIR)/scripts GOLANG_CI_YAML_PATH ?= ${ROOT_DIR}/golang-ci.yaml -GOLANG_CI_ARGS ?= --allow-parallel-runners --timeout=5m --config=${GOLANG_CI_YAML_PATH} +GOLANG_CI_ARGS ?= --allow-parallel-runners --config=${GOLANG_CI_YAML_PATH} # Build build: From 4fca05266d0fe4e7d0dd1db094b751be8a5b22a7 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 4 Dec 2025 07:43:48 +0100 Subject: [PATCH 254/422] fix(deps): update module github.com/spf13/cobra to v1.10.2 (#1145) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0a1369791..eab844658 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/jedib0t/go-pretty/v6 v6.7.5 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 - github.com/spf13/cobra v1.10.1 + github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.0 diff --git a/go.sum b/go.sum index 94e312bbd..7f62cc374 100644 --- a/go.sum +++ b/go.sum @@ -551,8 +551,8 @@ github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= -github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +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.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= From 98a09dd59c41467277dda114bcacc4084afb9fbc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 06:52:25 +0000 Subject: [PATCH 255/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/git (#1144) Bumps [github.com/stackitcloud/stackit-sdk-go/services/git](https://github.com/stackitcloud/stackit-sdk-go) from 0.9.1 to 0.10.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/dns/v0.9.1...core/v0.10.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/git dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eab844658..faa3677e0 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 - github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 + github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 diff --git a/go.sum b/go.sum index 7f62cc374..23bd2f366 100644 --- a/go.sum +++ b/go.sum @@ -569,8 +569,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5C github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0/go.mod h1:40XVgsSOcVCjoIAsbSycDh8Ikp2y88AdAeqwqIIHvZE= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0eb68ZD2KL1C8OFD8RG2sWMQGL6o= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= -github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1 h1:RgWfaWDY8ZGZp5gEBe/A1r7s5NCRuLiYuHhscH6Ej9U= -github.com/stackitcloud/stackit-sdk-go/services/git v0.9.1/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= +github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0 h1:fWAjxvf5D1jc1hvziGxJq68RO4pDXBUAPVrIumHb5mw= +github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 h1:afGHMCqBM/E/FPUvbfSTFb9ddI+eDm2a7DpWPCkxMzs= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2/go.mod h1:/DlO7+cOqyYKROIxkBYIUdMoEfFevkVXhsShglxyUOQ= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 h1:KwjR5L+IoUbRYS8k3dyqHgtBUuq8cqRPrUrzzZSSnRI= From a25a7774cc5c72da73218774403f161f0b9b6c0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 07:25:58 +0100 Subject: [PATCH 256/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/core (#1147) Bumps [github.com/stackitcloud/stackit-sdk-go/core](https://github.com/stackitcloud/stackit-sdk-go) from 0.20.0 to 0.20.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.20.0...core/v0.20.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/core dependency-version: 0.20.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index faa3677e0..dc4c28008 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.20.0 + github.com/stackitcloud/stackit-sdk-go/core v0.20.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 diff --git a/go.sum b/go.sum index 23bd2f366..8d09c805b 100644 --- a/go.sum +++ b/go.sum @@ -561,8 +561,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.20.0 h1:4rrUk6uT1g4nOn5/g1uXukP07Tux/o5xbMz/f/qE1rY= -github.com/stackitcloud/stackit-sdk-go/core v0.20.0/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= +github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= +github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 h1:x7ndqw6yaOw+TmThNeAkI+eN9vK5hWgjIJlFZrYPREo= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2/go.mod h1:wbPNu6e5r/5xhzznCKbC7fEJahrAOb89gmaIm+0w2/s= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5CuPb5ixdMHx4tKjmsQkMn0Hpj0xJ+aNDimKnk= From fb6cfcaf6e36eb5fdb8dbc164916278632c6c009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Fri, 5 Dec 2025 11:30:14 +0100 Subject: [PATCH 257/422] chore(deps): bump golangci-lint from v1 to v2 (#1148) relates to STACKITTPR-438, STACKITTPR-253 --- .github/docs/contribution-guide/cmd.go | 5 +- go.mod | 151 ++++---- go.sum | 339 +++++++++--------- golang-ci.yaml | 146 ++++---- .../cmd/affinity-groups/affinity-groups.go | 6 +- internal/cmd/affinity-groups/create/create.go | 7 +- .../cmd/affinity-groups/create/create_test.go | 5 +- internal/cmd/affinity-groups/delete/delete.go | 5 +- .../cmd/affinity-groups/delete/delete_test.go | 5 +- .../cmd/affinity-groups/describe/describe.go | 7 +- .../affinity-groups/describe/describe_test.go | 7 +- internal/cmd/affinity-groups/list/list.go | 7 +- .../cmd/affinity-groups/list/list_test.go | 5 +- .../activate_service_account.go | 5 +- internal/cmd/auth/auth.go | 6 +- .../auth/get-access-token/get_access_token.go | 5 +- internal/cmd/auth/login/login.go | 5 +- internal/cmd/auth/logout/logout.go | 5 +- internal/cmd/beta/alb/alb.go | 6 +- internal/cmd/beta/alb/create/create.go | 5 +- internal/cmd/beta/alb/create/create_test.go | 5 +- internal/cmd/beta/alb/delete/delete.go | 5 +- internal/cmd/beta/alb/describe/describe.go | 5 +- .../cmd/beta/alb/describe/describe_test.go | 5 +- internal/cmd/beta/alb/list/list.go | 5 +- internal/cmd/beta/alb/list/list_test.go | 5 +- .../alb/observability-credentials/add/add.go | 7 +- .../observability-credentials/add/add_test.go | 5 +- .../delete/delete.go | 5 +- .../delete/delete_test.go | 5 +- .../describe/describe.go | 5 +- .../describe/describe_test.go | 5 +- .../observability-credentials/list/list.go | 5 +- .../list/list_test.go | 5 +- .../observability-credentials.go | 6 +- .../update/update.go | 7 +- .../update/update_test.go | 7 +- internal/cmd/beta/alb/plans/plans.go | 5 +- internal/cmd/beta/alb/plans/plans_test.go | 5 +- internal/cmd/beta/alb/pool/pool.go | 6 +- internal/cmd/beta/alb/pool/update/update.go | 5 +- .../cmd/beta/alb/pool/update/update_test.go | 5 +- internal/cmd/beta/alb/quotas/quotas.go | 5 +- internal/cmd/beta/alb/quotas/quotas_test.go | 5 +- internal/cmd/beta/alb/template/template.go | 5 +- internal/cmd/beta/alb/update/update.go | 5 +- internal/cmd/beta/alb/update/update_test.go | 5 +- internal/cmd/beta/beta.go | 7 +- internal/cmd/beta/intake/intake.go | 6 +- .../cmd/beta/intake/runner/create/create.go | 5 +- .../beta/intake/runner/create/create_test.go | 5 +- .../cmd/beta/intake/runner/delete/delete.go | 5 +- .../beta/intake/runner/describe/describe.go | 5 +- .../intake/runner/describe/describe_test.go | 5 +- internal/cmd/beta/intake/runner/list/list.go | 5 +- .../cmd/beta/intake/runner/list/list_test.go | 5 +- internal/cmd/beta/intake/runner/runner.go | 4 +- .../cmd/beta/intake/runner/update/update.go | 5 +- .../beta/intake/runner/update/update_test.go | 5 +- internal/cmd/beta/kms/key/create/create.go | 5 +- .../cmd/beta/kms/key/create/create_test.go | 5 +- internal/cmd/beta/kms/key/delete/delete.go | 5 +- .../cmd/beta/kms/key/delete/delete_test.go | 7 +- .../cmd/beta/kms/key/describe/describe.go | 9 +- .../beta/kms/key/describe/describe_test.go | 5 +- .../cmd/beta/kms/key/importKey/importKey.go | 7 +- .../beta/kms/key/importKey/importKey_test.go | 7 +- internal/cmd/beta/kms/key/key.go | 6 +- internal/cmd/beta/kms/key/list/list.go | 5 +- internal/cmd/beta/kms/key/list/list_test.go | 5 +- internal/cmd/beta/kms/key/restore/restore.go | 5 +- .../cmd/beta/kms/key/restore/restore_test.go | 7 +- internal/cmd/beta/kms/key/rotate/rotate.go | 5 +- .../cmd/beta/kms/key/rotate/rotate_test.go | 7 +- .../cmd/beta/kms/keyring/create/create.go | 5 +- .../beta/kms/keyring/create/create_test.go | 5 +- .../cmd/beta/kms/keyring/delete/delete.go | 5 +- .../beta/kms/keyring/delete/delete_test.go | 5 +- .../cmd/beta/kms/keyring/describe/describe.go | 9 +- .../kms/keyring/describe/describe_test.go | 5 +- internal/cmd/beta/kms/keyring/keyring.go | 6 +- internal/cmd/beta/kms/keyring/list/list.go | 5 +- .../cmd/beta/kms/keyring/list/list_test.go | 5 +- internal/cmd/beta/kms/kms.go | 6 +- .../cmd/beta/kms/version/destroy/destroy.go | 5 +- .../beta/kms/version/destroy/destroy_test.go | 7 +- .../cmd/beta/kms/version/disable/disable.go | 5 +- .../beta/kms/version/disable/disable_test.go | 7 +- .../cmd/beta/kms/version/enable/enable.go | 5 +- .../beta/kms/version/enable/enable_test.go | 7 +- internal/cmd/beta/kms/version/list/list.go | 5 +- .../cmd/beta/kms/version/list/list_test.go | 5 +- .../cmd/beta/kms/version/restore/restore.go | 5 +- .../beta/kms/version/restore/restore_test.go | 7 +- internal/cmd/beta/kms/version/version.go | 6 +- .../cmd/beta/kms/wrappingkey/create/create.go | 5 +- .../kms/wrappingkey/create/create_test.go | 5 +- .../cmd/beta/kms/wrappingkey/delete/delete.go | 5 +- .../kms/wrappingkey/delete/delete_test.go | 5 +- .../beta/kms/wrappingkey/describe/describe.go | 9 +- .../kms/wrappingkey/describe/describe_test.go | 5 +- .../cmd/beta/kms/wrappingkey/list/list.go | 5 +- .../beta/kms/wrappingkey/list/list_test.go | 5 +- .../cmd/beta/kms/wrappingkey/wrappingkey.go | 6 +- .../sqlserverflex/database/create/create.go | 5 +- .../database/create/create_test.go | 5 +- .../beta/sqlserverflex/database/database.go | 6 +- .../sqlserverflex/database/delete/delete.go | 5 +- .../database/describe/describe.go | 5 +- .../database/describe/describe_test.go | 5 +- .../beta/sqlserverflex/database/list/list.go | 5 +- .../sqlserverflex/database/list/list_test.go | 5 +- .../sqlserverflex/instance/create/create.go | 5 +- .../instance/create/create_test.go | 5 +- .../sqlserverflex/instance/delete/delete.go | 5 +- .../instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- .../beta/sqlserverflex/instance/instance.go | 6 +- .../beta/sqlserverflex/instance/list/list.go | 5 +- .../sqlserverflex/instance/list/list_test.go | 5 +- .../sqlserverflex/instance/update/update.go | 5 +- .../instance/update/update_test.go | 7 +- .../cmd/beta/sqlserverflex/options/options.go | 5 +- .../sqlserverflex/options/options_test.go | 7 +- .../cmd/beta/sqlserverflex/sqlserverflex.go | 6 +- .../beta/sqlserverflex/user/create/create.go | 5 +- .../sqlserverflex/user/create/create_test.go | 5 +- .../beta/sqlserverflex/user/delete/delete.go | 5 +- .../sqlserverflex/user/describe/describe.go | 5 +- .../user/describe/describe_test.go | 5 +- .../cmd/beta/sqlserverflex/user/list/list.go | 5 +- .../beta/sqlserverflex/user/list/list_test.go | 5 +- .../user/reset-password/reset_password.go | 5 +- .../reset-password/reset_password_test.go | 5 +- internal/cmd/beta/sqlserverflex/user/user.go | 6 +- internal/cmd/config/config.go | 7 +- internal/cmd/config/list/list.go | 5 +- internal/cmd/config/list/list_test.go | 4 +- internal/cmd/config/profile/create/create.go | 4 +- .../cmd/config/profile/create/create_test.go | 2 +- internal/cmd/config/profile/delete/delete.go | 4 +- .../cmd/config/profile/delete/delete_test.go | 2 +- internal/cmd/config/profile/export/export.go | 5 +- internal/cmd/config/profile/import/import.go | 4 +- internal/cmd/config/profile/list/list.go | 5 +- internal/cmd/config/profile/list/list_test.go | 5 +- internal/cmd/config/profile/profile.go | 7 +- internal/cmd/config/profile/set/set.go | 5 +- internal/cmd/config/profile/set/set_test.go | 2 +- internal/cmd/config/profile/unset/unset.go | 5 +- internal/cmd/config/set/set.go | 10 +- internal/cmd/config/unset/unset.go | 5 +- internal/cmd/config/unset/unset_test.go | 4 +- internal/cmd/curl/curl.go | 5 +- internal/cmd/curl/curl_test.go | 7 +- internal/cmd/dns/dns.go | 6 +- internal/cmd/dns/record-set/create/create.go | 5 +- .../cmd/dns/record-set/create/create_test.go | 5 +- internal/cmd/dns/record-set/delete/delete.go | 5 +- .../cmd/dns/record-set/describe/describe.go | 5 +- .../dns/record-set/describe/describe_test.go | 5 +- internal/cmd/dns/record-set/list/list.go | 5 +- internal/cmd/dns/record-set/list/list_test.go | 5 +- internal/cmd/dns/record-set/record_set.go | 6 +- internal/cmd/dns/record-set/update/update.go | 5 +- .../cmd/dns/record-set/update/update_test.go | 4 +- internal/cmd/dns/zone/clone/clone.go | 5 +- internal/cmd/dns/zone/clone/clone_test.go | 5 +- internal/cmd/dns/zone/create/create.go | 5 +- internal/cmd/dns/zone/create/create_test.go | 5 +- internal/cmd/dns/zone/delete/delete.go | 5 +- internal/cmd/dns/zone/describe/describe.go | 5 +- .../cmd/dns/zone/describe/describe_test.go | 5 +- internal/cmd/dns/zone/list/list.go | 5 +- internal/cmd/dns/zone/list/list_test.go | 5 +- internal/cmd/dns/zone/update/update.go | 5 +- internal/cmd/dns/zone/update/update_test.go | 5 +- internal/cmd/dns/zone/zone.go | 6 +- internal/cmd/git/flavor/flavor.go | 6 +- internal/cmd/git/flavor/list/list.go | 5 +- internal/cmd/git/flavor/list/list_test.go | 5 +- internal/cmd/git/git.go | 6 +- internal/cmd/git/instance/create/create.go | 5 +- .../cmd/git/instance/create/create_test.go | 5 +- internal/cmd/git/instance/delete/delete.go | 4 +- .../cmd/git/instance/delete/delete_test.go | 5 +- .../cmd/git/instance/describe/describe.go | 4 +- .../git/instance/describe/describe_test.go | 7 +- internal/cmd/git/instance/instance.go | 6 +- internal/cmd/git/instance/list/list.go | 4 +- internal/cmd/git/instance/list/list_test.go | 5 +- internal/cmd/image/create/create.go | 5 +- internal/cmd/image/create/create_test.go | 5 +- internal/cmd/image/delete/delete.go | 5 +- internal/cmd/image/delete/delete_test.go | 5 +- internal/cmd/image/describe/describe.go | 5 +- internal/cmd/image/describe/describe_test.go | 7 +- internal/cmd/image/image.go | 6 +- internal/cmd/image/list/list.go | 13 +- internal/cmd/image/list/list_test.go | 5 +- internal/cmd/image/update/update.go | 5 +- internal/cmd/image/update/update_test.go | 5 +- internal/cmd/key-pair/create/create.go | 7 +- internal/cmd/key-pair/create/create_test.go | 5 +- internal/cmd/key-pair/delete/delete.go | 5 +- internal/cmd/key-pair/delete/delete_test.go | 5 +- internal/cmd/key-pair/describe/describe.go | 5 +- .../cmd/key-pair/describe/describe_test.go | 5 +- internal/cmd/key-pair/key-pair.go | 6 +- internal/cmd/key-pair/list/list.go | 5 +- internal/cmd/key-pair/list/list_test.go | 5 +- internal/cmd/key-pair/update/update.go | 7 +- internal/cmd/key-pair/update/update_test.go | 7 +- internal/cmd/load-balancer/create/create.go | 5 +- internal/cmd/load-balancer/delete/delete.go | 5 +- .../cmd/load-balancer/describe/describe.go | 5 +- .../load-balancer/describe/describe_test.go | 5 +- .../generate-payload/generate_payload.go | 5 +- .../generate-payload/generate_payload_test.go | 7 +- internal/cmd/load-balancer/list/list.go | 5 +- internal/cmd/load-balancer/list/list_test.go | 5 +- internal/cmd/load-balancer/load_balancer.go | 6 +- .../observability-credentials/add/add.go | 5 +- .../observability-credentials/add/add_test.go | 5 +- .../cleanup/cleanup.go | 5 +- .../delete/delete.go | 5 +- .../describe/describe.go | 5 +- .../describe/describe_test.go | 5 +- .../observability-credentials/list/list.go | 5 +- .../list/list_test.go | 5 +- .../observability-credentials.go | 6 +- .../update/update.go | 5 +- internal/cmd/load-balancer/quota/quota.go | 5 +- .../cmd/load-balancer/quota/quota_test.go | 5 +- .../target-pool/add-target/add_target.go | 5 +- .../target-pool/add-target/add_target_test.go | 5 +- .../target-pool/describe/describe.go | 5 +- .../target-pool/describe/describe_test.go | 7 +- .../remove-target/remove_target.go | 5 +- .../remove-target/remove_target_test.go | 5 +- .../load-balancer/target-pool/target_pool.go | 6 +- internal/cmd/load-balancer/update/update.go | 5 +- .../cmd/logme/credentials/create/create.go | 5 +- .../logme/credentials/create/create_test.go | 5 +- internal/cmd/logme/credentials/credentials.go | 6 +- .../cmd/logme/credentials/delete/delete.go | 5 +- .../logme/credentials/describe/describe.go | 5 +- .../credentials/describe/describe_test.go | 5 +- internal/cmd/logme/credentials/list/list.go | 5 +- .../cmd/logme/credentials/list/list_test.go | 5 +- internal/cmd/logme/instance/create/create.go | 5 +- .../cmd/logme/instance/create/create_test.go | 5 +- internal/cmd/logme/instance/delete/delete.go | 5 +- .../cmd/logme/instance/describe/describe.go | 5 +- .../logme/instance/describe/describe_test.go | 5 +- internal/cmd/logme/instance/instance.go | 6 +- internal/cmd/logme/instance/list/list.go | 5 +- internal/cmd/logme/instance/list/list_test.go | 5 +- internal/cmd/logme/instance/update/update.go | 5 +- .../cmd/logme/instance/update/update_test.go | 5 +- internal/cmd/logme/logme.go | 6 +- internal/cmd/logme/plans/plans.go | 5 +- internal/cmd/logme/plans/plans_test.go | 5 +- .../cmd/mariadb/credentials/create/create.go | 5 +- .../mariadb/credentials/create/create_test.go | 5 +- .../cmd/mariadb/credentials/credentials.go | 6 +- .../cmd/mariadb/credentials/delete/delete.go | 5 +- .../mariadb/credentials/describe/describe.go | 5 +- .../credentials/describe/describe_test.go | 5 +- internal/cmd/mariadb/credentials/list/list.go | 5 +- .../cmd/mariadb/credentials/list/list_test.go | 5 +- .../cmd/mariadb/instance/create/create.go | 5 +- .../mariadb/instance/create/create_test.go | 5 +- .../cmd/mariadb/instance/delete/delete.go | 5 +- .../cmd/mariadb/instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/mariadb/instance/instance.go | 6 +- internal/cmd/mariadb/instance/list/list.go | 5 +- .../cmd/mariadb/instance/list/list_test.go | 5 +- .../cmd/mariadb/instance/update/update.go | 5 +- .../mariadb/instance/update/update_test.go | 5 +- internal/cmd/mariadb/mariadb.go | 6 +- internal/cmd/mariadb/plans/plans.go | 5 +- internal/cmd/mariadb/plans/plans_test.go | 5 +- internal/cmd/mongodbflex/backup/backup.go | 6 +- .../mongodbflex/backup/describe/describe.go | 5 +- .../backup/describe/describe_test.go | 5 +- internal/cmd/mongodbflex/backup/list/list.go | 5 +- .../cmd/mongodbflex/backup/list/list_test.go | 5 +- .../backup/restore-jobs/restore_jobs.go | 5 +- .../backup/restore-jobs/restore_jobs_test.go | 5 +- .../cmd/mongodbflex/backup/restore/restore.go | 5 +- .../mongodbflex/backup/schedule/schedule.go | 5 +- .../backup/schedule/schedule_test.go | 5 +- .../backup/update-schedule/update_schedule.go | 5 +- .../cmd/mongodbflex/instance/create/create.go | 5 +- .../instance/create/create_test.go | 5 +- .../cmd/mongodbflex/instance/delete/delete.go | 5 +- .../mongodbflex/instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/mongodbflex/instance/instance.go | 6 +- .../cmd/mongodbflex/instance/list/list.go | 5 +- .../mongodbflex/instance/list/list_test.go | 5 +- .../cmd/mongodbflex/instance/update/update.go | 5 +- .../instance/update/update_test.go | 7 +- internal/cmd/mongodbflex/mongodbflex.go | 6 +- internal/cmd/mongodbflex/options/options.go | 4 +- .../cmd/mongodbflex/options/options_test.go | 9 +- .../cmd/mongodbflex/user/create/create.go | 5 +- .../mongodbflex/user/create/create_test.go | 5 +- .../cmd/mongodbflex/user/delete/delete.go | 5 +- .../cmd/mongodbflex/user/describe/describe.go | 5 +- .../user/describe/describe_test.go | 5 +- internal/cmd/mongodbflex/user/list/list.go | 5 +- .../cmd/mongodbflex/user/list/list_test.go | 5 +- .../user/reset-password/reset_password.go | 5 +- .../reset-password/reset_password_test.go | 5 +- .../cmd/mongodbflex/user/update/update.go | 5 +- internal/cmd/mongodbflex/user/user.go | 6 +- internal/cmd/network-area/create/create.go | 5 +- .../cmd/network-area/create/create_test.go | 5 +- internal/cmd/network-area/delete/delete.go | 5 +- .../cmd/network-area/describe/describe.go | 5 +- .../network-area/describe/describe_test.go | 5 +- internal/cmd/network-area/list/list.go | 5 +- internal/cmd/network-area/list/list_test.go | 5 +- .../network-range/create/create.go | 5 +- .../network-range/create/create_test.go | 5 +- .../network-range/delete/delete.go | 5 +- .../network-range/delete/delete_test.go | 5 +- .../network-range/describe/describe.go | 5 +- .../network-range/describe/describe_test.go | 7 +- .../network-area/network-range/list/list.go | 5 +- .../network-range/list/list_test.go | 5 +- .../network-range/network_range.go | 6 +- internal/cmd/network-area/network_area.go | 6 +- .../cmd/network-area/region/create/create.go | 5 +- .../network-area/region/create/create_test.go | 5 +- .../cmd/network-area/region/delete/delete.go | 5 +- .../network-area/region/describe/describe.go | 5 +- .../region/describe/describe_test.go | 5 +- internal/cmd/network-area/region/list/list.go | 5 +- .../cmd/network-area/region/list/list_test.go | 5 +- internal/cmd/network-area/region/region.go | 6 +- .../cmd/network-area/region/update/update.go | 5 +- .../network-area/region/update/update_test.go | 5 +- .../cmd/network-area/route/create/create.go | 5 +- .../network-area/route/create/create_test.go | 5 +- .../cmd/network-area/route/delete/delete.go | 5 +- .../network-area/route/delete/delete_test.go | 5 +- .../network-area/route/describe/describe.go | 5 +- .../route/describe/describe_test.go | 7 +- internal/cmd/network-area/route/list/list.go | 5 +- .../cmd/network-area/route/list/list_test.go | 5 +- internal/cmd/network-area/route/routes.go | 6 +- .../cmd/network-area/route/update/update.go | 5 +- .../network-area/route/update/update_test.go | 7 +- internal/cmd/network-area/update/update.go | 5 +- .../cmd/network-area/update/update_test.go | 7 +- .../cmd/network-interface/create/create.go | 5 +- .../network-interface/create/create_test.go | 9 +- .../cmd/network-interface/delete/delete.go | 5 +- .../network-interface/delete/delete_test.go | 5 +- .../network-interface/describe/describe.go | 5 +- .../describe/describe_test.go | 7 +- internal/cmd/network-interface/list/list.go | 5 +- .../cmd/network-interface/list/list_test.go | 5 +- .../network-interface/network-interface.go | 6 +- .../cmd/network-interface/update/update.go | 5 +- .../network-interface/update/update_test.go | 11 +- internal/cmd/network/create/create.go | 12 +- internal/cmd/network/create/create_test.go | 5 +- internal/cmd/network/delete/delete.go | 5 +- internal/cmd/network/describe/describe.go | 5 +- .../cmd/network/describe/describe_test.go | 5 +- internal/cmd/network/list/list.go | 5 +- internal/cmd/network/list/list_test.go | 5 +- internal/cmd/network/network.go | 6 +- internal/cmd/network/update/update.go | 5 +- internal/cmd/network/update/update_test.go | 5 +- internal/cmd/object-storage/bucket/bucket.go | 6 +- .../object-storage/bucket/create/create.go | 5 +- .../bucket/create/create_test.go | 5 +- .../object-storage/bucket/delete/delete.go | 5 +- .../bucket/describe/describe.go | 5 +- .../bucket/describe/describe_test.go | 5 +- .../cmd/object-storage/bucket/list/list.go | 5 +- .../object-storage/bucket/list/list_test.go | 5 +- .../credentials-group/create/create.go | 5 +- .../credentials-group/create/create_test.go | 5 +- .../credentials-group/credentials_group.go | 6 +- .../credentials-group/delete/delete.go | 5 +- .../credentials-group/list/list.go | 5 +- .../credentials-group/list/list_test.go | 5 +- .../credentials/create/create.go | 5 +- .../credentials/create/create_test.go | 5 +- .../object-storage/credentials/credentials.go | 6 +- .../credentials/delete/delete.go | 5 +- .../object-storage/credentials/list/list.go | 5 +- .../credentials/list/list_test.go | 5 +- .../cmd/object-storage/disable/disable.go | 5 +- internal/cmd/object-storage/enable/enable.go | 5 +- internal/cmd/object-storage/object_storage.go | 6 +- .../credentials/create/create.go | 5 +- .../credentials/create/create_test.go | 5 +- .../observability/credentials/credentials.go | 6 +- .../credentials/delete/delete.go | 5 +- .../observability/credentials/list/list.go | 5 +- .../credentials/list/list_test.go | 5 +- .../grafana/describe/describe.go | 5 +- .../grafana/describe/describe_test.go | 7 +- internal/cmd/observability/grafana/grafana.go | 6 +- .../public-read-access/disable/disable.go | 5 +- .../public-read-access/enable/enable.go | 5 +- .../public-read-access/public_read_access.go | 7 +- .../grafana/single-sign-on/disable/disable.go | 5 +- .../grafana/single-sign-on/enable/enable.go | 5 +- .../grafana/single-sign-on/single_sign_on.go | 7 +- .../observability/instance/create/create.go | 5 +- .../instance/create/create_test.go | 5 +- .../observability/instance/delete/delete.go | 5 +- .../instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- .../cmd/observability/instance/instance.go | 6 +- .../cmd/observability/instance/list/list.go | 5 +- .../observability/instance/list/list_test.go | 5 +- .../observability/instance/update/update.go | 5 +- internal/cmd/observability/observability.go | 6 +- internal/cmd/observability/plans/plans.go | 5 +- .../cmd/observability/plans/plans_test.go | 5 +- .../scrape-config/create/create.go | 5 +- .../scrape-config/delete/delete.go | 5 +- .../scrape-config/describe/describe.go | 5 +- .../scrape-config/describe/describe_test.go | 5 +- .../generate-payload/generate_payload.go | 5 +- .../generate-payload/generate_payload_test.go | 7 +- .../observability/scrape-config/list/list.go | 5 +- .../scrape-config/list/list_test.go | 5 +- .../scrape-config/scrape_config.go | 6 +- .../scrape-config/update/update.go | 5 +- .../opensearch/credentials/create/create.go | 5 +- .../credentials/create/create_test.go | 5 +- .../cmd/opensearch/credentials/credentials.go | 6 +- .../opensearch/credentials/delete/delete.go | 5 +- .../credentials/describe/describe.go | 5 +- .../credentials/describe/describe_test.go | 5 +- .../cmd/opensearch/credentials/list/list.go | 5 +- .../opensearch/credentials/list/list_test.go | 5 +- .../cmd/opensearch/instance/create/create.go | 5 +- .../opensearch/instance/create/create_test.go | 5 +- .../cmd/opensearch/instance/delete/delete.go | 5 +- .../opensearch/instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/opensearch/instance/instance.go | 6 +- internal/cmd/opensearch/instance/list/list.go | 5 +- .../cmd/opensearch/instance/list/list_test.go | 5 +- .../cmd/opensearch/instance/update/update.go | 5 +- .../opensearch/instance/update/update_test.go | 5 +- internal/cmd/opensearch/opensearch.go | 6 +- internal/cmd/opensearch/plans/plans.go | 5 +- internal/cmd/opensearch/plans/plans_test.go | 5 +- internal/cmd/organization/member/add/add.go | 5 +- internal/cmd/organization/member/list/list.go | 10 +- .../cmd/organization/member/list/list_test.go | 5 +- internal/cmd/organization/member/member.go | 6 +- .../cmd/organization/member/remove/remove.go | 5 +- internal/cmd/organization/organization.go | 7 +- internal/cmd/organization/role/list/list.go | 5 +- .../cmd/organization/role/list/list_test.go | 5 +- internal/cmd/organization/role/role.go | 6 +- internal/cmd/postgresflex/backup/backup.go | 6 +- .../postgresflex/backup/describe/describe.go | 5 +- .../backup/describe/describe_test.go | 5 +- internal/cmd/postgresflex/backup/list/list.go | 9 +- .../cmd/postgresflex/backup/list/list_test.go | 5 +- .../backup/update-schedule/update_schedule.go | 5 +- .../cmd/postgresflex/instance/clone/clone.go | 5 +- .../postgresflex/instance/clone/clone_test.go | 5 +- .../postgresflex/instance/create/create.go | 5 +- .../instance/create/create_test.go | 5 +- .../postgresflex/instance/delete/delete.go | 5 +- .../instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- .../cmd/postgresflex/instance/instance.go | 6 +- .../cmd/postgresflex/instance/list/list.go | 5 +- .../postgresflex/instance/list/list_test.go | 5 +- .../postgresflex/instance/update/update.go | 5 +- .../instance/update/update_test.go | 7 +- internal/cmd/postgresflex/options/options.go | 4 +- .../cmd/postgresflex/options/options_test.go | 7 +- internal/cmd/postgresflex/postgresflex.go | 6 +- .../cmd/postgresflex/user/create/create.go | 5 +- .../postgresflex/user/create/create_test.go | 5 +- .../cmd/postgresflex/user/delete/delete.go | 5 +- .../postgresflex/user/describe/describe.go | 5 +- .../user/describe/describe_test.go | 5 +- internal/cmd/postgresflex/user/list/list.go | 5 +- .../cmd/postgresflex/user/list/list_test.go | 5 +- .../user/reset-password/reset_password.go | 5 +- .../reset-password/reset_password_test.go | 5 +- .../cmd/postgresflex/user/update/update.go | 5 +- internal/cmd/postgresflex/user/user.go | 6 +- internal/cmd/project/create/create.go | 5 +- internal/cmd/project/create/create_test.go | 5 +- internal/cmd/project/delete/delete.go | 5 +- internal/cmd/project/describe/describe.go | 7 +- .../cmd/project/describe/describe_test.go | 5 +- internal/cmd/project/list/list.go | 5 +- internal/cmd/project/list/list_test.go | 5 +- internal/cmd/project/member/add/add.go | 7 +- internal/cmd/project/member/list/list.go | 12 +- internal/cmd/project/member/list/list_test.go | 5 +- internal/cmd/project/member/member.go | 6 +- internal/cmd/project/member/remove/remove.go | 7 +- internal/cmd/project/project.go | 7 +- internal/cmd/project/role/list/list.go | 7 +- internal/cmd/project/role/list/list_test.go | 5 +- internal/cmd/project/role/role.go | 6 +- internal/cmd/project/update/update.go | 5 +- internal/cmd/public-ip/associate/associate.go | 5 +- .../cmd/public-ip/associate/associate_test.go | 5 +- internal/cmd/public-ip/create/create.go | 5 +- internal/cmd/public-ip/create/create_test.go | 5 +- internal/cmd/public-ip/delete/delete.go | 5 +- internal/cmd/public-ip/describe/describe.go | 5 +- .../cmd/public-ip/describe/describe_test.go | 5 +- .../public-ip/disassociate/disassociate.go | 5 +- .../disassociate/disassociate_test.go | 5 +- internal/cmd/public-ip/list/list.go | 5 +- internal/cmd/public-ip/list/list_test.go | 5 +- internal/cmd/public-ip/public-ip.go | 6 +- internal/cmd/public-ip/ranges/list/list.go | 5 +- .../cmd/public-ip/ranges/list/list_test.go | 5 +- internal/cmd/public-ip/ranges/ranges.go | 6 +- internal/cmd/public-ip/update/update.go | 8 +- internal/cmd/public-ip/update/update_test.go | 5 +- internal/cmd/quota/list/list.go | 5 +- internal/cmd/quota/list/list_test.go | 5 +- internal/cmd/quota/quota.go | 6 +- .../cmd/rabbitmq/credentials/create/create.go | 5 +- .../credentials/create/create_test.go | 5 +- .../cmd/rabbitmq/credentials/credentials.go | 6 +- .../cmd/rabbitmq/credentials/delete/delete.go | 5 +- .../rabbitmq/credentials/describe/describe.go | 5 +- .../credentials/describe/describe_test.go | 5 +- .../cmd/rabbitmq/credentials/list/list.go | 5 +- .../rabbitmq/credentials/list/list_test.go | 5 +- .../cmd/rabbitmq/instance/create/create.go | 5 +- .../rabbitmq/instance/create/create_test.go | 5 +- .../cmd/rabbitmq/instance/delete/delete.go | 5 +- .../rabbitmq/instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- internal/cmd/rabbitmq/instance/instance.go | 6 +- internal/cmd/rabbitmq/instance/list/list.go | 5 +- .../cmd/rabbitmq/instance/list/list_test.go | 5 +- .../cmd/rabbitmq/instance/update/update.go | 5 +- .../rabbitmq/instance/update/update_test.go | 5 +- internal/cmd/rabbitmq/plans/plans.go | 5 +- internal/cmd/rabbitmq/plans/plans_test.go | 5 +- internal/cmd/rabbitmq/rabbitmq.go | 6 +- .../cmd/redis/credentials/create/create.go | 5 +- .../redis/credentials/create/create_test.go | 5 +- internal/cmd/redis/credentials/credentials.go | 6 +- .../cmd/redis/credentials/delete/delete.go | 5 +- .../redis/credentials/describe/describe.go | 5 +- .../credentials/describe/describe_test.go | 5 +- internal/cmd/redis/credentials/list/list.go | 5 +- .../cmd/redis/credentials/list/list_test.go | 5 +- internal/cmd/redis/instance/create/create.go | 5 +- .../cmd/redis/instance/create/create_test.go | 5 +- internal/cmd/redis/instance/delete/delete.go | 5 +- .../cmd/redis/instance/describe/describe.go | 5 +- .../redis/instance/describe/describe_test.go | 5 +- internal/cmd/redis/instance/instance.go | 6 +- internal/cmd/redis/instance/list/list.go | 5 +- internal/cmd/redis/instance/list/list_test.go | 5 +- internal/cmd/redis/instance/update/update.go | 5 +- .../cmd/redis/instance/update/update_test.go | 5 +- internal/cmd/redis/plans/plans.go | 5 +- internal/cmd/redis/plans/plans_test.go | 5 +- internal/cmd/redis/redis.go | 6 +- internal/cmd/root.go | 7 +- .../secrets-manager/instance/create/create.go | 5 +- .../instance/create/create_test.go | 5 +- .../secrets-manager/instance/delete/delete.go | 5 +- .../instance/describe/describe.go | 5 +- .../instance/describe/describe_test.go | 5 +- .../cmd/secrets-manager/instance/instance.go | 6 +- .../cmd/secrets-manager/instance/list/list.go | 5 +- .../instance/list/list_test.go | 5 +- .../secrets-manager/instance/update/update.go | 5 +- .../instance/update/update_test.go | 5 +- .../cmd/secrets-manager/secrets_manager.go | 6 +- .../cmd/secrets-manager/user/create/create.go | 5 +- .../user/create/create_test.go | 5 +- .../cmd/secrets-manager/user/delete/delete.go | 5 +- .../secrets-manager/user/describe/describe.go | 5 +- .../user/describe/describe_test.go | 5 +- .../cmd/secrets-manager/user/list/list.go | 5 +- .../secrets-manager/user/list/list_test.go | 5 +- .../cmd/secrets-manager/user/update/update.go | 5 +- .../user/update/update_test.go | 5 +- internal/cmd/secrets-manager/user/user.go | 6 +- internal/cmd/security-group/create/create.go | 5 +- .../cmd/security-group/create/create_test.go | 5 +- internal/cmd/security-group/delete/delete.go | 5 +- .../cmd/security-group/delete/delete_test.go | 5 +- .../cmd/security-group/describe/describe.go | 5 +- .../security-group/describe/describe_test.go | 7 +- internal/cmd/security-group/list/list.go | 5 +- internal/cmd/security-group/list/list_test.go | 5 +- .../cmd/security-group/rule/create/create.go | 5 +- .../security-group/rule/create/create_test.go | 5 +- .../cmd/security-group/rule/delete/delete.go | 5 +- .../security-group/rule/delete/delete_test.go | 5 +- .../security-group/rule/describe/describe.go | 5 +- .../rule/describe/describe_test.go | 5 +- internal/cmd/security-group/rule/list/list.go | 5 +- .../cmd/security-group/rule/list/list_test.go | 5 +- .../rule/security_group_rule.go | 6 +- internal/cmd/security-group/security_group.go | 6 +- internal/cmd/security-group/update/update.go | 5 +- .../cmd/security-group/update/update_test.go | 5 +- internal/cmd/server/backup/backup.go | 6 +- internal/cmd/server/backup/create/create.go | 5 +- .../cmd/server/backup/create/create_test.go | 5 +- internal/cmd/server/backup/delete/delete.go | 5 +- .../cmd/server/backup/describe/describe.go | 5 +- .../server/backup/describe/describe_test.go | 5 +- internal/cmd/server/backup/disable/disable.go | 5 +- internal/cmd/server/backup/enable/enable.go | 5 +- internal/cmd/server/backup/list/list.go | 5 +- internal/cmd/server/backup/list/list_test.go | 5 +- internal/cmd/server/backup/restore/restore.go | 5 +- .../server/backup/schedule/create/create.go | 5 +- .../backup/schedule/create/create_test.go | 5 +- .../server/backup/schedule/delete/delete.go | 5 +- .../backup/schedule/describe/describe.go | 5 +- .../backup/schedule/describe/describe_test.go | 5 +- .../cmd/server/backup/schedule/list/list.go | 5 +- .../server/backup/schedule/list/list_test.go | 5 +- .../cmd/server/backup/schedule/schedule.go | 6 +- .../server/backup/schedule/update/update.go | 5 +- .../backup/schedule/update/update_test.go | 7 +- .../backup/volume-backup/delete/delete.go | 5 +- .../backup/volume-backup/restore/restore.go | 5 +- .../backup/volume-backup/volumebackup.go | 6 +- internal/cmd/server/command/command.go | 6 +- internal/cmd/server/command/create/create.go | 5 +- .../cmd/server/command/create/create_test.go | 5 +- .../cmd/server/command/describe/describe.go | 5 +- .../server/command/describe/describe_test.go | 5 +- internal/cmd/server/command/list/list.go | 5 +- internal/cmd/server/command/list/list_test.go | 5 +- .../command/template/describe/describe.go | 5 +- .../template/describe/describe_test.go | 5 +- .../cmd/server/command/template/list/list.go | 5 +- .../server/command/template/list/list_test.go | 5 +- .../cmd/server/command/template/template.go | 6 +- internal/cmd/server/console/console.go | 5 +- internal/cmd/server/console/console_test.go | 5 +- internal/cmd/server/create/create.go | 5 +- internal/cmd/server/create/create_test.go | 5 +- internal/cmd/server/deallocate/deallocate.go | 5 +- internal/cmd/server/delete/delete.go | 5 +- internal/cmd/server/describe/describe.go | 5 +- internal/cmd/server/describe/describe_test.go | 5 +- internal/cmd/server/list/list.go | 5 +- internal/cmd/server/list/list_test.go | 5 +- internal/cmd/server/log/log.go | 5 +- internal/cmd/server/log/log_test.go | 5 +- .../server/machine-type/describe/describe.go | 5 +- .../machine-type/describe/describe_test.go | 5 +- internal/cmd/server/machine-type/list/list.go | 5 +- .../cmd/server/machine-type/list/list_test.go | 5 +- .../cmd/server/machine-type/machine-type.go | 6 +- .../server/network-interface/attach/attach.go | 8 +- .../server/network-interface/detach/detach.go | 8 +- .../cmd/server/network-interface/list/list.go | 5 +- .../network-interface/list/list_test.go | 5 +- .../network-interface/network-interface.go | 6 +- .../cmd/server/os-update/create/create.go | 5 +- .../server/os-update/create/create_test.go | 5 +- .../cmd/server/os-update/describe/describe.go | 5 +- .../os-update/describe/describe_test.go | 5 +- .../cmd/server/os-update/disable/disable.go | 5 +- .../cmd/server/os-update/enable/enable.go | 5 +- internal/cmd/server/os-update/list/list.go | 5 +- .../cmd/server/os-update/list/list_test.go | 5 +- internal/cmd/server/os-update/os-update.go | 6 +- .../os-update/schedule/create/create.go | 5 +- .../os-update/schedule/create/create_test.go | 5 +- .../os-update/schedule/delete/delete.go | 5 +- .../os-update/schedule/describe/describe.go | 5 +- .../schedule/describe/describe_test.go | 5 +- .../server/os-update/schedule/list/list.go | 5 +- .../os-update/schedule/list/list_test.go | 5 +- .../cmd/server/os-update/schedule/schedule.go | 6 +- .../os-update/schedule/update/update.go | 5 +- .../os-update/schedule/update/update_test.go | 7 +- .../cmd/server/public-ip/attach/attach.go | 5 +- .../server/public-ip/attach/attach_test.go | 5 +- .../cmd/server/public-ip/detach/detach.go | 5 +- .../server/public-ip/detach/detach_test.go | 5 +- internal/cmd/server/public-ip/public_ip.go | 6 +- internal/cmd/server/reboot/reboot.go | 5 +- internal/cmd/server/rescue/rescue.go | 5 +- internal/cmd/server/resize/resize.go | 5 +- internal/cmd/server/server.go | 6 +- .../server/service-account/attach/attach.go | 5 +- .../service-account/attach/attach_test.go | 7 +- .../server/service-account/detach/detach.go | 5 +- .../service-account/detach/detach_test.go | 7 +- .../cmd/server/service-account/list/list.go | 5 +- .../server/service-account/list/list_test.go | 5 +- .../server/service-account/service-account.go | 6 +- internal/cmd/server/start/start.go | 5 +- internal/cmd/server/stop/stop.go | 5 +- internal/cmd/server/unrescue/unrescue.go | 5 +- internal/cmd/server/update/update.go | 5 +- internal/cmd/server/update/update_test.go | 7 +- internal/cmd/server/volume/attach/attach.go | 5 +- .../cmd/server/volume/attach/attach_test.go | 7 +- .../cmd/server/volume/describe/describe.go | 5 +- .../server/volume/describe/describe_test.go | 7 +- internal/cmd/server/volume/detach/detach.go | 5 +- .../cmd/server/volume/detach/detach_test.go | 5 +- internal/cmd/server/volume/list/list.go | 5 +- internal/cmd/server/volume/list/list_test.go | 5 +- internal/cmd/server/volume/update/update.go | 5 +- .../cmd/server/volume/update/update_test.go | 7 +- internal/cmd/server/volume/volume.go | 6 +- internal/cmd/service-account/create/create.go | 5 +- .../cmd/service-account/create/create_test.go | 5 +- internal/cmd/service-account/delete/delete.go | 5 +- .../cmd/service-account/get-jwks/get_jwks.go | 5 +- .../service-account/get-jwks/get_jwks_test.go | 7 +- .../cmd/service-account/key/create/create.go | 5 +- .../cmd/service-account/key/delete/delete.go | 5 +- .../service-account/key/describe/describe.go | 5 +- .../key/describe/describe_test.go | 5 +- internal/cmd/service-account/key/key.go | 6 +- internal/cmd/service-account/key/list/list.go | 5 +- .../cmd/service-account/key/list/list_test.go | 5 +- .../cmd/service-account/key/update/update.go | 5 +- internal/cmd/service-account/list/list.go | 5 +- .../cmd/service-account/list/list_test.go | 5 +- .../cmd/service-account/service_account.go | 6 +- .../service-account/token/create/create.go | 5 +- .../token/create/create_test.go | 5 +- .../cmd/service-account/token/list/list.go | 5 +- .../service-account/token/list/list_test.go | 5 +- .../service-account/token/revoke/revoke.go | 5 +- internal/cmd/service-account/token/token.go | 6 +- internal/cmd/ske/cluster/cluster.go | 6 +- internal/cmd/ske/cluster/create/create.go | 5 +- .../cmd/ske/cluster/create/create_test.go | 5 +- internal/cmd/ske/cluster/delete/delete.go | 5 +- internal/cmd/ske/cluster/describe/describe.go | 5 +- .../cmd/ske/cluster/describe/describe_test.go | 5 +- .../generate-payload/generate_payload.go | 5 +- .../generate-payload/generate_payload_test.go | 5 +- .../cmd/ske/cluster/hibernate/hibernate.go | 5 +- internal/cmd/ske/cluster/list/list.go | 5 +- internal/cmd/ske/cluster/list/list_test.go | 5 +- .../ske/cluster/maintenance/maintenance.go | 5 +- .../cmd/ske/cluster/reconcile/reconcile.go | 5 +- internal/cmd/ske/cluster/update/update.go | 5 +- .../cmd/ske/cluster/update/update_test.go | 5 +- internal/cmd/ske/cluster/wakeup/wakeup.go | 5 +- .../complete-rotation/complete_rotation.go | 5 +- internal/cmd/ske/credentials/credentials.go | 6 +- .../start-rotation/start_rotation.go | 5 +- internal/cmd/ske/describe/describe.go | 5 +- internal/cmd/ske/describe/describe_test.go | 5 +- internal/cmd/ske/disable/disable.go | 5 +- internal/cmd/ske/enable/enable.go | 5 +- internal/cmd/ske/kubeconfig/create/create.go | 5 +- .../cmd/ske/kubeconfig/create/create_test.go | 5 +- internal/cmd/ske/kubeconfig/kubeconfig.go | 6 +- internal/cmd/ske/kubeconfig/login/login.go | 5 +- internal/cmd/ske/options/options.go | 17 +- internal/cmd/ske/options/options_test.go | 7 +- internal/cmd/ske/ske.go | 6 +- internal/cmd/volume/backup/backup.go | 6 +- internal/cmd/volume/backup/create/create.go | 11 +- .../cmd/volume/backup/create/create_test.go | 5 +- internal/cmd/volume/backup/delete/delete.go | 5 +- .../cmd/volume/backup/describe/describe.go | 5 +- .../volume/backup/describe/describe_test.go | 5 +- internal/cmd/volume/backup/list/list.go | 5 +- internal/cmd/volume/backup/list/list_test.go | 5 +- internal/cmd/volume/backup/restore/restore.go | 5 +- internal/cmd/volume/backup/update/update.go | 5 +- internal/cmd/volume/create/create.go | 5 +- internal/cmd/volume/create/create_test.go | 5 +- internal/cmd/volume/delete/delete.go | 5 +- internal/cmd/volume/describe/describe.go | 5 +- internal/cmd/volume/describe/describe_test.go | 5 +- internal/cmd/volume/list/list.go | 5 +- internal/cmd/volume/list/list_test.go | 5 +- .../performance-class/describe/describe.go | 5 +- .../describe/describe_test.go | 5 +- .../cmd/volume/performance-class/list/list.go | 5 +- .../performance-class/list/list_test.go | 5 +- .../performance-class/performance_class.go | 6 +- internal/cmd/volume/resize/resize.go | 5 +- internal/cmd/volume/resize/resize_test.go | 5 +- internal/cmd/volume/snapshot/create/create.go | 5 +- internal/cmd/volume/snapshot/delete/delete.go | 5 +- .../cmd/volume/snapshot/describe/describe.go | 5 +- .../volume/snapshot/describe/describe_test.go | 5 +- internal/cmd/volume/snapshot/list/list.go | 5 +- .../cmd/volume/snapshot/list/list_test.go | 5 +- internal/cmd/volume/snapshot/snapshot.go | 6 +- internal/cmd/volume/snapshot/update/update.go | 5 +- internal/cmd/volume/update/update.go | 5 +- internal/cmd/volume/update/update_test.go | 7 +- internal/cmd/volume/volume.go | 6 +- internal/pkg/projectname/project_name.go | 12 +- internal/pkg/testutils/testutils.go | 9 +- .../{cmd/params => pkg/types}/cmd_params.go | 2 +- 822 files changed, 2869 insertions(+), 2158 deletions(-) rename internal/{cmd/params => pkg/types}/cmd_params.go (90%) diff --git a/.github/docs/contribution-guide/cmd.go b/.github/docs/contribution-guide/cmd.go index 1373ebbb0..d9184fb00 100644 --- a/.github/docs/contribution-guide/cmd.go +++ b/.github/docs/contribution-guide/cmd.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { } // "bar" command constructor -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "bar", Short: "Short description of the command (is shown in the help of parent command)", diff --git a/go.mod b/go.mod index dc4c28008..bae42f51f 100644 --- a/go.mod +++ b/go.mod @@ -53,40 +53,53 @@ require ( 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect 4d63.com/gochecknoglobals v0.2.2 // indirect al.essio.dev/pkg/shellescape v1.5.1 // indirect - github.com/4meepo/tagalign v1.4.2 // indirect - github.com/Abirdcfly/dupword v0.1.3 // indirect - github.com/Antonboom/errname v1.1.0 // indirect - github.com/Antonboom/nilnil v1.1.0 // indirect - github.com/Antonboom/testifylint v1.6.1 // indirect + codeberg.org/chavacava/garif v0.2.0 // indirect + dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect + dev.gaijin.team/go/golib v0.6.0 // indirect + github.com/4meepo/tagalign v1.4.3 // indirect + github.com/Abirdcfly/dupword v0.1.7 // indirect + github.com/AdminBenni/iota-mixing v1.0.0 // indirect + github.com/AlwxSin/noinlineerr v1.0.5 // indirect + github.com/Antonboom/errname v1.1.1 // indirect + github.com/Antonboom/nilnil v1.1.1 // indirect + github.com/Antonboom/testifylint v1.6.4 // indirect github.com/BurntSushi/toml v1.5.0 // indirect - github.com/Crocmagnon/fatcontext v0.7.1 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect - github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Djarvur/go-err113 v0.1.1 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/MirrexOne/unqueryvet v1.2.1 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect + github.com/alecthomas/chroma/v2 v2.20.0 // indirect github.com/alecthomas/go-check-sumtype v0.3.1 // indirect - github.com/alexkohler/nakedret/v2 v2.0.5 // indirect + github.com/alexkohler/nakedret/v2 v2.0.6 // indirect github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alfatraining/structtag v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect github.com/alingse/nilnesserr v0.2.0 // indirect - github.com/ashanbrown/forbidigo v1.6.0 // indirect - github.com/ashanbrown/makezero v1.2.0 // indirect + github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect + github.com/ashanbrown/makezero/v2 v2.1.0 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bkielbasa/cyclop v1.2.3 // indirect github.com/blizzy78/varnamelen v0.8.0 // indirect github.com/bombsimon/wsl/v4 v4.7.0 // indirect + github.com/bombsimon/wsl/v5 v5.3.0 // indirect github.com/breml/bidichk v0.3.3 // indirect github.com/breml/errchkjson v0.4.1 // indirect github.com/butuzov/ireturn v0.4.0 // indirect github.com/butuzov/mirror v1.3.0 // indirect - github.com/catenacyber/perfsprint v0.9.1 // indirect - github.com/ccojocar/zxcvbn-go v1.0.2 // indirect + github.com/catenacyber/perfsprint v0.10.0 // indirect + github.com/ccojocar/zxcvbn-go v1.0.4 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.1.0 // indirect + github.com/charithe/durationcheck v0.0.11 // indirect + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect + github.com/charmbracelet/lipgloss v1.1.0 // indirect + github.com/charmbracelet/x/ansi v0.8.0 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/ckaznocha/intrange v0.3.1 // indirect github.com/curioswitch/go-reassign v0.3.0 // indirect - github.com/daixiang0/gci v0.13.6 // indirect + github.com/daixiang0/gci v0.13.7 // indirect + github.com/dave/dst v0.27.3 // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect github.com/ettle/strcase v0.2.0 // indirect @@ -94,8 +107,8 @@ require ( github.com/firefart/nonamedreturns v1.0.6 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghostiam/protogetter v0.3.15 // indirect - github.com/go-critic/go-critic v0.13.0 // indirect + github.com/ghostiam/protogetter v0.3.17 // indirect + github.com/go-critic/go-critic v0.14.2 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.2.0 // indirect @@ -106,64 +119,71 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.12.1 // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/godoc-lint/godoc-lint v0.10.1 // indirect + github.com/gofrs/flock v0.13.0 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect - github.com/golangci/go-printf-func-name v0.1.0 // indirect + github.com/golangci/go-printf-func-name v0.1.1 // indirect github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect - github.com/golangci/golangci-lint v1.64.8 // indirect - github.com/golangci/misspell v0.6.0 // indirect - github.com/golangci/plugin-module-register v0.1.1 // indirect + github.com/golangci/golangci-lint/v2 v2.6.2 // indirect + github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect + github.com/golangci/misspell v0.7.0 // indirect + github.com/golangci/plugin-module-register v0.1.2 // indirect github.com/golangci/revgrep v0.8.0 // indirect - github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect - github.com/gordonklaus/ineffassign v0.1.0 // indirect + github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect + github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect + github.com/gordonklaus/ineffassign v0.2.0 // indirect github.com/gostaticanalysis/analysisutil v0.7.1 // indirect github.com/gostaticanalysis/comment v1.5.0 // indirect github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/gostaticanalysis/nilerr v0.1.2 // indirect github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/jgautheron/goconst v1.7.1 // indirect + github.com/jgautheron/goconst v1.8.2 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jjti/go-spancheck v0.6.4 // indirect + github.com/jjti/go-spancheck v0.6.5 // indirect github.com/julz/importas v0.2.0 // indirect - github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect + github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect github.com/kisielk/errcheck v1.9.0 // indirect github.com/kkHAIKE/contextcheck v1.1.6 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.14 // indirect + github.com/kulti/thelper v0.7.1 // indirect + github.com/kunwardeep/paralleltest v1.0.15 // indirect github.com/lasiar/canonicalheader v1.1.2 // indirect - github.com/ldez/exptostd v0.4.3 // indirect - github.com/ldez/gomoddirectives v0.6.1 // indirect - github.com/ldez/grignotin v0.9.0 // indirect - github.com/ldez/tagliatelle v0.7.1 // indirect - github.com/ldez/usetesting v0.4.3 // indirect + github.com/ldez/exptostd v0.4.5 // indirect + github.com/ldez/gomoddirectives v0.7.1 // indirect + github.com/ldez/grignotin v0.10.1 // indirect + github.com/ldez/tagliatelle v0.7.2 // indirect + github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/macabu/inamedparam v0.2.0 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect + github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect + github.com/manuelarte/funcorder v0.5.0 // indirect + github.com/maratori/testableexamples v1.0.1 // indirect + github.com/maratori/testpackage v1.1.2 // indirect github.com/matoous/godox v1.1.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mgechev/revive v1.9.0 // indirect + github.com/mgechev/revive v1.12.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moricho/tparallel v0.3.2 // indirect + github.com/muesli/termenv v0.16.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.19.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/nunnatsa/ginkgolinter v0.21.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polyfloyd/go-errorlint v1.8.0 // indirect github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/procfs v0.7.3 // indirect - github.com/quasilyte/go-ruleguard v0.4.4 // indirect - github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect + github.com/quasilyte/go-ruleguard v0.4.5 // indirect + github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect @@ -172,21 +192,19 @@ require ( github.com/ryancurrah/gomodguard v1.4.1 // indirect github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect - github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.28.0 // indirect - github.com/securego/gosec/v2 v2.22.3 // indirect + github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect + github.com/securego/gosec/v2 v2.22.10 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/tenv v1.12.1 // indirect - github.com/sonatard/noctx v0.1.0 // indirect + github.com/sonatard/noctx v0.4.0 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.11.1 // indirect - github.com/tdakkota/asciicheck v0.4.1 // indirect - github.com/tetafro/godot v1.5.1 // indirect + github.com/tetafro/godot v1.5.4 // indirect github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect github.com/timonwong/loggercheck v0.11.0 // indirect github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect @@ -194,31 +212,31 @@ require ( github.com/ultraware/funlen v0.2.0 // indirect github.com/ultraware/whitespace v0.2.0 // indirect github.com/uudashr/gocognit v1.2.0 // indirect - github.com/uudashr/iface v1.3.1 // indirect + github.com/uudashr/iface v1.4.1 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xen0n/gosmopolitan v1.3.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect github.com/yagipy/maintidx v1.0.0 // indirect github.com/yeya24/promlinter v0.3.0 // indirect github.com/ykadowak/zerologlint v0.1.5 // indirect gitlab.com/bosi/decorder v0.4.2 // indirect - go-simpler.org/musttag v0.13.1 // indirect - go-simpler.org/sloglint v0.11.0 // indirect - go.uber.org/atomic v1.9.0 // indirect + go-simpler.org/musttag v0.14.0 // indirect + go-simpler.org/sloglint v0.11.1 // indirect + go.augendre.info/arangolint v0.3.1 // indirect + go.augendre.info/fatcontext v0.9.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect + go.uber.org/multierr v1.10.0 // indirect + go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac // indirect + golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 // indirect golang.org/x/sync v0.18.0 // indirect golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect golang.org/x/tools v0.39.0 // indirect - golang.org/x/tools/go/expect v0.1.1-deprecated // indirect - golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated // indirect - google.golang.org/protobuf v1.36.6 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect honnef.co/go/tools v0.6.1 // indirect - mvdan.cc/gofumpt v0.8.0 // indirect - mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect + mvdan.cc/gofumpt v0.9.2 // indirect + mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect ) @@ -228,7 +246,7 @@ require ( github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -252,7 +270,6 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2 github.com/subosito/gotenv v1.6.0 // indirect - go.uber.org/multierr v1.11.0 // indirect golang.org/x/sys v0.38.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.2 // indirect @@ -263,6 +280,6 @@ require ( ) tool ( - github.com/golangci/golangci-lint/cmd/golangci-lint + github.com/golangci/golangci-lint/v2/cmd/golangci-lint golang.org/x/tools/cmd/goimports ) diff --git a/go.sum b/go.sum index 8d09c805b..a4e5c9be6 100644 --- a/go.sum +++ b/go.sum @@ -36,56 +36,68 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY= +codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ= +dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= +dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= +dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo= +dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E= -github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI= -github.com/Abirdcfly/dupword v0.1.3 h1:9Pa1NuAsZvpFPi9Pqkd93I7LIYRURj+A//dFd5tgBeE= -github.com/Abirdcfly/dupword v0.1.3/go.mod h1:8VbB2t7e10KRNdwTVoxdBaxla6avbhGzb8sCTygUMhw= -github.com/Antonboom/errname v1.1.0 h1:A+ucvdpMwlo/myWrkHEUEBWc/xuXdud23S8tmTb/oAE= -github.com/Antonboom/errname v1.1.0/go.mod h1:O1NMrzgUcVBGIfi3xlVuvX8Q/VP/73sseCaAppfjqZw= -github.com/Antonboom/nilnil v1.1.0 h1:jGxJxjgYS3VUUtOTNk8Z1icwT5ESpLH/426fjmQG+ng= -github.com/Antonboom/nilnil v1.1.0/go.mod h1:b7sAlogQjFa1wV8jUW3o4PMzDVFLbTux+xnQdvzdcIE= -github.com/Antonboom/testifylint v1.6.1 h1:6ZSytkFWatT8mwZlmRCHkWz1gPi+q6UBSbieji2Gj/o= -github.com/Antonboom/testifylint v1.6.1/go.mod h1:k+nEkathI2NFjKO6HvwmSrbzUcQ6FAnbZV+ZRrnXPLI= +github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8= +github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c= +github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ= +github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4= +github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo= +github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY= +github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY= +github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= +github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q= +github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ= +github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ= +github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II= +github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ= +github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Crocmagnon/fatcontext v0.7.1 h1:SC/VIbRRZQeQWj/TcQBS6JmrXcfA+BU4OGSVUt54PjM= -github.com/Crocmagnon/fatcontext v0.7.1/go.mod h1:1wMvv3NXEBJucFGfwOJBxSVWcoIO6emV215SMkW9MFU= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 h1:Sz1JIXEcSfhz7fUi7xHnhpIE0thVASYjvosApmHuD2k= -github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1/go.mod h1:n/LSCXNuIYqVfBlVXyHfMQkZDdp1/mmxfSjADd3z1Zg= -github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= -github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g= +github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/MirrexOne/unqueryvet v1.2.1 h1:M+zdXMq84g+E1YOLa7g7ExN3dWfZQrdDSTCM7gC+m/A= +github.com/MirrexOne/unqueryvet v1.2.1/go.mod h1:IWwCwMQlSWjAIteW0t+28Q5vouyktfujzYznSIWiuOg= github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.20.0 h1:sfIHpxPyR07/Oylvmcai3X/exDlE8+FA820NTz+9sGw= +github.com/alecthomas/chroma/v2 v2.20.0/go.mod h1:e7tViK0xh/Nf4BYHl00ycY6rV7b8iXBksI9E359yNmA= github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= -github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= -github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/repr v0.5.1 h1:E3G4t2QbHTSNpPKBgMTln5KLkZHLOcU7r37J4pXBuIg= +github.com/alecthomas/repr v0.5.1/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexkohler/nakedret/v2 v2.0.5 h1:fP5qLgtwbx9EJE8dGEERT02YwS8En4r9nnZ71RK+EVU= -github.com/alexkohler/nakedret/v2 v2.0.5/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= +github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= +github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc= +github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w= github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= -github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= -github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU= -github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo= +github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c= +github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE= +github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -96,6 +108,8 @@ github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= +github.com/bombsimon/wsl/v5 v5.3.0 h1:nZWREJFL6U3vgW/B1lfDOigl+tEF6qgs6dGGbFeR0UM= +github.com/bombsimon/wsl/v5 v5.3.0/go.mod h1:Gp8lD04z27wm3FANIUPZycXp+8huVsn0oxc+n4qfV9I= github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= @@ -104,19 +118,27 @@ github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70= github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= -github.com/catenacyber/perfsprint v0.9.1 h1:5LlTp4RwTooQjJCvGEFV6XksZvWE7wCOUvjD2z0vls0= -github.com/catenacyber/perfsprint v0.9.1/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM= -github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= -github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= +github.com/catenacyber/perfsprint v0.10.0 h1:AZj1mYyxbxLRqmnYOeguZXEQwWOgQGm2wzLI5d7Hl/0= +github.com/catenacyber/perfsprint v0.10.0/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc= +github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc= +github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= -github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk= +github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= +github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -128,10 +150,14 @@ github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= -github.com/daixiang0/gci v0.13.6 h1:RKuEOSkGpSadkGbvZ6hJ4ddItT3cVZ9Vn9Rybk6xjl8= -github.com/daixiang0/gci v0.13.6/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +github.com/daixiang0/gci v0.13.7 h1:+0bG5eK9vlI08J+J/NWGbWPTNiXPG4WhNLJOkSxWITQ= +github.com/daixiang0/gci v0.13.7/go.mod h1:812WVN6JLFY9S6Tv76twqmNqevN0pa3SX3nih0brVzQ= github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= +github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= +github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= 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= @@ -162,10 +188,10 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY= -github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= -github.com/go-critic/go-critic v0.13.0 h1:kJzM7wzltQasSUXtYyTl6UaPVySO6GkaR1thFnJ6afY= -github.com/go-critic/go-critic v0.13.0/go.mod h1:M/YeuJ3vOCQDnP2SU+ZhjgRzwzcBW87JqLpMJLrZDLI= +github.com/ghostiam/protogetter v0.3.17 h1:sjGPErP9o7i2Ym+z3LsQzBdLCNaqbYy2iJQPxGXg04Q= +github.com/ghostiam/protogetter v0.3.17/go.mod h1:AivIX1eKA/TcUmzZdzbl+Tb8tjIe8FcyG6JFyemQAH4= +github.com/go-critic/go-critic v0.14.2 h1:PMvP5f+LdR8p6B29npvChUXbD1vrNlKDf60NJtgMBOo= +github.com/go-critic/go-critic v0.14.2/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -175,8 +201,8 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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-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= @@ -217,8 +243,10 @@ github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= -github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/godoc-lint/godoc-lint v0.10.1 h1:ZPUVzlDtJfA+P688JfPJPkI/SuzcBr/753yGIk5bOPA= +github.com/godoc-lint/godoc-lint v0.10.1/go.mod h1:KleLcHu/CGSvkjUH2RvZyoK1MBC7pDQg4NxMYLcBBsw= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -251,24 +279,30 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0= +github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ= github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw= github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= -github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= -github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= +github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U= +github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= -github.com/golangci/golangci-lint v1.64.8 h1:y5TdeVidMtBGG32zgSC7ZXTFNHrsJkDnpO4ItB3Am+I= -github.com/golangci/golangci-lint v1.64.8/go.mod h1:5cEsUQBSr6zi8XI8OjmcY2Xmliqc4iYL7YoPrL+zLJ4= -github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= -github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= -github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= -github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= +github.com/golangci/golangci-lint/v2 v2.6.2 h1:jkMSVv36JmyTENcEertckvimvjPcD5qxNM7W7qhECvI= +github.com/golangci/golangci-lint/v2 v2.6.2/go.mod h1:fSIMDiBt9kzdpnvvV7GO6iWzyv5uaeZ+iPor+2uRczE= +github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8= +github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ= +github.com/golangci/misspell v0.7.0 h1:4GOHr/T1lTW0hhR4tgaaV1WS/lJ+ncvYCoFKmqJsj0c= +github.com/golangci/misspell v0.7.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg= +github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg= +github.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw= github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s= github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= -github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= -github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= +github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM= +github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s= +github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM= +github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= @@ -283,7 +317,6 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -297,8 +330,8 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 h1:EEHtgt9IwisQ2AZ4pIsMjahcegHh6rmhqxzIRQIyepY= +github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -306,18 +339,17 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= -github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs= +github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8= github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc= github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk= github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/nilerr v0.1.2 h1:S6nk8a9N8g062nsx63kUkF6AzbHGw7zzyHMcpu52xQU= +github.com/gostaticanalysis/nilerr v0.1.2/go.mod h1:A19UHhoY3y8ahoL7YKz6sdjDtduwTSI4CsymaC2htPA= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8= github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= @@ -341,12 +373,12 @@ github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaB github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3UzhtuiM= github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= -github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= -github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4= +github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jjti/go-spancheck v0.6.4 h1:Tl7gQpYf4/TMU7AT84MN83/6PutY21Nb9fuQjFTpRRc= -github.com/jjti/go-spancheck v0.6.4/go.mod h1:yAEYdKJ2lRkDA8g7X+oKUHXOWVAXSBJRv04OhF+QUjk= +github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= +github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -361,8 +393,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= -github.com/karamaru-alpha/copyloopvar v1.2.1 h1:wmZaZYIjnJ0b5UoKDjUHrikcV0zuPyyxI4SVplLd2CI= -github.com/karamaru-alpha/copyloopvar v1.2.1/go.mod h1:nFmMlFNlClC2BPvNaHMdkirmTJxVCY0lhxBtlfOypMM= +github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0= +github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.9.0 h1:9xt1zI9EBfcYBvdU1nVrzMzzUPUtPKs9bVSIM3TAb3M= github.com/kisielk/errcheck v1.9.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= @@ -379,34 +411,40 @@ 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/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.14 h1:wAkMoMeGX/kGfhQBPODT/BL8XhK23ol/nuQ3SwFaUw8= -github.com/kunwardeep/paralleltest v1.0.14/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= +github.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98= +github.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs= +github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w= +github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= -github.com/ldez/exptostd v0.4.3 h1:Ag1aGiq2epGePuRJhez2mzOpZ8sI9Gimcb4Sb3+pk9Y= -github.com/ldez/exptostd v0.4.3/go.mod h1:iZBRYaUmcW5jwCR3KROEZ1KivQQp6PHXbDPk9hqJKCQ= -github.com/ldez/gomoddirectives v0.6.1 h1:Z+PxGAY+217f/bSGjNZr/b2KTXcyYLgiWI6geMBN2Qc= -github.com/ldez/gomoddirectives v0.6.1/go.mod h1:cVBiu3AHR9V31em9u2kwfMKD43ayN5/XDgr+cdaFaKs= -github.com/ldez/grignotin v0.9.0 h1:MgOEmjZIVNn6p5wPaGp/0OKWyvq42KnzAt/DAb8O4Ow= -github.com/ldez/grignotin v0.9.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk= -github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk= -github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I= -github.com/ldez/usetesting v0.4.3 h1:pJpN0x3fMupdTf/IapYjnkhiY1nSTN+pox1/GyBRw3k= -github.com/ldez/usetesting v0.4.3/go.mod h1:eEs46T3PpQ+9RgN9VjpY6qWdiw2/QmfiDeWmdZdrjIQ= +github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= +github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= +github.com/ldez/gomoddirectives v0.7.1 h1:FaULkvUIG36hj6chpwa+FdCNGZBsD7/fO+p7CCsM6pE= +github.com/ldez/gomoddirectives v0.7.1/go.mod h1:auDNtakWJR1rC+YX7ar+HmveqXATBAyEK1KYpsIRW/8= +github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o= +github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas= +github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk= +github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI= +github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc= +github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w= github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww= +github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM= +github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8= +github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA= +github.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8= +github.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ= +github.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs= +github.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNaOynhDssITGfc= github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= @@ -415,13 +453,12 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgechev/revive v1.9.0 h1:8LaA62XIKrb8lM6VsBSQ92slt/o92z5+hTw3CmrvSrM= -github.com/mgechev/revive v1.9.0/go.mod h1:LAPq3+MgOf7GcL5PlWIkHb0PT7XH4NuC2LdWymhb9Mo= +github.com/mgechev/revive v1.12.0 h1:Q+/kkbbwerrVYPv9d9efaPGmAO/NsxwW/nE6ahpQaCU= +github.com/mgechev/revive v1.12.0/go.mod h1:VXsY2LsTigk8XU9BpZauVLjVrhICMOV3k1lpB3CXrp8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -434,6 +471,8 @@ github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFd github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -444,14 +483,12 @@ github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhK github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.19.1 h1:mjwbOlDQxZi9Cal+KfbEJTCz327OLNfwNvoZ70NJ+c4= -github.com/nunnatsa/ginkgolinter v0.19.1/go.mod h1:jkQ3naZDmxaZMXPWaS9rblH+i+GWXQCaS/JFIWcOH2s= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= -github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= -github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= -github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/nunnatsa/ginkgolinter v0.21.2 h1:khzWfm2/Br8ZemX8QM1pl72LwM+rMeW6VUbQ4rzh0Po= +github.com/nunnatsa/ginkgolinter v0.21.2/go.mod h1:GItSI5fw7mCGLPmkvGYrr1kEetZe7B593jcyOpyabsY= +github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE= +github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= @@ -494,10 +531,10 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/quasilyte/go-ruleguard v0.4.4 h1:53DncefIeLX3qEpjzlS1lyUmQoUEeOWPFWqaTJq9eAQ= -github.com/quasilyte/go-ruleguard v0.4.4/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= -github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= -github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= +github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= +github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY= +github.com/quasilyte/go-ruleguard/dsl v0.3.23/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= @@ -522,14 +559,16 @@ github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDc github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.28.0 h1:jZnudE2zKCtYlGzLVreNp5pmCdOxXUzwsMDBkR21cyQ= -github.com/sashamelentyev/usestdlibvars v1.28.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= -github.com/securego/gosec/v2 v2.22.3 h1:mRrCNmRF2NgZp4RJ8oJ6yPJ7G4x6OCiAXHd8x4trLRc= -github.com/securego/gosec/v2 v2.22.3/go.mod h1:42M9Xs0v1WseinaB/BmNGO8AVqG8vRfhC2686ACY48k= +github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= +github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= +github.com/securego/gosec/v2 v2.22.10 h1:ntbBqdWXnu46DUOXn+R2SvPo3PiJCDugTCgTW2g4tQg= +github.com/securego/gosec/v2 v2.22.10/go.mod h1:9UNjK3tLpv/w2b0+7r82byV43wCJDNtEDQMeS+H/g2w= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -539,10 +578,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/tenv v1.12.1 h1:+E0QzjktdnExv/wwsnnyk4oqZBUfuh89YMQT1cyuvSY= -github.com/sivchari/tenv v1.12.1/go.mod h1:1LjSOUCc25snIr5n3DtGGrENhX3LuWefcplwVGC24mw= -github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM= -github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c= +github.com/sonatard/noctx v0.4.0 h1:7MC/5Gg4SQ4lhLYR6mvOP6mQVSxCrdyiExo7atBs27o= +github.com/sonatard/noctx v0.4.0/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= @@ -619,30 +656,22 @@ github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8B github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/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.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -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.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8= -github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8= github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.5.1 h1:PZnjCol4+FqaEzvZg5+O8IY2P3hfY9JzRBNPv1pEDS4= -github.com/tetafro/godot v1.5.1/go.mod h1:cCdPtEndkmqqrhiCfkmxDodMQJ/f3L1BCNskCUZdTwk= +github.com/tetafro/godot v1.5.4 h1:u1ww+gqpRLiIA16yF2PV1CV1n/X3zhyezbNXC3E14Sg= +github.com/tetafro/godot v1.5.4/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU= github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk= github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= @@ -657,12 +686,14 @@ github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSW github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA= github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU= -github.com/uudashr/iface v1.3.1 h1:bA51vmVx1UIhiIsQFSNq6GZ6VPTk3WNMZgRiCe9R29U= -github.com/uudashr/iface v1.3.1/go.mod h1:4QvspiRd3JLPAEXBQ9AiZpLbJlrWWgRChOKDJEuQTdg= +github.com/uudashr/iface v1.4.1 h1:J16Xl1wyNX9ofhpHmQ9h9gk5rnv2A6lX/2+APLTo0zU= +github.com/uudashr/iface v1.4.1/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= 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/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM= github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= @@ -682,25 +713,27 @@ gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= -go-simpler.org/musttag v0.13.1 h1:lw2sJyu7S1X8lc8zWUAdH42y+afdcCnHhWpnkWvd6vU= -go-simpler.org/musttag v0.13.1/go.mod h1:8r450ehpMLQgvpb6sg+hV5Ur47eH6olp/3yEanfG97k= -go-simpler.org/sloglint v0.11.0 h1:JlR1X4jkbeaffiyjLtymeqmGDKBDO1ikC6rjiuFAOco= -go-simpler.org/sloglint v0.11.0/go.mod h1:CFDO8R1i77dlciGfPEPvYke2ZMx4eyGiEIWkyeW2Pvw= +go-simpler.org/musttag v0.14.0 h1:XGySZATqQYSEV3/YTy+iX+aofbZZllJaqwFWs+RTtSo= +go-simpler.org/musttag v0.14.0/go.mod h1:uP8EymctQjJ4Z1kUnjX0u2l60WfUdQxCwSNKzE1JEOE= +go-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s= +go-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ= +go.augendre.info/arangolint v0.3.1 h1:n2E6p8f+zfXSFLa2e2WqFPp4bfvcuRdd50y6cT65pSo= +go.augendre.info/arangolint v0.3.1/go.mod h1:6ZKzEzIZuBQwoSvlKT+qpUfIbBfFCE5gbAoTg0/117g= +go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE= +go.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= 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.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.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/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= @@ -728,8 +761,8 @@ golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWB golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac h1:TSSpLIG4v+p0rPv1pNOQtl1I8knsO4S9trOxNMOLVP4= -golang.org/x/exp/typeparams v0.0.0-20250210185358-939b2ce775ac/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 h1:HDjDiATsGqvuqvkDvgJjD1IgPrVekcSXVVE21JwvzGE= +golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -754,9 +787,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= @@ -795,9 +826,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= @@ -873,7 +902,6 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -885,9 +913,7 @@ golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 h1:E2/AqCUMZGgd73TQkxU golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= @@ -900,9 +926,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= @@ -944,7 +968,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -955,19 +978,14 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= @@ -1055,8 +1073,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1073,7 +1091,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -1099,10 +1116,10 @@ k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOP 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= -mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k= -mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg= -mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8= -mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5ginj6dA2oLE7YNlta9qhBNNdCaLE= +mvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4= +mvdan.cc/gofumpt v0.9.2/go.mod h1:iB7Hn+ai8lPvofHd9ZFGVg2GOr8sBUw1QUWjNbmIL/s= +mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI= +mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/golang-ci.yaml b/golang-ci.yaml index 611e2e172..0a367d55a 100644 --- a/golang-ci.yaml +++ b/golang-ci.yaml @@ -1,95 +1,83 @@ -# This file contains all available configuration options -# with their default values. - -# options for analysis running +version: "2" run: - # default concurrency is a available CPU number concurrency: 4 - - # timeout for analysis, e.g. 30s, 5m, default is 1m - timeout: 10m -linters-settings: - goimports: - # put imports beginning with prefix after 3rd-party packages; - # it's a comma-separated list of prefixes - local-prefixes: github.com/freiheit-com/nmww - depguard: - rules: - main: - list-mode: lax # Everything is allowed unless it is denied - deny: - - pkg: "github.com/stretchr/testify" - desc: Do not use a testing framework - misspell: - # Correct spellings using locale preferences for US or UK. - # Default is to use a neutral variety of English. - # Setting locale to US will correct the British spelling of 'colour' to 'color'. - locale: US - golint: - min-confidence: 0.8 - gosec: - excludes: - # Suppressions: (see https://github.com/securego/gosec#available-rules for details) - - G104 # "Audit errors not checked" -> which we don't need and is a badly implemented version of errcheck - - G102 # "Bind to all interfaces" -> since this is normal in k8s - - G304 # "File path provided as taint input" -> too many false positives - - G307 # "Deferring unsafe method "Close" on type "io.ReadCloser" -> false positive when calling defer resp.Body.Close() - nakedret: - max-func-lines: 0 - revive: - ignore-generated-header: true - severity: error - # https://github.com/mgechev/revive - rules: - - name: errorf - - name: context-as-argument - - name: error-return - - name: increment-decrement - - name: indent-error-flow - - name: superfluous-else - - name: unused-parameter - - name: unreachable-code - - name: atomic - - name: empty-lines - - name: early-return - gocritic: - enabled-tags: - - performance - - style - - experimental - disabled-checks: - - wrapperFunc - - typeDefFirst - - ifElseChain - - dupImport # https://github.com/go-critic/go-critic/issues/845 linters: enable: - # https://golangci-lint.run/usage/linters/ - # default linters - - gosimple - - govet - - ineffassign - - staticcheck - - typecheck - - unused - # additional linters + - bodyclose + - depguard - errorlint + - forcetypeassert - gochecknoinits - gocritic - - gofmt - - goimports - gosec - misspell - nakedret - revive - - depguard - - bodyclose - sqlclosecheck - wastedassign - - forcetypeassert - - errcheck disable: - noctx # false positive: finds errors with http.NewRequest that dont make sense - unparam # false positives -issues: - exclude-use-default: false + settings: + depguard: + rules: + main: + list-mode: lax + deny: + - pkg: github.com/stretchr/testify + desc: Do not use a testing framework + gocritic: + disabled-checks: + - wrapperFunc + - typeDefFirst + - ifElseChain + - dupImport # https://github.com/go-critic/go-critic/issues/845 + enabled-tags: + - performance + - style + - experimental + gosec: + excludes: + # Suppressions: (see https://github.com/securego/gosec#available-rules for details) + - G104 # "Audit errors not checked" -> which we don't need and is a badly implemented version of errcheck + - G102 # "Bind to all interfaces" -> since this is normal in k8s + - G304 # "File path provided as taint input" -> too many false positives + - G307 # "Deferring unsafe method "Close" on type "io.ReadCloser" -> false positive when calling defer resp.Body.Close() + misspell: + # Correct spellings using locale preferences for US or UK. + # Default is to use a neutral variety of English. + # Setting locale to US will correct the British spelling of 'colour' to 'color'. + locale: US + nakedret: + max-func-lines: 0 + revive: + severity: error + # https://github.com/mgechev/revive + rules: + - name: errorf + - name: context-as-argument + - name: error-return + - name: increment-decrement + - name: indent-error-flow + - name: superfluous-else + - name: unused-parameter + - name: unreachable-code + - name: atomic + - name: empty-lines + - name: early-return + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ +formatters: + enable: + - gofmt + - goimports + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/internal/cmd/affinity-groups/affinity-groups.go b/internal/cmd/affinity-groups/affinity-groups.go index a750b2047..f8fe78433 100644 --- a/internal/cmd/affinity-groups/affinity-groups.go +++ b/internal/cmd/affinity-groups/affinity-groups.go @@ -6,12 +6,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "affinity-group", Short: "Manage server affinity groups", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( create.NewCmd(params), delete.NewCmd(params), diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index 311115644..ca5332eb8 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Policy string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an affinity groups", @@ -117,7 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, func outputResult(p *print.Printer, model inputModel, resp iaas.AffinityGroup) error { outputFormat := "" if model.GlobalFlagModel != nil { - outputFormat = model.GlobalFlagModel.OutputFormat + outputFormat = model.OutputFormat } return p.OutputResult(outputFormat, resp, func() error { diff --git a/internal/cmd/affinity-groups/create/create_test.go b/internal/cmd/affinity-groups/create/create_test.go index 6876da538..82dd23ef4 100644 --- a/internal/cmd/affinity-groups/create/create_test.go +++ b/internal/cmd/affinity-groups/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -180,7 +181,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.response) diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index fdfb68c1a..31df4cb18 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ const ( affinityGroupIdArg = "AFFINITY_GROUP" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", affinityGroupIdArg), Short: "Deletes an affinity group", diff --git a/internal/cmd/affinity-groups/delete/delete_test.go b/internal/cmd/affinity-groups/delete/delete_test.go index d66437d2f..b059eb50c 100644 --- a/internal/cmd/affinity-groups/delete/delete_test.go +++ b/internal/cmd/affinity-groups/delete/delete_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -102,7 +103,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 5510a439d..52465a976 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ const ( affinityGroupId = "AFFINITY_GROUP_ID" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", affinityGroupId), Short: "Show details of an affinity group", @@ -89,7 +90,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, cliArgs []string) (*inputM func outputResult(p *print.Printer, model inputModel, resp iaas.AffinityGroup) error { var outputFormat string if model.GlobalFlagModel != nil { - outputFormat = model.GlobalFlagModel.OutputFormat + outputFormat = model.OutputFormat } return p.OutputResult(outputFormat, resp, func() error { diff --git a/internal/cmd/affinity-groups/describe/describe_test.go b/internal/cmd/affinity-groups/describe/describe_test.go index 01c0d3eac..ac751003b 100644 --- a/internal/cmd/affinity-groups/describe/describe_test.go +++ b/internal/cmd/affinity-groups/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -103,7 +104,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 3752106e0..0a2e3013f 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -26,7 +27,7 @@ type inputModel struct { const limitFlag = "limit" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists affinity groups", @@ -111,7 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, func outputResult(p *print.Printer, model inputModel, items []iaas.AffinityGroup) error { var outputFormat string if model.GlobalFlagModel != nil { - outputFormat = model.GlobalFlagModel.OutputFormat + outputFormat = model.OutputFormat } return p.OutputResult(outputFormat, items, func() error { diff --git a/internal/cmd/affinity-groups/list/list_test.go b/internal/cmd/affinity-groups/list/list_test.go index 5c792a299..432640085 100644 --- a/internal/cmd/affinity-groups/list/list_test.go +++ b/internal/cmd/affinity-groups/list/list_test.go @@ -5,10 +5,11 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -154,7 +155,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.response) diff --git a/internal/cmd/auth/activate-service-account/activate_service_account.go b/internal/cmd/auth/activate-service-account/activate_service_account.go index a3cf1ee46..3b87d23f5 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account.go @@ -4,8 +4,9 @@ import ( "errors" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -33,7 +34,7 @@ type inputModel struct { OnlyPrintAccessToken bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "activate-service-account", Short: "Authenticates using a service account", diff --git a/internal/cmd/auth/auth.go b/internal/cmd/auth/auth.go index 7e1c020cf..d54f3fb01 100644 --- a/internal/cmd/auth/auth.go +++ b/internal/cmd/auth/auth.go @@ -5,14 +5,14 @@ import ( getaccesstoken "github.com/stackitcloud/stackit-cli/internal/cmd/auth/get-access-token" "github.com/stackitcloud/stackit-cli/internal/cmd/auth/login" "github.com/stackitcloud/stackit-cli/internal/cmd/auth/logout" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "auth", Short: "Authenticates the STACKIT CLI", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(login.NewCmd(params)) cmd.AddCommand(logout.NewCmd(params)) cmd.AddCommand(activateserviceaccount.NewCmd(params)) diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index 5ff3da916..a3c1246e6 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -4,8 +4,9 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -18,7 +19,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "get-access-token", Short: "Prints a short-lived access token.", diff --git a/internal/cmd/auth/login/login.go b/internal/cmd/auth/login/login.go index 8740fead7..23efd0a4e 100644 --- a/internal/cmd/auth/login/login.go +++ b/internal/cmd/auth/login/login.go @@ -3,7 +3,8 @@ package login import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -11,7 +12,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "login", Short: "Logs in to the STACKIT CLI", diff --git a/internal/cmd/auth/logout/logout.go b/internal/cmd/auth/logout/logout.go index 4b318b2e7..e5e4f6be8 100644 --- a/internal/cmd/auth/logout/logout.go +++ b/internal/cmd/auth/logout/logout.go @@ -3,7 +3,8 @@ package logout import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -11,7 +12,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "logout", Short: "Logs the user account out of the STACKIT CLI", diff --git a/internal/cmd/beta/alb/alb.go b/internal/cmd/beta/alb/alb.go index fde1da311..62bd90d2b 100644 --- a/internal/cmd/beta/alb/alb.go +++ b/internal/cmd/beta/alb/alb.go @@ -11,15 +11,15 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/quotas" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/template" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "alb", Short: "Manages application loadbalancers", @@ -31,7 +31,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( list.NewCmd(params), template.NewCmd(params), diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index 33551e3ac..cf8429d10 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -8,8 +8,9 @@ import ( "os" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Configuration *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an application loadbalancer", diff --git a/internal/cmd/beta/alb/create/create_test.go b/internal/cmd/beta/alb/create/create_test.go index a3b7c0725..c99f4a859 100644 --- a/internal/cmd/beta/alb/create/create_test.go +++ b/internal/cmd/beta/alb/create/create_test.go @@ -7,10 +7,11 @@ import ( "log" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -212,7 +213,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/delete/delete.go b/internal/cmd/beta/alb/delete/delete.go index d7dfe1c50..5d0c23ec5 100644 --- a/internal/cmd/beta/alb/delete/delete.go +++ b/internal/cmd/beta/alb/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -25,7 +26,7 @@ type inputModel struct { Name string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", loadbalancerNameArg), Short: "Deletes an application loadbalancer", diff --git a/internal/cmd/beta/alb/describe/describe.go b/internal/cmd/beta/alb/describe/describe.go index bccca2ace..6d4cae785 100644 --- a/internal/cmd/beta/alb/describe/describe.go +++ b/internal/cmd/beta/alb/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -28,7 +29,7 @@ type inputModel struct { Name string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", loadbalancerNameArg), Short: "Describes an application loadbalancer", diff --git a/internal/cmd/beta/alb/describe/describe_test.go b/internal/cmd/beta/alb/describe/describe_test.go index 9132fc5af..9d79acbad 100644 --- a/internal/cmd/beta/alb/describe/describe_test.go +++ b/internal/cmd/beta/alb/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -168,7 +169,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index 292e2e3ae..bfeb711c6 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ const ( limitFlag = "limit" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists albs", diff --git a/internal/cmd/beta/alb/list/list_test.go b/internal/cmd/beta/alb/list/list_test.go index 5ffc642e2..b579d45a6 100644 --- a/internal/cmd/beta/alb/list/list_test.go +++ b/internal/cmd/beta/alb/list/list_test.go @@ -5,10 +5,11 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -167,7 +168,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index 1b430cdf6..039a76ebe 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -29,7 +30,7 @@ type inputModel struct { Password *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "add", Short: "Adds observability credentials to an application load balancer", @@ -69,7 +70,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("add credential: %w", err) } - return outputResult(params.Printer, model.GlobalFlagModel.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/beta/alb/observability-credentials/add/add_test.go b/internal/cmd/beta/alb/observability-credentials/add/add_test.go index fb81d7a34..de16544a6 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add_test.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -166,7 +167,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.item); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete.go b/internal/cmd/beta/alb/observability-credentials/delete/delete.go index 8270d4df0..d27de6d3e 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -24,7 +25,7 @@ type inputModel struct { CredentialsRef string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialRefArg), Short: "Deletes credentials", diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go b/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go index 09ecaa532..951846c66 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/alb" @@ -113,7 +114,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe.go b/internal/cmd/beta/alb/observability-credentials/describe/describe.go index 2ebf96e4a..fe370a10d 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -27,7 +28,7 @@ type inputModel struct { CredentialRef string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialRefArg), Short: "Describes observability credentials for the Application Load Balancer", diff --git a/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go b/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go index df4d70fe1..7846a6b21 100644 --- a/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go +++ b/internal/cmd/beta/alb/observability-credentials/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -168,7 +169,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/observability-credentials/list/list.go b/internal/cmd/beta/alb/observability-credentials/list/list.go index 51347cae2..5c44aae92 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials", diff --git a/internal/cmd/beta/alb/observability-credentials/list/list_test.go b/internal/cmd/beta/alb/observability-credentials/list/list_test.go index e8054a4e8..eacc42dea 100644 --- a/internal/cmd/beta/alb/observability-credentials/list/list_test.go +++ b/internal/cmd/beta/alb/observability-credentials/list/list_test.go @@ -5,7 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -180,7 +181,7 @@ func Test_outputResult(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/cmd/beta/alb/observability-credentials/observability-credentials.go b/internal/cmd/beta/alb/observability-credentials/observability-credentials.go index 3d18486ee..0e05ae183 100644 --- a/internal/cmd/beta/alb/observability-credentials/observability-credentials.go +++ b/internal/cmd/beta/alb/observability-credentials/observability-credentials.go @@ -2,17 +2,17 @@ package credentials import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" add "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/add" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "observability-credentials", Short: "Provides functionality for application loadbalancer credentials", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(add.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/beta/alb/observability-credentials/update/update.go b/internal/cmd/beta/alb/observability-credentials/update/update.go index 703fe12a7..222c94559 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -33,7 +34,7 @@ type inputModel struct { CredentialsRef *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", credentialRefArg), Short: "Update credentials", @@ -127,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) inputM func outputResult(p *print.Printer, model inputModel, response *alb.UpdateCredentialsResponse) error { var outputFormat string if model.GlobalFlagModel != nil { - outputFormat = model.GlobalFlagModel.OutputFormat + outputFormat = model.OutputFormat } if response == nil { return fmt.Errorf("no response passed") diff --git a/internal/cmd/beta/alb/observability-credentials/update/update_test.go b/internal/cmd/beta/alb/observability-credentials/update/update_test.go index 1fd029be1..1697fc13a 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update_test.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -128,7 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -218,7 +219,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.item); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index 0724860a1..c38dd9b70 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,7 +23,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists the application load balancer plans", diff --git a/internal/cmd/beta/alb/plans/plans_test.go b/internal/cmd/beta/alb/plans/plans_test.go index ebb7ed8f0..c104680e5 100644 --- a/internal/cmd/beta/alb/plans/plans_test.go +++ b/internal/cmd/beta/alb/plans/plans_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -159,7 +160,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/pool/pool.go b/internal/cmd/beta/alb/pool/pool.go index d40f8733a..f83b7728b 100644 --- a/internal/cmd/beta/alb/pool/pool.go +++ b/internal/cmd/beta/alb/pool/pool.go @@ -2,15 +2,15 @@ package pool import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/pool/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "pool", Short: "Manages target pools for application loadbalancers", @@ -22,6 +22,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(update.NewCmd(params)) } diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index ca294f052..dcc51b7c6 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -8,8 +8,9 @@ import ( "os" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { AlbName *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates an application target pool", diff --git a/internal/cmd/beta/alb/pool/update/update_test.go b/internal/cmd/beta/alb/pool/update/update_test.go index 15bc4f4a9..771cf6ce1 100644 --- a/internal/cmd/beta/alb/pool/update/update_test.go +++ b/internal/cmd/beta/alb/pool/update/update_test.go @@ -7,10 +7,11 @@ import ( "log" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -221,7 +222,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index 3f9a63002..29f1c3bfd 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +22,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "quotas", Short: "Shows the application load balancer quotas", diff --git a/internal/cmd/beta/alb/quotas/quotas_test.go b/internal/cmd/beta/alb/quotas/quotas_test.go index ee63dffcd..80ee324f6 100644 --- a/internal/cmd/beta/alb/quotas/quotas_test.go +++ b/internal/cmd/beta/alb/quotas/quotas_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -157,7 +158,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.response); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/alb/template/template.go b/internal/cmd/beta/alb/template/template.go index a57b83f67..67819b173 100644 --- a/internal/cmd/beta/alb/template/template.go +++ b/internal/cmd/beta/alb/template/template.go @@ -6,9 +6,10 @@ import ( "fmt" "os" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ var ( templatePool string ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "template", Short: "creates configuration templates to use for resource creation", diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index c1c576f06..5b34fea74 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -8,8 +8,9 @@ import ( "os" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Version *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates an application loadbalancer", diff --git a/internal/cmd/beta/alb/update/update_test.go b/internal/cmd/beta/alb/update/update_test.go index dc8f5986a..d4ccb0788 100644 --- a/internal/cmd/beta/alb/update/update_test.go +++ b/internal/cmd/beta/alb/update/update_test.go @@ -7,10 +7,11 @@ import ( "log" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -215,7 +216,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index a60570613..de4e2f48f 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -3,11 +3,12 @@ package beta import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -15,7 +16,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "beta", Short: "Contains beta STACKIT CLI commands", @@ -37,7 +38,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(sqlserverflex.NewCmd(params)) cmd.AddCommand(alb.NewCmd(params)) cmd.AddCommand(intake.NewCmd(params)) diff --git a/internal/cmd/beta/intake/intake.go b/internal/cmd/beta/intake/intake.go index 96533f29c..bf298f946 100644 --- a/internal/cmd/beta/intake/intake.go +++ b/internal/cmd/beta/intake/intake.go @@ -3,13 +3,13 @@ package intake import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) // NewCmd creates the 'stackit intake' command -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "intake", Short: "Provides functionality for intake", @@ -21,6 +21,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(runner.NewCmd(params)) } diff --git a/internal/cmd/beta/intake/runner/create/create.go b/internal/cmd/beta/intake/runner/create/create.go index 1a6ed58ec..95b6b4211 100644 --- a/internal/cmd/beta/intake/runner/create/create.go +++ b/internal/cmd/beta/intake/runner/create/create.go @@ -4,11 +4,12 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/intake" "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *params.CmdParams) *cobra.Command { +func NewCmd(p *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a new Intake Runner", diff --git a/internal/cmd/beta/intake/runner/create/create_test.go b/internal/cmd/beta/intake/runner/create/create_test.go index 6ddcaa4a1..c4f16995b 100644 --- a/internal/cmd/beta/intake/runner/create/create_test.go +++ b/internal/cmd/beta/intake/runner/create/create_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -282,7 +283,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/intake/runner/delete/delete.go b/internal/cmd/beta/intake/runner/delete/delete.go index e74551a7d..fcb4ae69d 100644 --- a/internal/cmd/beta/intake/runner/delete/delete.go +++ b/internal/cmd/beta/intake/runner/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { } // NewCmd creates a new cobra command for deleting an Intake Runner -func NewCmd(p *params.CmdParams) *cobra.Command { +func NewCmd(p *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", runnerIdArg), Short: "Deletes an Intake Runner", diff --git a/internal/cmd/beta/intake/runner/describe/describe.go b/internal/cmd/beta/intake/runner/describe/describe.go index b5ba12ae7..47eedc386 100644 --- a/internal/cmd/beta/intake/runner/describe/describe.go +++ b/internal/cmd/beta/intake/runner/describe/describe.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { RunnerId string } -func NewCmd(p *params.CmdParams) *cobra.Command { +func NewCmd(p *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", runnerIdArg), Short: "Shows details of an Intake Runner", diff --git a/internal/cmd/beta/intake/runner/describe/describe_test.go b/internal/cmd/beta/intake/runner/describe/describe_test.go index 9235ac723..1cb034e04 100644 --- a/internal/cmd/beta/intake/runner/describe/describe_test.go +++ b/internal/cmd/beta/intake/runner/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -181,7 +182,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.runner); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/intake/runner/list/list.go b/internal/cmd/beta/intake/runner/list/list.go index d3df6751f..c9bdc9acd 100644 --- a/internal/cmd/beta/intake/runner/list/list.go +++ b/internal/cmd/beta/intake/runner/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { } // NewCmd creates a new cobra command for listing Intake Runners -func NewCmd(p *params.CmdParams) *cobra.Command { +func NewCmd(p *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Intake Runners", diff --git a/internal/cmd/beta/intake/runner/list/list_test.go b/internal/cmd/beta/intake/runner/list/list_test.go index 582adab2c..bbce39c3e 100644 --- a/internal/cmd/beta/intake/runner/list/list_test.go +++ b/internal/cmd/beta/intake/runner/list/list_test.go @@ -5,11 +5,12 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -186,7 +187,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, "dummy-projectlabel", tt.args.runners); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/intake/runner/runner.go b/internal/cmd/beta/intake/runner/runner.go index 0708b4ae2..f923d96ff 100644 --- a/internal/cmd/beta/intake/runner/runner.go +++ b/internal/cmd/beta/intake/runner/runner.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "runner", Short: "Provides functionality for Intake Runners", diff --git a/internal/cmd/beta/intake/runner/update/update.go b/internal/cmd/beta/intake/runner/update/update.go index 9ebb4a81e..a5f5bb55a 100644 --- a/internal/cmd/beta/intake/runner/update/update.go +++ b/internal/cmd/beta/intake/runner/update/update.go @@ -4,9 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -43,7 +44,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(p *params.CmdParams) *cobra.Command { +func NewCmd(p *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", runnerIdArg), Short: "Updates an Intake Runner", diff --git a/internal/cmd/beta/intake/runner/update/update_test.go b/internal/cmd/beta/intake/runner/update/update_test.go index 9b4ae7afa..b702ede40 100644 --- a/internal/cmd/beta/intake/runner/update/update_test.go +++ b/internal/cmd/beta/intake/runner/update/update_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -266,7 +267,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/kms/key/create/create.go b/internal/cmd/beta/kms/key/create/create.go index 1d815e638..91c6ab3c9 100644 --- a/internal/cmd/beta/kms/key/create/create.go +++ b/internal/cmd/beta/kms/key/create/create.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" @@ -45,7 +46,7 @@ type inputModel struct { Protection *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a KMS key", diff --git a/internal/cmd/beta/kms/key/create/create_test.go b/internal/cmd/beta/kms/key/create/create_test.go index f6c0a024e..76c04dc6b 100644 --- a/internal/cmd/beta/kms/key/create/create_test.go +++ b/internal/cmd/beta/kms/key/create/create_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -315,7 +316,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.key) diff --git a/internal/cmd/beta/kms/key/delete/delete.go b/internal/cmd/beta/kms/key/delete/delete.go index 56ab3059a..5ead9aca5 100644 --- a/internal/cmd/beta/kms/key/delete/delete.go +++ b/internal/cmd/beta/kms/key/delete/delete.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", keyIdArg), Short: "Deletes a KMS key", diff --git a/internal/cmd/beta/kms/key/delete/delete_test.go b/internal/cmd/beta/kms/key/delete/delete_test.go index b073b45be..78a2fee98 100644 --- a/internal/cmd/beta/kms/key/delete/delete_test.go +++ b/internal/cmd/beta/kms/key/delete/delete_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -169,7 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -280,7 +281,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/key/describe/describe.go b/internal/cmd/beta/kms/key/describe/describe.go index 113cf96de..4f036c374 100644 --- a/internal/cmd/beta/kms/key/describe/describe.go +++ b/internal/cmd/beta/kms/key/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { KeyRingID string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", argKeyID), Short: "Describe a KMS key", @@ -74,14 +75,14 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command, args []string) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} } model := &inputModel{ GlobalFlagModel: globalFlags, - KeyID: args[0], + KeyID: inputArgs[0], KeyRingID: flags.FlagToStringValue(p, cmd, flagKeyRingID), } p.DebugInputModel(model) diff --git a/internal/cmd/beta/kms/key/describe/describe_test.go b/internal/cmd/beta/kms/key/describe/describe_test.go index 6abb30a09..6a34e5c74 100644 --- a/internal/cmd/beta/kms/key/describe/describe_test.go +++ b/internal/cmd/beta/kms/key/describe/describe_test.go @@ -7,10 +7,11 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -205,7 +206,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { var buf bytes.Buffer diff --git a/internal/cmd/beta/kms/key/importKey/importKey.go b/internal/cmd/beta/kms/key/importKey/importKey.go index f491f6eb7..78c70270e 100644 --- a/internal/cmd/beta/kms/key/importKey/importKey.go +++ b/internal/cmd/beta/kms/key/importKey/importKey.go @@ -6,9 +6,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" @@ -38,7 +39,7 @@ type inputModel struct { WrappingKeyId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("import %s", keyIdArg), Short: "Import a KMS key", @@ -109,7 +110,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } // WrappedKey needs to be base64 encoded - var wrappedKey *string = flags.FlagToStringPointer(p, cmd, wrappedKeyFlag) + var wrappedKey = flags.FlagToStringPointer(p, cmd, wrappedKeyFlag) _, err := base64.StdEncoding.DecodeString(*wrappedKey) if err != nil || *wrappedKey == "" { return nil, &cliErr.FlagValidationError{ diff --git a/internal/cmd/beta/kms/key/importKey/importKey_test.go b/internal/cmd/beta/kms/key/importKey/importKey_test.go index 37192e9d1..378f34ea0 100644 --- a/internal/cmd/beta/kms/key/importKey/importKey_test.go +++ b/internal/cmd/beta/kms/key/importKey/importKey_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -228,7 +229,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -350,7 +351,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.keyRingName, tt.keyName, tt.version) diff --git a/internal/cmd/beta/kms/key/key.go b/internal/cmd/beta/kms/key/key.go index b6ff239bc..d1ae57511 100644 --- a/internal/cmd/beta/kms/key/key.go +++ b/internal/cmd/beta/kms/key/key.go @@ -8,14 +8,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/restore" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/rotate" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "key", Short: "Manage KMS keys", @@ -27,7 +27,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(importKey.NewCmd(params)) diff --git a/internal/cmd/beta/kms/key/list/list.go b/internal/cmd/beta/kms/key/list/list.go index aa337b5b7..576463689 100644 --- a/internal/cmd/beta/kms/key/list/list.go +++ b/internal/cmd/beta/kms/key/list/list.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "List all KMS keys", diff --git a/internal/cmd/beta/kms/key/list/list_test.go b/internal/cmd/beta/kms/key/list/list_test.go index 17d773bd5..74491ae07 100644 --- a/internal/cmd/beta/kms/key/list/list_test.go +++ b/internal/cmd/beta/kms/key/list/list_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -246,7 +247,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.projectId, tt.keyRingId, tt.resp) diff --git a/internal/cmd/beta/kms/key/restore/restore.go b/internal/cmd/beta/kms/key/restore/restore.go index 05494a97a..43164aa89 100644 --- a/internal/cmd/beta/kms/key/restore/restore.go +++ b/internal/cmd/beta/kms/key/restore/restore.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", keyIdArg), Short: "Restore a key", diff --git a/internal/cmd/beta/kms/key/restore/restore_test.go b/internal/cmd/beta/kms/key/restore/restore_test.go index 69860461d..9c75b8ec0 100644 --- a/internal/cmd/beta/kms/key/restore/restore_test.go +++ b/internal/cmd/beta/kms/key/restore/restore_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -169,7 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -280,7 +281,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/key/rotate/rotate.go b/internal/cmd/beta/kms/key/rotate/rotate.go index 14e4ff15f..0761554df 100644 --- a/internal/cmd/beta/kms/key/rotate/rotate.go +++ b/internal/cmd/beta/kms/key/rotate/rotate.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("rotate %s", keyIdArg), Short: "Rotate a key", diff --git a/internal/cmd/beta/kms/key/rotate/rotate_test.go b/internal/cmd/beta/kms/key/rotate/rotate_test.go index 28d84295e..18965764d 100644 --- a/internal/cmd/beta/kms/key/rotate/rotate_test.go +++ b/internal/cmd/beta/kms/key/rotate/rotate_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -169,7 +170,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -280,7 +281,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/keyring/create/create.go b/internal/cmd/beta/kms/keyring/create/create.go index b4103e957..6a44529ed 100644 --- a/internal/cmd/beta/kms/keyring/create/create.go +++ b/internal/cmd/beta/kms/keyring/create/create.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" @@ -33,7 +34,7 @@ type inputModel struct { Description string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a KMS key ring", diff --git a/internal/cmd/beta/kms/keyring/create/create_test.go b/internal/cmd/beta/kms/keyring/create/create_test.go index 8cdf81219..c4b307859 100644 --- a/internal/cmd/beta/kms/keyring/create/create_test.go +++ b/internal/cmd/beta/kms/keyring/create/create_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -237,7 +238,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.keyRing) diff --git a/internal/cmd/beta/kms/keyring/delete/delete.go b/internal/cmd/beta/kms/keyring/delete/delete.go index 307729745..79c7316ea 100644 --- a/internal/cmd/beta/kms/keyring/delete/delete.go +++ b/internal/cmd/beta/kms/keyring/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", keyRingIdArg), Short: "Deletes a KMS key ring", diff --git a/internal/cmd/beta/kms/keyring/delete/delete_test.go b/internal/cmd/beta/kms/keyring/delete/delete_test.go index c53e7d7f0..4881e63e0 100644 --- a/internal/cmd/beta/kms/keyring/delete/delete_test.go +++ b/internal/cmd/beta/kms/keyring/delete/delete_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -132,7 +133,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/kms/keyring/describe/describe.go b/internal/cmd/beta/kms/keyring/describe/describe.go index f9dc11d0a..ed90cee8d 100644 --- a/internal/cmd/beta/kms/keyring/describe/describe.go +++ b/internal/cmd/beta/kms/keyring/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { KeyRingID string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", argKeyRingID), Short: "Describe a KMS key ring", @@ -64,14 +65,14 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func parseInput(p *print.Printer, cmd *cobra.Command, args []string) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} } model := &inputModel{ GlobalFlagModel: globalFlags, - KeyRingID: args[0], + KeyRingID: inputArgs[0], } p.DebugInputModel(model) return model, nil diff --git a/internal/cmd/beta/kms/keyring/describe/describe_test.go b/internal/cmd/beta/kms/keyring/describe/describe_test.go index bdc3caa88..8c0a309f5 100644 --- a/internal/cmd/beta/kms/keyring/describe/describe_test.go +++ b/internal/cmd/beta/kms/keyring/describe/describe_test.go @@ -7,10 +7,11 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -166,7 +167,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { var buf bytes.Buffer diff --git a/internal/cmd/beta/kms/keyring/keyring.go b/internal/cmd/beta/kms/keyring/keyring.go index f948fae41..8683a6907 100644 --- a/internal/cmd/beta/kms/keyring/keyring.go +++ b/internal/cmd/beta/kms/keyring/keyring.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "keyring", Short: "Manage KMS key rings", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/beta/kms/keyring/list/list.go b/internal/cmd/beta/kms/keyring/list/list.go index d12b9ae87..240992c43 100644 --- a/internal/cmd/beta/kms/keyring/list/list.go +++ b/internal/cmd/beta/kms/keyring/list/list.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -23,7 +24,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all KMS key rings", diff --git a/internal/cmd/beta/kms/keyring/list/list_test.go b/internal/cmd/beta/kms/keyring/list/list_test.go index d85681c99..d4e74c414 100644 --- a/internal/cmd/beta/kms/keyring/list/list_test.go +++ b/internal/cmd/beta/kms/keyring/list/list_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -217,7 +218,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.projectId, tt.resp) diff --git a/internal/cmd/beta/kms/kms.go b/internal/cmd/beta/kms/kms.go index 8eeb2b0d2..1adfc3004 100644 --- a/internal/cmd/beta/kms/kms.go +++ b/internal/cmd/beta/kms/kms.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "kms", Short: "Provides functionality for KMS", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(keyring.NewCmd(params)) cmd.AddCommand(wrappingkey.NewCmd(params)) cmd.AddCommand(key.NewCmd(params)) diff --git a/internal/cmd/beta/kms/version/destroy/destroy.go b/internal/cmd/beta/kms/version/destroy/destroy.go index 470099c66..b33d5d5b6 100644 --- a/internal/cmd/beta/kms/version/destroy/destroy.go +++ b/internal/cmd/beta/kms/version/destroy/destroy.go @@ -6,9 +6,10 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { VersionNumber int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("destroy %s", versionNumberArg), Short: "Destroy a key version", diff --git a/internal/cmd/beta/kms/version/destroy/destroy_test.go b/internal/cmd/beta/kms/version/destroy/destroy_test.go index 898d1a084..2dde6cd9b 100644 --- a/internal/cmd/beta/kms/version/destroy/destroy_test.go +++ b/internal/cmd/beta/kms/version/destroy/destroy_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -197,7 +198,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -307,7 +308,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/version/disable/disable.go b/internal/cmd/beta/kms/version/disable/disable.go index bfb641d56..9260c8e6a 100644 --- a/internal/cmd/beta/kms/version/disable/disable.go +++ b/internal/cmd/beta/kms/version/disable/disable.go @@ -6,9 +6,10 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { VersionNumber int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disable %s", versionNumberArg), Short: "Disable a key version", diff --git a/internal/cmd/beta/kms/version/disable/disable_test.go b/internal/cmd/beta/kms/version/disable/disable_test.go index 66ec302b8..8108ea4b9 100644 --- a/internal/cmd/beta/kms/version/disable/disable_test.go +++ b/internal/cmd/beta/kms/version/disable/disable_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -197,7 +198,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -308,7 +309,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/version/enable/enable.go b/internal/cmd/beta/kms/version/enable/enable.go index a2530996c..06d8a85ec 100644 --- a/internal/cmd/beta/kms/version/enable/enable.go +++ b/internal/cmd/beta/kms/version/enable/enable.go @@ -6,9 +6,10 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { VersionNumber int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("enable %s", versionNumberArg), Short: "Enable a key version", diff --git a/internal/cmd/beta/kms/version/enable/enable_test.go b/internal/cmd/beta/kms/version/enable/enable_test.go index 381f7885a..0cc35d43f 100644 --- a/internal/cmd/beta/kms/version/enable/enable_test.go +++ b/internal/cmd/beta/kms/version/enable/enable_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -197,7 +198,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -308,7 +309,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/version/list/list.go b/internal/cmd/beta/kms/version/list/list.go index c73b2a949..f9f606ac2 100644 --- a/internal/cmd/beta/kms/version/list/list.go +++ b/internal/cmd/beta/kms/version/list/list.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { KeyId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "List all key versions", diff --git a/internal/cmd/beta/kms/version/list/list_test.go b/internal/cmd/beta/kms/version/list/list_test.go index a1df169ac..e8e97d40c 100644 --- a/internal/cmd/beta/kms/version/list/list_test.go +++ b/internal/cmd/beta/kms/version/list/list_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -270,7 +271,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.projectId, tt.keyId, tt.resp) diff --git a/internal/cmd/beta/kms/version/restore/restore.go b/internal/cmd/beta/kms/version/restore/restore.go index c5b4e7aec..2f5f0882d 100644 --- a/internal/cmd/beta/kms/version/restore/restore.go +++ b/internal/cmd/beta/kms/version/restore/restore.go @@ -6,9 +6,10 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { VersionNumber int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", versionNumberArg), Short: "Restore a key version", diff --git a/internal/cmd/beta/kms/version/restore/restore_test.go b/internal/cmd/beta/kms/version/restore/restore_test.go index ad388135e..7454fc5a5 100644 --- a/internal/cmd/beta/kms/version/restore/restore_test.go +++ b/internal/cmd/beta/kms/version/restore/restore_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -197,7 +198,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -308,7 +309,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.resp) diff --git a/internal/cmd/beta/kms/version/version.go b/internal/cmd/beta/kms/version/version.go index 39c90e5c8..60b642679 100644 --- a/internal/cmd/beta/kms/version/version.go +++ b/internal/cmd/beta/kms/version/version.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/enable" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/restore" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "version", Short: "Manage KMS key versions", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(destroy.NewCmd(params)) cmd.AddCommand(disable.NewCmd(params)) cmd.AddCommand(enable.NewCmd(params)) diff --git a/internal/cmd/beta/kms/wrappingkey/create/create.go b/internal/cmd/beta/kms/wrappingkey/create/create.go index 76d8be6b5..d652da5ac 100644 --- a/internal/cmd/beta/kms/wrappingkey/create/create.go +++ b/internal/cmd/beta/kms/wrappingkey/create/create.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" @@ -43,7 +44,7 @@ type inputModel struct { Protection *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a KMS wrapping key", diff --git a/internal/cmd/beta/kms/wrappingkey/create/create_test.go b/internal/cmd/beta/kms/wrappingkey/create/create_test.go index 15616c322..2b7d356de 100644 --- a/internal/cmd/beta/kms/wrappingkey/create/create_test.go +++ b/internal/cmd/beta/kms/wrappingkey/create/create_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -306,7 +307,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.model, tt.wrappingKey) diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete.go b/internal/cmd/beta/kms/wrappingkey/delete/delete.go index 0ade8822f..38b659cdf 100644 --- a/internal/cmd/beta/kms/wrappingkey/delete/delete.go +++ b/internal/cmd/beta/kms/wrappingkey/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", wrappingKeyIdArg), Short: "Deletes a KMS wrapping key", diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go b/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go index 57be1cbfa..c8d3a2ee2 100644 --- a/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go +++ b/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -161,7 +162,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/beta/kms/wrappingkey/describe/describe.go b/internal/cmd/beta/kms/wrappingkey/describe/describe.go index 2c25a288e..f8edb6921 100644 --- a/internal/cmd/beta/kms/wrappingkey/describe/describe.go +++ b/internal/cmd/beta/kms/wrappingkey/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { KeyRingID string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", argWrappingKeyID), Short: "Describe a KMS wrapping key", @@ -74,14 +75,14 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func parseInput(p *print.Printer, cmd *cobra.Command, args []string) (*inputModel, error) { +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { return nil, &errors.ProjectIdError{} } model := &inputModel{ GlobalFlagModel: globalFlags, - WrappingKeyID: args[0], + WrappingKeyID: inputArgs[0], KeyRingID: flags.FlagToStringValue(p, cmd, flagKeyRingID), } p.DebugInputModel(model) diff --git a/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go b/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go index 9589b33fb..579f27f3d 100644 --- a/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go +++ b/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go @@ -7,10 +7,11 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -198,7 +199,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { var buf bytes.Buffer diff --git a/internal/cmd/beta/kms/wrappingkey/list/list.go b/internal/cmd/beta/kms/wrappingkey/list/list.go index a89babc53..dbb514812 100644 --- a/internal/cmd/beta/kms/wrappingkey/list/list.go +++ b/internal/cmd/beta/kms/wrappingkey/list/list.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { KeyRingId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all KMS wrapping keys", diff --git a/internal/cmd/beta/kms/wrappingkey/list/list_test.go b/internal/cmd/beta/kms/wrappingkey/list/list_test.go index 93eb4b88b..05c571ed3 100644 --- a/internal/cmd/beta/kms/wrappingkey/list/list_test.go +++ b/internal/cmd/beta/kms/wrappingkey/list/list_test.go @@ -4,11 +4,12 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/kms" @@ -238,7 +239,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { err := outputResult(p, tt.outputFormat, tt.keyRingId, tt.resp) diff --git a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go b/internal/cmd/beta/kms/wrappingkey/wrappingkey.go index 168808e37..2aaa14640 100644 --- a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go +++ b/internal/cmd/beta/kms/wrappingkey/wrappingkey.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "wrapping-key", Short: "Manage KMS wrapping keys", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index 8b20bb219..072c3b91e 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Owner string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", databaseNameArg), Short: "Creates a SQLServer Flex database", diff --git a/internal/cmd/beta/sqlserverflex/database/create/create_test.go b/internal/cmd/beta/sqlserverflex/database/create/create_test.go index 23001c28c..f33b7623c 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -236,7 +237,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.databaseName, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/database/database.go b/internal/cmd/beta/sqlserverflex/database/database.go index f11cf2bd0..75113d255 100644 --- a/internal/cmd/beta/sqlserverflex/database/database.go +++ b/internal/cmd/beta/sqlserverflex/database/database.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/database/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "database", Short: "Provides functionality for SQLServer Flex databases", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index bc19533dc..edfd47f83 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", databaseNameArg), Short: "Deletes a SQLServer Flex database", diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index ef4afa8fc..7ad000553 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", databaseNameArg), Short: "Shows details of an SQLServer Flex database", diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go index b77f11679..2a4bc2b01 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -224,7 +225,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index 12738a9ab..439b069df 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SQLServer Flex databases", diff --git a/internal/cmd/beta/sqlserverflex/database/list/list_test.go b/internal/cmd/beta/sqlserverflex/database/list/list_test.go index 36674a923..236f64f78 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -199,7 +200,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceId, tt.args.projectLabel, tt.args.databases); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 8e349c6bc..04841a4c7 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -64,7 +65,7 @@ type inputModel struct { RetentionDays *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a SQLServer Flex instance", diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go index 40481f963..8168cecc6 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -480,7 +481,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index 0fcd25dd5..5e320f039 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a SQLServer Flex instance", diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go index d978bcf97..b1b4f167c 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a SQLServer Flex instance", diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go index 66676b001..4fb05fb0a 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/instance.go b/internal/cmd/beta/sqlserverflex/instance/instance.go index 4ed452eb1..9d8784bc7 100644 --- a/internal/cmd/beta/sqlserverflex/instance/instance.go +++ b/internal/cmd/beta/sqlserverflex/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for SQLServer Flex instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 27dada066..7fe756750 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SQLServer Flex instances", diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go index 4105384df..d730fa056 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -174,7 +175,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index ec06d020a..019826e3b 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -59,7 +60,7 @@ type inputModel struct { Version *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a SQLServer Flex instance", diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go index 5db0655ba..894839d93 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -282,7 +283,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -521,7 +522,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/options/options.go b/internal/cmd/beta/sqlserverflex/options/options.go index 9352e53b5..236dab10d 100644 --- a/internal/cmd/beta/sqlserverflex/options/options.go +++ b/internal/cmd/beta/sqlserverflex/options/options.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -86,7 +87,7 @@ type instanceDBCompatibilities struct { DBCompatibilities []sqlserverflex.MssqlDatabaseCompatibility `json:"dbCompatibilities"` } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists SQL Server Flex options", diff --git a/internal/cmd/beta/sqlserverflex/options/options_test.go b/internal/cmd/beta/sqlserverflex/options/options_test.go index 61b24b242..3a43e1668 100644 --- a/internal/cmd/beta/sqlserverflex/options/options_test.go +++ b/internal/cmd/beta/sqlserverflex/options/options_test.go @@ -5,8 +5,9 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -435,7 +436,7 @@ func TestBuildAndExecuteRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) p.Cmd = cmd client := &sqlServerFlexClientMocked{ listFlavorsFails: tt.listFlavorsFails, @@ -507,7 +508,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.flavors, tt.args.versions, tt.args.storages, tt.args.userRoles, tt.args.dbCollations, tt.args.dbCompatibilities); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/sqlserverflex.go b/internal/cmd/beta/sqlserverflex/sqlserverflex.go index 51c93beb8..29404a045 100644 --- a/internal/cmd/beta/sqlserverflex/sqlserverflex.go +++ b/internal/cmd/beta/sqlserverflex/sqlserverflex.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/options" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "sqlserverflex", Short: "Provides functionality for SQLServer Flex", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(database.NewCmd(params)) cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(options.NewCmd(params)) diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 5160873f2..cb77255f9 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a SQLServer Flex user", diff --git a/internal/cmd/beta/sqlserverflex/user/create/create_test.go b/internal/cmd/beta/sqlserverflex/user/create/create_test.go index ad5df9a27..d8e9a8836 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete.go b/internal/cmd/beta/sqlserverflex/user/delete/delete.go index 31869cdda..0908a227f 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a SQLServer Flex user", diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe.go b/internal/cmd/beta/sqlserverflex/user/describe/describe.go index 93d97acc4..bdfe47fc1 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a SQLServer Flex user", diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go index e67aeb3b9..77123e300 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -211,7 +212,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index c74dc7866..24a216bbd 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SQLServer Flex users of an instance", diff --git a/internal/cmd/beta/sqlserverflex/user/list/list_test.go b/internal/cmd/beta/sqlserverflex/user/list/list_test.go index 44deacf77..fd7e31df7 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -191,7 +192,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.users); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index b56538eec..b27b6e923 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reset-password %s", userIdArg), Short: "Resets the password of a SQLServer Flex user", diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go index b15b7069e..921e39758 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -213,7 +214,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.userLabel, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/beta/sqlserverflex/user/user.go b/internal/cmd/beta/sqlserverflex/user/user.go index 0c83d54e4..572a9ea52 100644 --- a/internal/cmd/beta/sqlserverflex/user/user.go +++ b/internal/cmd/beta/sqlserverflex/user/user.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user/list" resetpassword "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex/user/reset-password" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for SQLServer Flex users", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/config/config.go b/internal/cmd/config/config.go index 46b21b96a..3000a8ac1 100644 --- a/internal/cmd/config/config.go +++ b/internal/cmd/config/config.go @@ -3,18 +3,19 @@ package config import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/config/list" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile" "github.com/stackitcloud/stackit-cli/internal/cmd/config/set" "github.com/stackitcloud/stackit-cli/internal/cmd/config/unset" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "config", Short: "Provides functionality for CLI configuration options", @@ -32,7 +33,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(set.NewCmd(params)) cmd.AddCommand(unset.NewCmd(params)) diff --git a/internal/cmd/config/list/list.go b/internal/cmd/config/list/list.go index 6dbc78e7e..71e115b29 100644 --- a/internal/cmd/config/list/list.go +++ b/internal/cmd/config/list/list.go @@ -4,13 +4,14 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "slices" "sort" "strconv" "strings" "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists the current CLI configuration values", diff --git a/internal/cmd/config/list/list_test.go b/internal/cmd/config/list/list_test.go index cbdab8410..2129c29d9 100644 --- a/internal/cmd/config/list/list_test.go +++ b/internal/cmd/config/list/list_test.go @@ -3,7 +3,7 @@ package list import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) @@ -26,7 +26,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.configData, tt.args.activeProfile); (err != nil) != tt.wantErr { diff --git a/internal/cmd/config/profile/create/create.go b/internal/cmd/config/profile/create/create.go index 608fe85da..bc7a1790f 100644 --- a/internal/cmd/config/profile/create/create.go +++ b/internal/cmd/config/profile/create/create.go @@ -3,7 +3,7 @@ package create import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" @@ -30,7 +30,7 @@ type inputModel struct { Profile string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", profileArg), Short: "Creates a CLI configuration profile", diff --git a/internal/cmd/config/profile/create/create_test.go b/internal/cmd/config/profile/create/create_test.go index a2edcfe47..eaebaac64 100644 --- a/internal/cmd/config/profile/create/create_test.go +++ b/internal/cmd/config/profile/create/create_test.go @@ -67,7 +67,7 @@ func TestParseInput(t *testing.T) { }, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.GlobalFlagModel.Verbosity = globalflags.DebugVerbosity + model.Verbosity = globalflags.DebugVerbosity }), }, { diff --git a/internal/cmd/config/profile/delete/delete.go b/internal/cmd/config/profile/delete/delete.go index 98b7bf2e2..631374a84 100644 --- a/internal/cmd/config/profile/delete/delete.go +++ b/internal/cmd/config/profile/delete/delete.go @@ -3,7 +3,7 @@ package delete import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" @@ -25,7 +25,7 @@ type inputModel struct { Profile string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", profileArg), Short: "Delete a CLI configuration profile", diff --git a/internal/cmd/config/profile/delete/delete_test.go b/internal/cmd/config/profile/delete/delete_test.go index e3ea1bf51..2ca839f58 100644 --- a/internal/cmd/config/profile/delete/delete_test.go +++ b/internal/cmd/config/profile/delete/delete_test.go @@ -65,7 +65,7 @@ func TestParseInput(t *testing.T) { }, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.GlobalFlagModel.Verbosity = globalflags.DebugVerbosity + model.Verbosity = globalflags.DebugVerbosity }), }, { diff --git a/internal/cmd/config/profile/export/export.go b/internal/cmd/config/profile/export/export.go index 9051ea368..631ca975c 100644 --- a/internal/cmd/config/profile/export/export.go +++ b/internal/cmd/config/profile/export/export.go @@ -4,7 +4,8 @@ import ( "fmt" "path/filepath" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { FilePath string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("export %s", profileNameArg), Short: "Exports a CLI configuration profile", diff --git a/internal/cmd/config/profile/import/import.go b/internal/cmd/config/profile/import/import.go index a499f0da0..aede97304 100644 --- a/internal/cmd/config/profile/import/import.go +++ b/internal/cmd/config/profile/import/import.go @@ -2,7 +2,6 @@ package importProfile import ( "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -10,6 +9,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" ) const ( @@ -25,7 +25,7 @@ type inputModel struct { NoSet bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "import", Short: "Imports a CLI configuration profile", diff --git a/internal/cmd/config/profile/list/list.go b/internal/cmd/config/profile/list/list.go index fe90d4619..1707225c1 100644 --- a/internal/cmd/config/profile/list/list.go +++ b/internal/cmd/config/profile/list/list.go @@ -3,7 +3,8 @@ package list import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -19,7 +20,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all CLI configuration profiles", diff --git a/internal/cmd/config/profile/list/list_test.go b/internal/cmd/config/profile/list/list_test.go index 8016b6071..e9d93b147 100644 --- a/internal/cmd/config/profile/list/list_test.go +++ b/internal/cmd/config/profile/list/list_test.go @@ -3,7 +3,8 @@ package list import ( "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) @@ -24,7 +25,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.profiles); (err != nil) != tt.wantErr { diff --git a/internal/cmd/config/profile/profile.go b/internal/cmd/config/profile/profile.go index f6ad03ece..ab13f07cc 100644 --- a/internal/cmd/config/profile/profile.go +++ b/internal/cmd/config/profile/profile.go @@ -3,6 +3,8 @@ package profile import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/create" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/export" @@ -10,14 +12,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/list" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/set" "github.com/stackitcloud/stackit-cli/internal/cmd/config/profile/unset" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "profile", Short: "Manage the CLI configuration profiles", @@ -34,7 +35,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(set.NewCmd(params)) cmd.AddCommand(unset.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/config/profile/set/set.go b/internal/cmd/config/profile/set/set.go index 77101092f..d5436a561 100644 --- a/internal/cmd/config/profile/set/set.go +++ b/internal/cmd/config/profile/set/set.go @@ -3,7 +3,8 @@ package set import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -24,7 +25,7 @@ type inputModel struct { Profile string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("set %s", profileArg), Short: "Set a CLI configuration profile", diff --git a/internal/cmd/config/profile/set/set_test.go b/internal/cmd/config/profile/set/set_test.go index a2ccdbbff..13d23e1be 100644 --- a/internal/cmd/config/profile/set/set_test.go +++ b/internal/cmd/config/profile/set/set_test.go @@ -65,7 +65,7 @@ func TestParseInput(t *testing.T) { }, isValid: true, expectedModel: fixtureInputModel(func(model *inputModel) { - model.GlobalFlagModel.Verbosity = globalflags.DebugVerbosity + model.Verbosity = globalflags.DebugVerbosity }), }, { diff --git a/internal/cmd/config/profile/unset/unset.go b/internal/cmd/config/profile/unset/unset.go index 9c7f923cd..d56fcfa14 100644 --- a/internal/cmd/config/profile/unset/unset.go +++ b/internal/cmd/config/profile/unset/unset.go @@ -3,7 +3,8 @@ package unset import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" @@ -13,7 +14,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "unset", Short: "Unset the current active CLI configuration profile", diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index 7487f8ca3..e6da6ce7c 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -4,7 +4,8 @@ import ( "fmt" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -56,7 +57,7 @@ type inputModel struct { ProjectIdSet bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "set", Short: "Sets CLI configuration options", @@ -238,10 +239,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, // globalflags.Parse uses the flags, and fallsback to config file // To check if projectId was passed, we use the first rather than the second projectIdFromFlag := flags.FlagToStringPointer(p, cmd, globalflags.ProjectIdFlag) - projectIdSet := false - if projectIdFromFlag != nil { - projectIdSet = true - } + projectIdSet := projectIdFromFlag != nil allowedUrlDomainFromFlag := flags.FlagToStringPointer(p, cmd, allowedUrlDomainFlag) allowedUrlDomainFlagValue := flags.FlagToStringValue(p, cmd, allowedUrlDomainFlag) diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index 359248096..a269e867b 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -3,7 +3,8 @@ package unset import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -93,7 +94,7 @@ type inputModel struct { IntakeCustomEndpoint bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "unset", Short: "Unsets CLI configuration options", diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index 12eb2424f..c356af35b 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -309,7 +309,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) for flag, value := range tt.flagValues { stringBool := fmt.Sprintf("%v", value) diff --git a/internal/cmd/curl/curl.go b/internal/cmd/curl/curl.go index 57e823f26..341654dfd 100644 --- a/internal/cmd/curl/curl.go +++ b/internal/cmd/curl/curl.go @@ -11,7 +11,8 @@ import ( "strings" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -46,7 +47,7 @@ type inputModel struct { OutputFile *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("curl %s", urlArg), Short: "Executes an authenticated HTTP request to an endpoint", diff --git a/internal/cmd/curl/curl_test.go b/internal/cmd/curl/curl_test.go index 3fbab3cf4..ce2cd3c37 100644 --- a/internal/cmd/curl/curl_test.go +++ b/internal/cmd/curl/curl_test.go @@ -10,10 +10,11 @@ import ( "strings" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -217,7 +218,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -448,7 +449,7 @@ func TestOutputResponse(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResponse(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/dns.go b/internal/cmd/dns/dns.go index ccba3b66d..216c02dac 100644 --- a/internal/cmd/dns/dns.go +++ b/internal/cmd/dns/dns.go @@ -3,14 +3,14 @@ package dns import ( recordset "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "dns", Short: "Provides functionality for DNS", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(zone.NewCmd(params)) cmd.AddCommand(recordset.NewCmd(params)) } diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 96a5fc8e7..3dcc666e9 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -42,7 +43,7 @@ type inputModel struct { Type dns.CreateRecordSetPayloadTypes } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a DNS record set", diff --git a/internal/cmd/dns/record-set/create/create_test.go b/internal/cmd/dns/record-set/create/create_test.go index b08de66aa..633d7ec60 100644 --- a/internal/cmd/dns/record-set/create/create_test.go +++ b/internal/cmd/dns/record-set/create/create_test.go @@ -6,10 +6,11 @@ import ( "strings" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -349,7 +350,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.zoneLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/record-set/delete/delete.go b/internal/cmd/dns/record-set/delete/delete.go index 4dde11375..dcfa6d300 100644 --- a/internal/cmd/dns/record-set/delete/delete.go +++ b/internal/cmd/dns/record-set/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { RecordSetId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", recordSetIdArg), Short: "Deletes a DNS record set", diff --git a/internal/cmd/dns/record-set/describe/describe.go b/internal/cmd/dns/record-set/describe/describe.go index c84e0ab7a..dabe1d5c1 100644 --- a/internal/cmd/dns/record-set/describe/describe.go +++ b/internal/cmd/dns/record-set/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { RecordSetId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", recordSetIdArg), Short: "Shows details of a DNS record set", diff --git a/internal/cmd/dns/record-set/describe/describe_test.go b/internal/cmd/dns/record-set/describe/describe_test.go index 05d60ebcd..8f7214918 100644 --- a/internal/cmd/dns/record-set/describe/describe_test.go +++ b/internal/cmd/dns/record-set/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -222,7 +223,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.recordSet); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index 309013a2c..88a7f5324 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -6,8 +6,9 @@ import ( "math" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -49,7 +50,7 @@ type inputModel struct { PageSize int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists DNS record sets", diff --git a/internal/cmd/dns/record-set/list/list_test.go b/internal/cmd/dns/record-set/list/list_test.go index 67c60a202..af2dc852b 100644 --- a/internal/cmd/dns/record-set/list/list_test.go +++ b/internal/cmd/dns/record-set/list/list_test.go @@ -8,10 +8,11 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -481,7 +482,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.zoneLabel, tt.args.recordSets); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/record-set/record_set.go b/internal/cmd/dns/record-set/record_set.go index d00152da0..548c66ee6 100644 --- a/internal/cmd/dns/record-set/record_set.go +++ b/internal/cmd/dns/record-set/record_set.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set/list" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/record-set/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "record-set", Short: "Provides functionality for DNS record set", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/dns/record-set/update/update.go b/internal/cmd/dns/record-set/update/update.go index 62f01376f..e3df19d91 100644 --- a/internal/cmd/dns/record-set/update/update.go +++ b/internal/cmd/dns/record-set/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -43,7 +44,7 @@ type inputModel struct { Type *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", recordSetIdArg), Short: "Updates a DNS record set", diff --git a/internal/cmd/dns/record-set/update/update_test.go b/internal/cmd/dns/record-set/update/update_test.go index ccb5df9ee..a85c99a12 100644 --- a/internal/cmd/dns/record-set/update/update_test.go +++ b/internal/cmd/dns/record-set/update/update_test.go @@ -4,7 +4,7 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -253,7 +253,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index a50b2fd73..0611348f9 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { ZoneId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("clone %s", zoneIdArg), Short: "Clones a DNS zone", diff --git a/internal/cmd/dns/zone/clone/clone_test.go b/internal/cmd/dns/zone/clone/clone_test.go index 59d0d13a8..4479eea6e 100644 --- a/internal/cmd/dns/zone/clone/clone_test.go +++ b/internal/cmd/dns/zone/clone/clone_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -244,7 +245,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index 0658ceb8b..3454e654d 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { ContactEmail *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a DNS zone", diff --git a/internal/cmd/dns/zone/create/create_test.go b/internal/cmd/dns/zone/create/create_test.go index 319147da1..bf26e688a 100644 --- a/internal/cmd/dns/zone/create/create_test.go +++ b/internal/cmd/dns/zone/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -292,7 +293,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/delete/delete.go b/internal/cmd/dns/zone/delete/delete.go index a3c8ce8dc..499ba920a 100644 --- a/internal/cmd/dns/zone/delete/delete.go +++ b/internal/cmd/dns/zone/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ZoneId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", zoneIdArg), Short: "Deletes a DNS zone", diff --git a/internal/cmd/dns/zone/describe/describe.go b/internal/cmd/dns/zone/describe/describe.go index 94ccafde1..51d2fcc8e 100644 --- a/internal/cmd/dns/zone/describe/describe.go +++ b/internal/cmd/dns/zone/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ZoneId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", zoneIdArg), Short: "Shows details of a DNS zone", diff --git a/internal/cmd/dns/zone/describe/describe_test.go b/internal/cmd/dns/zone/describe/describe_test.go index a205a5cfd..a5704bfed 100644 --- a/internal/cmd/dns/zone/describe/describe_test.go +++ b/internal/cmd/dns/zone/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -195,7 +196,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.zone); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/list/list.go b/internal/cmd/dns/zone/list/list.go index 132a362c7..1a2640fe4 100644 --- a/internal/cmd/dns/zone/list/list.go +++ b/internal/cmd/dns/zone/list/list.go @@ -6,7 +6,8 @@ import ( "math" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -48,7 +49,7 @@ type inputModel struct { PageSize int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists DNS zones", diff --git a/internal/cmd/dns/zone/list/list_test.go b/internal/cmd/dns/zone/list/list_test.go index 14a7082f9..e270d69f7 100644 --- a/internal/cmd/dns/zone/list/list_test.go +++ b/internal/cmd/dns/zone/list/list_test.go @@ -8,10 +8,11 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -475,7 +476,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.zones); (err != nil) != tt.wantErr { diff --git a/internal/cmd/dns/zone/update/update.go b/internal/cmd/dns/zone/update/update.go index 161b0e338..128f1c3f0 100644 --- a/internal/cmd/dns/zone/update/update.go +++ b/internal/cmd/dns/zone/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -51,7 +52,7 @@ type inputModel struct { ContactEmail *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", zoneIdArg), Short: "Updates a DNS zone", diff --git a/internal/cmd/dns/zone/update/update_test.go b/internal/cmd/dns/zone/update/update_test.go index 4610849bd..b537dc2f6 100644 --- a/internal/cmd/dns/zone/update/update_test.go +++ b/internal/cmd/dns/zone/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -245,7 +246,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/dns/zone/zone.go b/internal/cmd/dns/zone/zone.go index b81a143ff..ecfb1240a 100644 --- a/internal/cmd/dns/zone/zone.go +++ b/internal/cmd/dns/zone/zone.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone/list" "github.com/stackitcloud/stackit-cli/internal/cmd/dns/zone/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "zone", Short: "Provides functionality for DNS zones", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/git/flavor/flavor.go b/internal/cmd/git/flavor/flavor.go index c6f4c512f..ee1700900 100644 --- a/internal/cmd/git/flavor/flavor.go +++ b/internal/cmd/git/flavor/flavor.go @@ -2,14 +2,14 @@ package flavor import ( "github.com/stackitcloud/stackit-cli/internal/cmd/git/flavor/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "flavor", Short: "Provides functionality for STACKIT Git flavors", @@ -21,7 +21,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( list.NewCmd(params), ) diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index fddb9bc26..d28448b6c 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { const limitFlag = "limit" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists instances flavors of STACKIT Git.", diff --git a/internal/cmd/git/flavor/list/list_test.go b/internal/cmd/git/flavor/list/list_test.go index 8c2aca50a..66c4ad264 100644 --- a/internal/cmd/git/flavor/list/list_test.go +++ b/internal/cmd/git/flavor/list/list_test.go @@ -5,10 +5,11 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -190,7 +191,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.flavors); (err != nil) != tt.wantErr { diff --git a/internal/cmd/git/git.go b/internal/cmd/git/git.go index 72605d968..624702686 100644 --- a/internal/cmd/git/git.go +++ b/internal/cmd/git/git.go @@ -3,14 +3,14 @@ package git import ( "github.com/stackitcloud/stackit-cli/internal/cmd/git/flavor" "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "git", Short: "Provides functionality for STACKIT Git", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( instance.NewCmd(params), flavor.NewCmd(params), diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index f63e7499d..f1323fb49 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Acl []string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates STACKIT Git instance", diff --git a/internal/cmd/git/instance/create/create_test.go b/internal/cmd/git/instance/create/create_test.go index 955e5132f..bde352a95 100644 --- a/internal/cmd/git/instance/create/create_test.go +++ b/internal/cmd/git/instance/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -212,7 +213,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/git/instance/delete/delete.go b/internal/cmd/git/instance/delete/delete.go index 8b5bb7ba1..ae9394c83 100644 --- a/internal/cmd/git/instance/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -28,7 +28,7 @@ type inputModel struct { const instanceIdArg = "INSTANCE_ID" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes STACKIT Git instance", diff --git a/internal/cmd/git/instance/delete/delete_test.go b/internal/cmd/git/instance/delete/delete_test.go index 13609df4e..7b6a47fd9 100644 --- a/internal/cmd/git/instance/delete/delete_test.go +++ b/internal/cmd/git/instance/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -105,7 +106,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/git/instance/describe/describe.go b/internal/cmd/git/instance/describe/describe.go index 2d7948b11..e90dd0905 100644 --- a/internal/cmd/git/instance/describe/describe.go +++ b/internal/cmd/git/instance/describe/describe.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -25,7 +25,7 @@ type inputModel struct { const instanceIdArg = "INSTANCE_ID" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Describes STACKIT Git instance", diff --git a/internal/cmd/git/instance/describe/describe_test.go b/internal/cmd/git/instance/describe/describe_test.go index 5e1825565..6a0260f92 100644 --- a/internal/cmd/git/instance/describe/describe_test.go +++ b/internal/cmd/git/instance/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/git" @@ -119,7 +120,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -216,7 +217,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/git/instance/instance.go b/internal/cmd/git/instance/instance.go index b2d66b43a..bd36a1cbd 100644 --- a/internal/cmd/git/instance/instance.go +++ b/internal/cmd/git/instance/instance.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/git/instance/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for STACKIT Git instances", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( list.NewCmd(params), describe.NewCmd(params), diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index 83aa2015b..0f7095199 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -27,7 +27,7 @@ type inputModel struct { const limitFlag = "limit" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all instances of STACKIT Git.", diff --git a/internal/cmd/git/instance/list/list_test.go b/internal/cmd/git/instance/list/list_test.go index 36fa36f10..459165b87 100644 --- a/internal/cmd/git/instance/list/list_test.go +++ b/internal/cmd/git/instance/list/list_test.go @@ -5,10 +5,11 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -190,7 +191,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 06a270b11..784c4389f 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -10,8 +10,9 @@ import ( "os" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -82,7 +83,7 @@ type inputModel struct { NoProgressIndicator *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates images", diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index 2b28c7676..aeefdcdaa 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -6,10 +6,11 @@ import ( "strings" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -391,7 +392,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index d394c0bfd..ffbbf8714 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { const imageIdArg = "IMAGE_ID" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", imageIdArg), Short: "Deletes an image", diff --git a/internal/cmd/image/delete/delete_test.go b/internal/cmd/image/delete/delete_test.go index cd1179f41..200af7e6c 100644 --- a/internal/cmd/image/delete/delete_test.go +++ b/internal/cmd/image/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -114,7 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index 516fa9c99..09f9f86dc 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { const imageIdArg = "IMAGE_ID" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", imageIdArg), Short: "Describes image", diff --git a/internal/cmd/image/describe/describe_test.go b/internal/cmd/image/describe/describe_test.go index 6a76a3200..256ef1c2a 100644 --- a/internal/cmd/image/describe/describe_test.go +++ b/internal/cmd/image/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -129,7 +130,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -226,7 +227,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/image.go b/internal/cmd/image/image.go index b722f2b91..65a0cc2a5 100644 --- a/internal/cmd/image/image.go +++ b/internal/cmd/image/image.go @@ -6,15 +6,15 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/image/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/image/list" "github.com/stackitcloud/stackit-cli/internal/cmd/image/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "image", Short: "Manage server images", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( create.NewCmd(params), list.NewCmd(params), diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index 0ebdf9e95..f30ed8a85 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ const ( limitFlag = "limit" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists images", @@ -142,10 +143,10 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err for i := range items { item := items[i] var ( - architecture string = "n/a" - os string = "n/a" - distro string = "n/a" - version string = "n/a" + architecture = "n/a" + os = "n/a" + distro = "n/a" + version = "n/a" ) if cfg := item.Config; cfg != nil { if v := cfg.Architecture; v != nil { diff --git a/internal/cmd/image/list/list_test.go b/internal/cmd/image/list/list_test.go index 6dbdb119f..7521d2023 100644 --- a/internal/cmd/image/list/list_test.go +++ b/internal/cmd/image/list/list_test.go @@ -5,7 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -213,7 +214,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index 799b594b6..7aa3851c0 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -103,7 +104,7 @@ const ( protectedFlag = "protected" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", imageIdArg), Short: "Updates an image", diff --git a/internal/cmd/image/update/update_test.go b/internal/cmd/image/update/update_test.go index 9df1cf99e..9246bd67b 100644 --- a/internal/cmd/image/update/update_test.go +++ b/internal/cmd/image/update/update_test.go @@ -6,7 +6,8 @@ import ( "strings" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -325,7 +326,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index b7170f539..4ce01cfdf 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -29,7 +30,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a key pair", @@ -81,7 +82,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return fmt.Errorf("create key pair: %w", err) } - return outputResult(params.Printer, model.GlobalFlagModel.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, resp) }, } configureFlags(cmd) diff --git a/internal/cmd/key-pair/create/create_test.go b/internal/cmd/key-pair/create/create_test.go index a14818f72..24418d845 100644 --- a/internal/cmd/key-pair/create/create_test.go +++ b/internal/cmd/key-pair/create/create_test.go @@ -5,7 +5,8 @@ import ( "os" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -188,7 +189,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.item); (err != nil) != tt.wantErr { diff --git a/internal/cmd/key-pair/delete/delete.go b/internal/cmd/key-pair/delete/delete.go index 5d6c5cdb7..70d7e9a8f 100644 --- a/internal/cmd/key-pair/delete/delete.go +++ b/internal/cmd/key-pair/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -24,7 +25,7 @@ type inputModel struct { KeyPairName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", keyPairNameArg), Short: "Deletes a key pair", diff --git a/internal/cmd/key-pair/delete/delete_test.go b/internal/cmd/key-pair/delete/delete_test.go index c5c8dc913..bb45798c9 100644 --- a/internal/cmd/key-pair/delete/delete_test.go +++ b/internal/cmd/key-pair/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -97,7 +98,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/key-pair/describe/describe.go b/internal/cmd/key-pair/describe/describe.go index 36addd3b8..40f450949 100644 --- a/internal/cmd/key-pair/describe/describe.go +++ b/internal/cmd/key-pair/describe/describe.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -36,7 +37,7 @@ type inputModel struct { PublicKey bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", keyPairNameArg), Short: "Describes a key pair", diff --git a/internal/cmd/key-pair/describe/describe_test.go b/internal/cmd/key-pair/describe/describe_test.go index 7af2ff2e8..b94ae4ece 100644 --- a/internal/cmd/key-pair/describe/describe_test.go +++ b/internal/cmd/key-pair/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -164,7 +165,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showOnlyPublicKey, tt.args.keyPair); (err != nil) != tt.wantErr { diff --git a/internal/cmd/key-pair/key-pair.go b/internal/cmd/key-pair/key-pair.go index 44cc1fef8..e435a27df 100644 --- a/internal/cmd/key-pair/key-pair.go +++ b/internal/cmd/key-pair/key-pair.go @@ -2,17 +2,17 @@ package keypair import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/create" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/list" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "key-pair", Short: "Provides functionality for SSH key pairs", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/key-pair/list/list.go b/internal/cmd/key-pair/list/list.go index eecec55f0..3820eb038 100644 --- a/internal/cmd/key-pair/list/list.go +++ b/internal/cmd/key-pair/list/list.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -32,7 +33,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all key pairs", diff --git a/internal/cmd/key-pair/list/list_test.go b/internal/cmd/key-pair/list/list_test.go index bc9da640f..2ceb0d426 100644 --- a/internal/cmd/key-pair/list/list_test.go +++ b/internal/cmd/key-pair/list/list_test.go @@ -5,7 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -176,7 +177,7 @@ func Test_outputResult(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) if err := outputResult(p, tt.args.outputFormat, tt.args.keyPairs); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index 10bce6606..450329082 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -28,7 +29,7 @@ type inputModel struct { KeyPairName *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", keyPairNameArg), Short: "Updates a key pair", @@ -108,7 +109,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) inputM func outputResult(p *print.Printer, model inputModel, keyPair iaas.Keypair) error { var outputFormat string if model.GlobalFlagModel != nil { - outputFormat = model.GlobalFlagModel.OutputFormat + outputFormat = model.OutputFormat } return p.OutputResult(outputFormat, keyPair, func() error { diff --git a/internal/cmd/key-pair/update/update_test.go b/internal/cmd/key-pair/update/update_test.go index 2f5432deb..7f24c935e 100644 --- a/internal/cmd/key-pair/update/update_test.go +++ b/internal/cmd/key-pair/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -110,7 +111,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -209,7 +210,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.keyPair); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index a6b2adc73..0ebaaee16 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -5,9 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ var ( xRequestId = uuid.NewString() ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Load Balancer", diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index e2cd2b37c..0c43431f1 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { LoadBalancerName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", loadBalancerNameArg), Short: "Deletes a Load Balancer", diff --git a/internal/cmd/load-balancer/describe/describe.go b/internal/cmd/load-balancer/describe/describe.go index 5879fb8f3..5cdffce6a 100644 --- a/internal/cmd/load-balancer/describe/describe.go +++ b/internal/cmd/load-balancer/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { LoadBalancerName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", loadBalancerNameArg), Short: "Shows details of a Load Balancer", diff --git a/internal/cmd/load-balancer/describe/describe_test.go b/internal/cmd/load-balancer/describe/describe_test.go index a7b9a4e36..5dcbfe446 100644 --- a/internal/cmd/load-balancer/describe/describe_test.go +++ b/internal/cmd/load-balancer/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.loadBalancer); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index b7bfac451..1149ae311 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -110,7 +111,7 @@ var ( } ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "generate-payload", Short: "Generates a payload to create/update a Load Balancer", diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index 516d41c92..ca20bc950 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -293,7 +294,7 @@ func TestOutputCreateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputCreateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { @@ -327,7 +328,7 @@ func TestOutputUpdateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputUpdateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/list/list.go b/internal/cmd/load-balancer/list/list.go index a56de2041..3b14b5ca3 100644 --- a/internal/cmd/load-balancer/list/list.go +++ b/internal/cmd/load-balancer/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Load Balancers", diff --git a/internal/cmd/load-balancer/list/list_test.go b/internal/cmd/load-balancer/list/list_test.go index ee948a6f3..4d6decfa3 100644 --- a/internal/cmd/load-balancer/list/list_test.go +++ b/internal/cmd/load-balancer/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -182,7 +183,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.loadBalancers); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/load_balancer.go b/internal/cmd/load-balancer/load_balancer.go index 4a2876453..25a8f34ae 100644 --- a/internal/cmd/load-balancer/load_balancer.go +++ b/internal/cmd/load-balancer/load_balancer.go @@ -10,7 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/quota" targetpool "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -18,7 +18,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "load-balancer", Aliases: []string{"lb"}, @@ -31,7 +31,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index ece99c961..0aa0c8532 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Password *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "add", Short: "Adds observability credentials to Load Balancer", diff --git a/internal/cmd/load-balancer/observability-credentials/add/add_test.go b/internal/cmd/load-balancer/observability-credentials/add/add_test.go index b1e71cf16..f36d7e00c 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add_test.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -193,7 +194,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index 5a521bb9f..ce2df7311 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,7 +23,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "cleanup", Short: "Deletes observability credentials unused by any Load Balancer", diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete.go b/internal/cmd/load-balancer/observability-credentials/delete/delete.go index a26da465f..238a9fcfb 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { CredentialsRef string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsRefArg), Short: "Deletes observability credentials for Load Balancer", diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe.go b/internal/cmd/load-balancer/observability-credentials/describe/describe.go index d0d741a08..68a4af99c 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { CredentialsRef string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsRefArg), Short: "Shows details of observability credentials for Load Balancer", diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go index 69cfd3bef..1060baeab 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -200,7 +201,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 537edc93f..1b58291a6 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Unused bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists observability credentials for Load Balancer", diff --git a/internal/cmd/load-balancer/observability-credentials/list/list_test.go b/internal/cmd/load-balancer/observability-credentials/list/list_test.go index 475f4bf8f..85b3650fa 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list_test.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" @@ -253,7 +254,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/observability-credentials/observability-credentials.go b/internal/cmd/load-balancer/observability-credentials/observability-credentials.go index 03613a8de..7abc80f62 100644 --- a/internal/cmd/load-balancer/observability-credentials/observability-credentials.go +++ b/internal/cmd/load-balancer/observability-credentials/observability-credentials.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/observability-credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/observability-credentials/list" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/observability-credentials/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "observability-credentials", Short: "Provides functionality for Load Balancer observability credentials", @@ -27,7 +27,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(add.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/load-balancer/observability-credentials/update/update.go b/internal/cmd/load-balancer/observability-credentials/update/update.go index 29761043e..dfa4e6f1a 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -46,7 +47,7 @@ type inputModel struct { Password *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", credentialsRefArg), Short: "Updates observability credentials for Load Balancer", diff --git a/internal/cmd/load-balancer/quota/quota.go b/internal/cmd/load-balancer/quota/quota.go index 0549fe177..9539612f9 100644 --- a/internal/cmd/load-balancer/quota/quota.go +++ b/internal/cmd/load-balancer/quota/quota.go @@ -5,7 +5,8 @@ import ( "fmt" "strconv" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +22,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "quota", Short: "Shows the configured Load Balancer quota", diff --git a/internal/cmd/load-balancer/quota/quota_test.go b/internal/cmd/load-balancer/quota/quota_test.go index 634da62e0..1a3ccae0a 100644 --- a/internal/cmd/load-balancer/quota/quota_test.go +++ b/internal/cmd/load-balancer/quota/quota_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -158,7 +159,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.quota); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 1612628fd..8bd1032ea 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { IP string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("add-target %s", ipArg), Short: "Adds a target to a target pool", diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go index 7d7b1799f..16ebc3096 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -261,7 +262,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index 616323663..dadfab47d 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -6,8 +6,9 @@ import ( "strconv" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { LBName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", targetPoolNameArg), Short: "Shows details of a target pool in a Load Balancer", diff --git a/internal/cmd/load-balancer/target-pool/describe/describe_test.go b/internal/cmd/load-balancer/target-pool/describe/describe_test.go index d59a0fe6b..7c1a7535a 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe_test.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" @@ -137,7 +138,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { @@ -245,7 +246,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.targetPool, tt.args.listener); (err != nil) != tt.wantErr { diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index 923521b40..c0550ade6 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { IP string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("remove-target %s", ipArg), Short: "Removes a target from a target pool", diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go index 14bb4fadc..e09747421 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -250,7 +251,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { diff --git a/internal/cmd/load-balancer/target-pool/target_pool.go b/internal/cmd/load-balancer/target-pool/target_pool.go index da2e0f7fa..7e40f76e7 100644 --- a/internal/cmd/load-balancer/target-pool/target_pool.go +++ b/internal/cmd/load-balancer/target-pool/target_pool.go @@ -4,14 +4,14 @@ import ( addtarget "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool/add-target" "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool/describe" removetarget "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer/target-pool/remove-target" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "target-pool", Short: "Provides functionality for target pools", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(addtarget.NewCmd(params)) cmd.AddCommand(removetarget.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/load-balancer/update/update.go b/internal/cmd/load-balancer/update/update.go index 47c4e5d80..7a3184e1c 100644 --- a/internal/cmd/load-balancer/update/update.go +++ b/internal/cmd/load-balancer/update/update.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Payload loadbalancer.UpdateLoadBalancerPayload } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", loadBalancerNameArg), Short: "Updates a Load Balancer", diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index 1df3832a2..5c2451e73 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a LogMe instance", diff --git a/internal/cmd/logme/credentials/create/create_test.go b/internal/cmd/logme/credentials/create/create_test.go index a266eaac7..b2ecffe1f 100644 --- a/internal/cmd/logme/credentials/create/create_test.go +++ b/internal/cmd/logme/credentials/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -191,7 +192,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/credentials/credentials.go b/internal/cmd/logme/credentials/credentials.go index 9f7cd2d7e..51f821a68 100644 --- a/internal/cmd/logme/credentials/credentials.go +++ b/internal/cmd/logme/credentials/credentials.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for LogMe credentials", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/logme/credentials/delete/delete.go b/internal/cmd/logme/credentials/delete/delete.go index 0766f8e5a..3254e6f32 100644 --- a/internal/cmd/logme/credentials/delete/delete.go +++ b/internal/cmd/logme/credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a LogMe instance", diff --git a/internal/cmd/logme/credentials/describe/describe.go b/internal/cmd/logme/credentials/describe/describe.go index 7ae74bf7d..670b064c0 100644 --- a/internal/cmd/logme/credentials/describe/describe.go +++ b/internal/cmd/logme/credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a LogMe instance", diff --git a/internal/cmd/logme/credentials/describe/describe_test.go b/internal/cmd/logme/credentials/describe/describe_test.go index 324b92dd6..c2a4c9125 100644 --- a/internal/cmd/logme/credentials/describe/describe_test.go +++ b/internal/cmd/logme/credentials/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -223,7 +224,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/credentials/list/list.go b/internal/cmd/logme/credentials/list/list.go index eda5d8917..ac2660747 100644 --- a/internal/cmd/logme/credentials/list/list.go +++ b/internal/cmd/logme/credentials/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a LogMe instance", diff --git a/internal/cmd/logme/credentials/list/list_test.go b/internal/cmd/logme/credentials/list/list_test.go index 73a86bad3..30926c183 100644 --- a/internal/cmd/logme/credentials/list/list_test.go +++ b/internal/cmd/logme/credentials/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -202,7 +203,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index fb5ea3e60..f3b1118c1 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a LogMe instance", diff --git a/internal/cmd/logme/instance/create/create_test.go b/internal/cmd/logme/instance/create/create_test.go index 23616f5f8..73558ab91 100644 --- a/internal/cmd/logme/instance/create/create_test.go +++ b/internal/cmd/logme/instance/create/create_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -437,7 +438,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/delete/delete.go b/internal/cmd/logme/instance/delete/delete.go index f606a2cee..f804e3b6d 100644 --- a/internal/cmd/logme/instance/delete/delete.go +++ b/internal/cmd/logme/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a LogMe instance", diff --git a/internal/cmd/logme/instance/describe/describe.go b/internal/cmd/logme/instance/describe/describe.go index 7b73a108c..2c579779c 100644 --- a/internal/cmd/logme/instance/describe/describe.go +++ b/internal/cmd/logme/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a LogMe instance", diff --git a/internal/cmd/logme/instance/describe/describe_test.go b/internal/cmd/logme/instance/describe/describe_test.go index 3e7967085..c20d5814f 100644 --- a/internal/cmd/logme/instance/describe/describe_test.go +++ b/internal/cmd/logme/instance/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/instance.go b/internal/cmd/logme/instance/instance.go index aa86b4f08..184c1b27b 100644 --- a/internal/cmd/logme/instance/instance.go +++ b/internal/cmd/logme/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for LogMe instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index ff5c8c55c..20efce498 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all LogMe instances", diff --git a/internal/cmd/logme/instance/list/list_test.go b/internal/cmd/logme/instance/list/list_test.go index 10c36c2ba..5104d046a 100644 --- a/internal/cmd/logme/instance/list/list_test.go +++ b/internal/cmd/logme/instance/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/logme/instance/update/update.go b/internal/cmd/logme/instance/update/update.go index 97e016723..6d503a394 100644 --- a/internal/cmd/logme/instance/update/update.go +++ b/internal/cmd/logme/instance/update/update.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a LogMe instance", diff --git a/internal/cmd/logme/instance/update/update_test.go b/internal/cmd/logme/instance/update/update_test.go index dc3518985..8dd59292c 100644 --- a/internal/cmd/logme/instance/update/update_test.go +++ b/internal/cmd/logme/instance/update/update_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -268,7 +269,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/logme/logme.go b/internal/cmd/logme/logme.go index a4e3f4715..a1371d7c1 100644 --- a/internal/cmd/logme/logme.go +++ b/internal/cmd/logme/logme.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/logme/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/logme/plans" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "logme", Short: "Provides functionality for LogMe", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(plans.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index 227900628..5b1597bf4 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all LogMe service plans", diff --git a/internal/cmd/logme/plans/plans_test.go b/internal/cmd/logme/plans/plans_test.go index 0f93fa3a9..985b0a388 100644 --- a/internal/cmd/logme/plans/plans_test.go +++ b/internal/cmd/logme/plans/plans_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index 274b8b740..9ac022e6f 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a MariaDB instance", diff --git a/internal/cmd/mariadb/credentials/create/create_test.go b/internal/cmd/mariadb/credentials/create/create_test.go index 3ab58f4c3..d89804299 100644 --- a/internal/cmd/mariadb/credentials/create/create_test.go +++ b/internal/cmd/mariadb/credentials/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -192,7 +193,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/credentials/credentials.go b/internal/cmd/mariadb/credentials/credentials.go index e23c3887f..7f216ad4b 100644 --- a/internal/cmd/mariadb/credentials/credentials.go +++ b/internal/cmd/mariadb/credentials/credentials.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for MariaDB credentials", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/mariadb/credentials/delete/delete.go b/internal/cmd/mariadb/credentials/delete/delete.go index 8b8934e36..830ebd840 100644 --- a/internal/cmd/mariadb/credentials/delete/delete.go +++ b/internal/cmd/mariadb/credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a MariaDB instance", diff --git a/internal/cmd/mariadb/credentials/describe/describe.go b/internal/cmd/mariadb/credentials/describe/describe.go index 121a9228b..368e13e88 100644 --- a/internal/cmd/mariadb/credentials/describe/describe.go +++ b/internal/cmd/mariadb/credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a MariaDB instance", diff --git a/internal/cmd/mariadb/credentials/describe/describe_test.go b/internal/cmd/mariadb/credentials/describe/describe_test.go index 7f233f5c4..554add42c 100644 --- a/internal/cmd/mariadb/credentials/describe/describe_test.go +++ b/internal/cmd/mariadb/credentials/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -224,7 +225,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index 2ba92d3e0..aa79aadf7 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a MariaDB instance", diff --git a/internal/cmd/mariadb/credentials/list/list_test.go b/internal/cmd/mariadb/credentials/list/list_test.go index 7b7b041cb..fbc904da7 100644 --- a/internal/cmd/mariadb/credentials/list/list_test.go +++ b/internal/cmd/mariadb/credentials/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -203,7 +204,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index e55787006..2793da086 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a MariaDB instance", diff --git a/internal/cmd/mariadb/instance/create/create_test.go b/internal/cmd/mariadb/instance/create/create_test.go index 86cfb1daa..8001a4b2a 100644 --- a/internal/cmd/mariadb/instance/create/create_test.go +++ b/internal/cmd/mariadb/instance/create/create_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -438,7 +439,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/delete/delete.go b/internal/cmd/mariadb/instance/delete/delete.go index 2f192e7c3..3e59476f6 100644 --- a/internal/cmd/mariadb/instance/delete/delete.go +++ b/internal/cmd/mariadb/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a MariaDB instance", diff --git a/internal/cmd/mariadb/instance/describe/describe.go b/internal/cmd/mariadb/instance/describe/describe.go index d06c7233c..0757fbe74 100644 --- a/internal/cmd/mariadb/instance/describe/describe.go +++ b/internal/cmd/mariadb/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a MariaDB instance", diff --git a/internal/cmd/mariadb/instance/describe/describe_test.go b/internal/cmd/mariadb/instance/describe/describe_test.go index 4aa17ccc9..d8b5bda20 100644 --- a/internal/cmd/mariadb/instance/describe/describe_test.go +++ b/internal/cmd/mariadb/instance/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -197,7 +198,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/instance.go b/internal/cmd/mariadb/instance/instance.go index 3b16f4864..e46e875f8 100644 --- a/internal/cmd/mariadb/instance/instance.go +++ b/internal/cmd/mariadb/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for MariaDB instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 6bf70a322..5c13db105 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all MariaDB instances", diff --git a/internal/cmd/mariadb/instance/list/list_test.go b/internal/cmd/mariadb/instance/list/list_test.go index 092af5002..ff8f033cf 100644 --- a/internal/cmd/mariadb/instance/list/list_test.go +++ b/internal/cmd/mariadb/instance/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -179,7 +180,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mariadb/instance/update/update.go b/internal/cmd/mariadb/instance/update/update.go index bf16d188d..6aa6f701d 100644 --- a/internal/cmd/mariadb/instance/update/update.go +++ b/internal/cmd/mariadb/instance/update/update.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a MariaDB instance", diff --git a/internal/cmd/mariadb/instance/update/update_test.go b/internal/cmd/mariadb/instance/update/update_test.go index 5fb7369c5..d2fba4758 100644 --- a/internal/cmd/mariadb/instance/update/update_test.go +++ b/internal/cmd/mariadb/instance/update/update_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -279,7 +280,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/mariadb/mariadb.go b/internal/cmd/mariadb/mariadb.go index 602949253..5f8c41185 100644 --- a/internal/cmd/mariadb/mariadb.go +++ b/internal/cmd/mariadb/mariadb.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb/plans" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "mariadb", Short: "Provides functionality for MariaDB", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(plans.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index a09b9cb56..5a6d9f017 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all MariaDB service plans", diff --git a/internal/cmd/mariadb/plans/plans_test.go b/internal/cmd/mariadb/plans/plans_test.go index 411579760..3c8cf58fb 100644 --- a/internal/cmd/mariadb/plans/plans_test.go +++ b/internal/cmd/mariadb/plans/plans_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -179,7 +180,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/backup.go b/internal/cmd/mongodbflex/backup/backup.go index af716446b..e9b3e79d1 100644 --- a/internal/cmd/mongodbflex/backup/backup.go +++ b/internal/cmd/mongodbflex/backup/backup.go @@ -7,14 +7,14 @@ import ( restorejobs "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/backup/restore-jobs" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/backup/schedule" updateschedule "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/backup/update-schedule" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for MongoDB Flex instance backups", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(updateschedule.NewCmd(params)) cmd.AddCommand(schedule.NewCmd(params)) cmd.AddCommand(restore.NewCmd(params)) diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index 9f4ebe522..17bbe9b40 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { BackupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Shows details of a backup for a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/backup/describe/describe_test.go b/internal/cmd/mongodbflex/backup/describe/describe_test.go index f83ef4d0a..d621f858b 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe_test.go +++ b/internal/cmd/mongodbflex/backup/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -222,7 +223,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.restoreStatus, tt.args.backup); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/list/list.go b/internal/cmd/mongodbflex/backup/list/list.go index 5287336ed..b75955b7a 100644 --- a/internal/cmd/mongodbflex/backup/list/list.go +++ b/internal/cmd/mongodbflex/backup/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all backups which are available for a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/backup/list/list_test.go b/internal/cmd/mongodbflex/backup/list/list_test.go index a6d13d8e4..253b82936 100644 --- a/internal/cmd/mongodbflex/backup/list/list_test.go +++ b/internal/cmd/mongodbflex/backup/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -217,7 +218,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.backups, tt.args.restoreJobs); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index c078ed2cd..1822b4583 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "restore-jobs", Short: "Lists all restore jobs which have been run for a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go index 7b6419bbe..816148d5a 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -207,7 +208,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.restoreJobs); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index d853f953b..f7e5feb79 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Timestamp string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "restore", Short: "Restores a MongoDB Flex instance from a backup", diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 3a34a9e58..614b42082 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "schedule", Short: "Shows details of the backup schedule and retention policy of a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go index ab81c09e8..a922ca4b6 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule_test.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -183,7 +184,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index 111ba4281..ce4dce055 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -5,8 +5,9 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -47,7 +48,7 @@ type inputModel struct { MonthlySnapshotRetentionMonths *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update-schedule", Short: "Updates the backup schedule and retention policy for a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 39fe64514..6a7c181e6 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -5,8 +5,9 @@ import ( "errors" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -55,7 +56,7 @@ type inputModel struct { Type *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/instance/create/create_test.go b/internal/cmd/mongodbflex/instance/create/create_test.go index 794b5b9fd..acb37784c 100644 --- a/internal/cmd/mongodbflex/instance/create/create_test.go +++ b/internal/cmd/mongodbflex/instance/create/create_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -533,7 +534,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.createInstanceResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index 5ae1da16a..f5316c8fe 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/instance/describe/describe.go b/internal/cmd/mongodbflex/instance/describe/describe.go index 7738ec0fd..c20de2606 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe.go +++ b/internal/cmd/mongodbflex/instance/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/instance/describe/describe_test.go b/internal/cmd/mongodbflex/instance/describe/describe_test.go index b63b62933..976e08e7f 100644 --- a/internal/cmd/mongodbflex/instance/describe/describe_test.go +++ b/internal/cmd/mongodbflex/instance/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -200,7 +201,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/instance/instance.go b/internal/cmd/mongodbflex/instance/instance.go index a4cc5b231..ee48a0632 100644 --- a/internal/cmd/mongodbflex/instance/instance.go +++ b/internal/cmd/mongodbflex/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for MongoDB Flex instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/mongodbflex/instance/list/list.go b/internal/cmd/mongodbflex/instance/list/list.go index 1a7d398c7..74ac6bcb0 100644 --- a/internal/cmd/mongodbflex/instance/list/list.go +++ b/internal/cmd/mongodbflex/instance/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all MongoDB Flex instances", diff --git a/internal/cmd/mongodbflex/instance/list/list_test.go b/internal/cmd/mongodbflex/instance/list/list_test.go index 7ec79019f..d91c779f1 100644 --- a/internal/cmd/mongodbflex/instance/list/list_test.go +++ b/internal/cmd/mongodbflex/instance/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -184,7 +185,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instanceList); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index ff1d61c39..fa160df07 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -53,7 +54,7 @@ type inputModel struct { Type *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a MongoDB Flex instance", diff --git a/internal/cmd/mongodbflex/instance/update/update_test.go b/internal/cmd/mongodbflex/instance/update/update_test.go index f9bb2dffa..77df60874 100644 --- a/internal/cmd/mongodbflex/instance/update/update_test.go +++ b/internal/cmd/mongodbflex/instance/update/update_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -287,7 +288,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -624,7 +625,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/mongodbflex.go b/internal/cmd/mongodbflex/mongodbflex.go index 50ba29f78..3376477a3 100644 --- a/internal/cmd/mongodbflex/mongodbflex.go +++ b/internal/cmd/mongodbflex/mongodbflex.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/options" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "mongodbflex", Short: "Provides functionality for MongoDB Flex", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(user.NewCmd(params)) cmd.AddCommand(options.NewCmd(params)) diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 9d65ea4ef..73febf6cf 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -45,7 +45,7 @@ type flavorStorages struct { Storages *mongodbflex.ListStoragesResponse `json:"storages"` } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists MongoDB Flex options", diff --git a/internal/cmd/mongodbflex/options/options_test.go b/internal/cmd/mongodbflex/options/options_test.go index 57f549b0b..3b42e4319 100644 --- a/internal/cmd/mongodbflex/options/options_test.go +++ b/internal/cmd/mongodbflex/options/options_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -254,7 +255,7 @@ func TestBuildAndExecuteRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := &print.Printer{} - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) p.Cmd = cmd client := &mongoDBFlexClientMocked{ listFlavorsFails: tt.listFlavorsFails, @@ -369,7 +370,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.inputModel, tt.args.flavors, tt.args.versions, tt.args.storages); (err != nil) != tt.wantErr { @@ -418,7 +419,7 @@ func TestOutputResultAsTable(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResultAsTable(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index cfeb7b6ba..b1d32aed9 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -38,7 +39,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a MongoDB Flex user", diff --git a/internal/cmd/mongodbflex/user/create/create_test.go b/internal/cmd/mongodbflex/user/create/create_test.go index 7e210559e..e075bd29a 100644 --- a/internal/cmd/mongodbflex/user/create/create_test.go +++ b/internal/cmd/mongodbflex/user/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -235,7 +236,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/delete/delete.go b/internal/cmd/mongodbflex/user/delete/delete.go index b945f5ad3..54f28cdc2 100644 --- a/internal/cmd/mongodbflex/user/delete/delete.go +++ b/internal/cmd/mongodbflex/user/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a MongoDB Flex user", diff --git a/internal/cmd/mongodbflex/user/describe/describe.go b/internal/cmd/mongodbflex/user/describe/describe.go index 5d9a34b3a..038894cfc 100644 --- a/internal/cmd/mongodbflex/user/describe/describe.go +++ b/internal/cmd/mongodbflex/user/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a MongoDB Flex user", diff --git a/internal/cmd/mongodbflex/user/describe/describe_test.go b/internal/cmd/mongodbflex/user/describe/describe_test.go index 604758d1d..8ba06f13d 100644 --- a/internal/cmd/mongodbflex/user/describe/describe_test.go +++ b/internal/cmd/mongodbflex/user/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -227,7 +228,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceResponseUser); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/list/list.go b/internal/cmd/mongodbflex/user/list/list.go index 94fcfcdd1..57d8530b1 100644 --- a/internal/cmd/mongodbflex/user/list/list.go +++ b/internal/cmd/mongodbflex/user/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all MongoDB Flex users of an instance", diff --git a/internal/cmd/mongodbflex/user/list/list_test.go b/internal/cmd/mongodbflex/user/list/list_test.go index d480ed651..aa7b42dd6 100644 --- a/internal/cmd/mongodbflex/user/list/list_test.go +++ b/internal/cmd/mongodbflex/user/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -201,7 +202,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.users); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index cc0fb810d..e92c189db 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reset-password %s", userIdArg), Short: "Resets the password of a MongoDB Flex user", diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go index 0836c789e..75a467eb9 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -229,7 +230,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.userLabel, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index a8fcfee3e..caa91c059 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", userIdArg), Short: "Updates a MongoDB Flex user", diff --git a/internal/cmd/mongodbflex/user/user.go b/internal/cmd/mongodbflex/user/user.go index 0e0600ed6..ed76dffbf 100644 --- a/internal/cmd/mongodbflex/user/user.go +++ b/internal/cmd/mongodbflex/user/user.go @@ -7,14 +7,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user/list" resetpassword "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user/reset-password" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex/user/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for MongoDB Flex users", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 7268d0a2d..15e9b8192 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -6,7 +6,8 @@ import ( "os" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -70,7 +71,7 @@ type NetworkAreaResponses struct { RegionalArea *iaas.RegionalArea `json:"regional_area"` } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/create/create_test.go b/internal/cmd/network-area/create/create_test.go index 9bfadd260..b903ccbba 100644 --- a/internal/cmd/network-area/create/create_test.go +++ b/internal/cmd/network-area/create/create_test.go @@ -6,7 +6,8 @@ import ( "strings" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -375,7 +376,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.orgLabel, tt.args.responses); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index 0e42d5883..becf4524c 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -34,7 +35,7 @@ type inputModel struct { AreaId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", areaIdArg), Short: "Deletes a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index 4fdf257c5..f51fa40a5 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -34,7 +35,7 @@ type inputModel struct { ShowAttachedProjects bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", areaIdArg), Short: "Shows details of a STACKIT Network Area", diff --git a/internal/cmd/network-area/describe/describe_test.go b/internal/cmd/network-area/describe/describe_test.go index 70e63e145..d4cf7379c 100644 --- a/internal/cmd/network-area/describe/describe_test.go +++ b/internal/cmd/network-area/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkArea, tt.args.attachedProjects); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index e37822602..a7688648e 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all STACKIT Network Areas (SNA) of an organization", diff --git a/internal/cmd/network-area/list/list_test.go b/internal/cmd/network-area/list/list_test.go index 41c51e380..2524bb8c8 100644 --- a/internal/cmd/network-area/list/list_test.go +++ b/internal/cmd/network-area/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreas); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index 33610c045..a77852fb3 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -31,7 +32,7 @@ type inputModel struct { NetworkRange *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a network range in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/network-range/create/create_test.go b/internal/cmd/network-area/network-range/create/create_test.go index e5b01e224..913e66b60 100644 --- a/internal/cmd/network-area/network-range/create/create_test.go +++ b/internal/cmd/network-area/network-range/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -212,7 +213,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.networkRange); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index 4d3a94c5d..82e697109 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -32,7 +33,7 @@ type inputModel struct { NetworkRangeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", networkRangeIdArg), Short: "Deletes a network range in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/network-range/delete/delete_test.go b/internal/cmd/network-area/network-range/delete/delete_test.go index 79c1ad52c..a087681a8 100644 --- a/internal/cmd/network-area/network-range/delete/delete_test.go +++ b/internal/cmd/network-area/network-range/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -164,7 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index ee13560b9..1abd718b9 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -32,7 +33,7 @@ type inputModel struct { NetworkRangeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", networkRangeIdArg), Short: "Shows details of a network range in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/network-range/describe/describe_test.go b/internal/cmd/network-area/network-range/describe/describe_test.go index 6e519fef8..ede21b094 100644 --- a/internal/cmd/network-area/network-range/describe/describe_test.go +++ b/internal/cmd/network-area/network-range/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -165,7 +166,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -268,7 +269,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkRange); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index 2fec7b330..42d57c669 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { NetworkAreaId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all network ranges in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/network-range/list/list_test.go b/internal/cmd/network-area/network-range/list/list_test.go index 67044ee06..80ab8a7c4 100644 --- a/internal/cmd/network-area/network-range/list/list_test.go +++ b/internal/cmd/network-area/network-range/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -213,7 +214,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkRanges); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/network-range/network_range.go b/internal/cmd/network-area/network-range/network_range.go index 1c52227a8..adf53b654 100644 --- a/internal/cmd/network-area/network-range/network_range.go +++ b/internal/cmd/network-area/network-range/network_range.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-range", Aliases: []string{"range"}, @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/network-area/network_area.go b/internal/cmd/network-area/network_area.go index 637a7af0e..ff09d229e 100644 --- a/internal/cmd/network-area/network_area.go +++ b/internal/cmd/network-area/network_area.go @@ -9,14 +9,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-area", Short: "Provides functionality for STACKIT Network Area (SNA)", @@ -28,7 +28,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/network-area/region/create/create.go b/internal/cmd/network-area/region/create/create.go index a4cda53d6..4adf5cee9 100644 --- a/internal/cmd/network-area/region/create/create.go +++ b/internal/cmd/network-area/region/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -44,7 +45,7 @@ type inputModel struct { IPv4TransferNetwork string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a new regional configuration for a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/region/create/create_test.go b/internal/cmd/network-area/region/create/create_test.go index 1f8cacef2..cf92c59c3 100644 --- a/internal/cmd/network-area/region/create/create_test.go +++ b/internal/cmd/network-area/region/create/create_test.go @@ -6,10 +6,11 @@ import ( "strings" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -296,7 +297,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/region/delete/delete.go b/internal/cmd/network-area/region/delete/delete.go index 37f1f8bb0..ff31aeaa2 100644 --- a/internal/cmd/network-area/region/delete/delete.go +++ b/internal/cmd/network-area/region/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { NetworkAreaId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "delete", Short: "Deletes a regional configuration for a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/region/describe/describe.go b/internal/cmd/network-area/region/describe/describe.go index 71e4f5c31..131d0f031 100644 --- a/internal/cmd/network-area/region/describe/describe.go +++ b/internal/cmd/network-area/region/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { NetworkAreaId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "describe", Short: "Describes a regional configuration for a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/region/describe/describe_test.go b/internal/cmd/network-area/region/describe/describe_test.go index 7d06c1794..ea4beee77 100644 --- a/internal/cmd/network-area/region/describe/describe_test.go +++ b/internal/cmd/network-area/region/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -203,7 +204,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.areaId, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/region/list/list.go b/internal/cmd/network-area/region/list/list.go index 44149c9af..c74f79848 100644 --- a/internal/cmd/network-area/region/list/list.go +++ b/internal/cmd/network-area/region/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -30,7 +31,7 @@ type inputModel struct { NetworkAreaId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all configured regions for a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/region/list/list_test.go b/internal/cmd/network-area/region/list/list_test.go index bb7b3f15b..f3cbc6ec8 100644 --- a/internal/cmd/network-area/region/list/list_test.go +++ b/internal/cmd/network-area/region/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -210,7 +211,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/region/region.go b/internal/cmd/network-area/region/region.go index 99edcace2..d21eaa106 100644 --- a/internal/cmd/network-area/region/region.go +++ b/internal/cmd/network-area/region/region.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "region", Short: "Provides functionality for regional configuration of STACKIT Network Area (SNA)", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/network-area/region/update/update.go b/internal/cmd/network-area/region/update/update.go index 9018cb175..1d1f64bf7 100644 --- a/internal/cmd/network-area/region/update/update.go +++ b/internal/cmd/network-area/region/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { IPv4MinPrefixLength *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates a existing regional configuration for a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/region/update/update_test.go b/internal/cmd/network-area/region/update/update_test.go index 73482555d..90535d384 100644 --- a/internal/cmd/network-area/region/update/update_test.go +++ b/internal/cmd/network-area/region/update/update_test.go @@ -6,10 +6,11 @@ import ( "strings" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -254,7 +255,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index c8950144e..d0ad72a2b 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -6,7 +6,8 @@ import ( "net" "os" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -58,7 +59,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a static route in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/route/create/create_test.go b/internal/cmd/network-area/route/create/create_test.go index b3d577b80..497c31a66 100644 --- a/internal/cmd/network-area/route/create/create_test.go +++ b/internal/cmd/network-area/route/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -287,7 +288,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.route); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index b888fb6d5..6292f3cd7 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -32,7 +33,7 @@ type inputModel struct { RouteId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", routeIdArg), Short: "Deletes a static route in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/route/delete/delete_test.go b/internal/cmd/network-area/route/delete/delete_test.go index d34c268a7..6352be04a 100644 --- a/internal/cmd/network-area/route/delete/delete_test.go +++ b/internal/cmd/network-area/route/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -164,7 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index b650e5964..2a7e7e4f1 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -33,7 +34,7 @@ type inputModel struct { RouteId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", routeIdArg), Short: "Shows details of a static route in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/route/describe/describe_test.go b/internal/cmd/network-area/route/describe/describe_test.go index 67345ccae..3923e2b26 100644 --- a/internal/cmd/network-area/route/describe/describe_test.go +++ b/internal/cmd/network-area/route/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -164,7 +165,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -267,7 +268,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.route); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index 9ea4f6159..d85ac49db 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { NetworkAreaId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all static routes in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/route/list/list_test.go b/internal/cmd/network-area/route/list/list_test.go index 365249370..f40f9bafe 100644 --- a/internal/cmd/network-area/route/list/list_test.go +++ b/internal/cmd/network-area/route/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -231,7 +232,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.routes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/route/routes.go b/internal/cmd/network-area/route/routes.go index 1769f349e..f6d2b3656 100644 --- a/internal/cmd/network-area/route/routes.go +++ b/internal/cmd/network-area/route/routes.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "route", Short: "Provides functionality for static routes in STACKIT Network Areas", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index 92ca244a9..c20c86601 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", routeIdArg), Short: "Updates a static route in a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/route/update/update_test.go b/internal/cmd/network-area/route/update/update_test.go index da6c6e03a..855d36513 100644 --- a/internal/cmd/network-area/route/update/update_test.go +++ b/internal/cmd/network-area/route/update/update_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -197,7 +198,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -301,7 +302,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networkAreaLabel, tt.args.route); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 20f426d89..71d9bd899 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -6,7 +6,8 @@ import ( "os" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -63,7 +64,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", areaIdArg), Short: "Updates a STACKIT Network Area (SNA)", diff --git a/internal/cmd/network-area/update/update_test.go b/internal/cmd/network-area/update/update_test.go index b46b66aab..e6963c929 100644 --- a/internal/cmd/network-area/update/update_test.go +++ b/internal/cmd/network-area/update/update_test.go @@ -6,7 +6,8 @@ import ( "strings" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -232,7 +233,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -372,7 +373,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.responses); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index ad945e81d..c660bb561 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -5,8 +5,9 @@ import ( "fmt" "regexp" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -48,7 +49,7 @@ type inputModel struct { SecurityGroups *[]string // = 36 characters + regex ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a network interface", diff --git a/internal/cmd/network-interface/create/create_test.go b/internal/cmd/network-interface/create/create_test.go index fd584b84e..5ebe70d2b 100644 --- a/internal/cmd/network-interface/create/create_test.go +++ b/internal/cmd/network-interface/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -49,7 +50,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st } func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { - var allowedAddresses []iaas.AllowedAddressesInner = []iaas.AllowedAddressesInner{ + var allowedAddresses = []iaas.AllowedAddressesInner{ iaas.StringAsAllowedAddressesInner(utils.Ptr("1.1.1.1")), iaas.StringAsAllowedAddressesInner(utils.Ptr("8.8.8.8")), iaas.StringAsAllowedAddressesInner(utils.Ptr("9.9.9.9")), @@ -87,7 +88,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiCreateNicRequest)) iaas.ApiCre } func fixturePayload(mods ...func(payload *iaas.CreateNicPayload)) iaas.CreateNicPayload { - var allowedAddresses []iaas.AllowedAddressesInner = []iaas.AllowedAddressesInner{ + var allowedAddresses = []iaas.AllowedAddressesInner{ iaas.StringAsAllowedAddressesInner(utils.Ptr("1.1.1.1")), iaas.StringAsAllowedAddressesInner(utils.Ptr("8.8.8.8")), iaas.StringAsAllowedAddressesInner(utils.Ptr("9.9.9.9")), @@ -256,7 +257,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectId, tt.args.nic); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index c5d9d61e0..8db2f2376 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -28,7 +29,7 @@ type inputModel struct { NicId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", nicIdArg), Short: "Deletes a network interface", diff --git a/internal/cmd/network-interface/delete/delete_test.go b/internal/cmd/network-interface/delete/delete_test.go index c0170eab1..e541c34a7 100644 --- a/internal/cmd/network-interface/delete/delete_test.go +++ b/internal/cmd/network-interface/delete/delete_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -127,7 +128,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index 128c333fa..52a47532a 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { NicId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", nicIdArg), Short: "Describes a network interface", diff --git a/internal/cmd/network-interface/describe/describe_test.go b/internal/cmd/network-interface/describe/describe_test.go index 2f802bf0e..be6d7f317 100644 --- a/internal/cmd/network-interface/describe/describe_test.go +++ b/internal/cmd/network-interface/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -127,7 +128,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -230,7 +231,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.nic); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index 23fe3aa4d..21c41a260 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { NetworkId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all network interfaces of a network", diff --git a/internal/cmd/network-interface/list/list_test.go b/internal/cmd/network-interface/list/list_test.go index 56eb5435d..d04c1d9b7 100644 --- a/internal/cmd/network-interface/list/list_test.go +++ b/internal/cmd/network-interface/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -192,7 +193,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.nics); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network-interface/network-interface.go b/internal/cmd/network-interface/network-interface.go index f9bbca3fe..d9cb6214d 100644 --- a/internal/cmd/network-interface/network-interface.go +++ b/internal/cmd/network-interface/network-interface.go @@ -7,12 +7,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-interface", Short: "Provides functionality for network interfaces", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 3b1902bb4..283083698 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -5,8 +5,9 @@ import ( "fmt" "regexp" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -46,7 +47,7 @@ type inputModel struct { SecurityGroups *[]string // = 36 characters + regex ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", nicIdArg), Short: "Updates a network interface", diff --git a/internal/cmd/network-interface/update/update_test.go b/internal/cmd/network-interface/update/update_test.go index 3f1382dab..7eba7d62d 100644 --- a/internal/cmd/network-interface/update/update_test.go +++ b/internal/cmd/network-interface/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -57,7 +58,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st } func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { - var allowedAddresses []iaas.AllowedAddressesInner = []iaas.AllowedAddressesInner{ + var allowedAddresses = []iaas.AllowedAddressesInner{ iaas.StringAsAllowedAddressesInner(utils.Ptr("1.1.1.1")), iaas.StringAsAllowedAddressesInner(utils.Ptr("8.8.8.8")), iaas.StringAsAllowedAddressesInner(utils.Ptr("9.9.9.9")), @@ -94,7 +95,7 @@ func fixtureRequest(mods ...func(request *iaas.ApiUpdateNicRequest)) iaas.ApiUpd } func fixturePayload(mods ...func(payload *iaas.UpdateNicPayload)) iaas.UpdateNicPayload { - var allowedAddresses []iaas.AllowedAddressesInner = []iaas.AllowedAddressesInner{ + var allowedAddresses = []iaas.AllowedAddressesInner{ iaas.StringAsAllowedAddressesInner(utils.Ptr("1.1.1.1")), iaas.StringAsAllowedAddressesInner(utils.Ptr("8.8.8.8")), iaas.StringAsAllowedAddressesInner(utils.Ptr("9.9.9.9")), @@ -219,7 +220,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -323,7 +324,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectId, tt.args.nic); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 9877e4477..4a2098191 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a network", @@ -288,15 +289,10 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } } - routed := true - if model.NonRouted { - routed = false - } - payload := iaas.CreateNetworkPayload{ Name: model.Name, Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), - Routed: &routed, + Routed: utils.Ptr(!model.NonRouted), Ipv4: ipv4Network, Ipv6: ipv6Network, } diff --git a/internal/cmd/network/create/create_test.go b/internal/cmd/network/create/create_test.go index a73f7d07a..dbb2ea6d3 100644 --- a/internal/cmd/network/create/create_test.go +++ b/internal/cmd/network/create/create_test.go @@ -6,7 +6,8 @@ import ( "strings" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -634,7 +635,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.network); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index e101edf0a..4cb4410be 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { NetworkId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", networkIdArg), Short: "Deletes a network", diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index c7f0d08bc..ab81a8c48 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { NetworkId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", networkIdArg), Short: "Shows details of a network", diff --git a/internal/cmd/network/describe/describe_test.go b/internal/cmd/network/describe/describe_test.go index 5a9015489..14fa618e4 100644 --- a/internal/cmd/network/describe/describe_test.go +++ b/internal/cmd/network/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.network); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index e92ab31cc..3b1fabea5 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all networks of a project", diff --git a/internal/cmd/network/list/list_test.go b/internal/cmd/network/list/list_test.go index d753ab11d..67e90a2b4 100644 --- a/internal/cmd/network/list/list_test.go +++ b/internal/cmd/network/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -198,7 +199,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.networks); (err != nil) != tt.wantErr { diff --git a/internal/cmd/network/network.go b/internal/cmd/network/network.go index 5fbd7e77b..eb7c6ece7 100644 --- a/internal/cmd/network/network.go +++ b/internal/cmd/network/network.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/network/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/network/list" "github.com/stackitcloud/stackit-cli/internal/cmd/network/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network", Short: "Provides functionality for networks", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index b1891fd34..6a752b5e1 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -47,7 +48,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", networkIdArg), Short: "Updates a network", diff --git a/internal/cmd/network/update/update_test.go b/internal/cmd/network/update/update_test.go index 236fbcd8b..87b533c0a 100644 --- a/internal/cmd/network/update/update_test.go +++ b/internal/cmd/network/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -245,7 +246,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/object-storage/bucket/bucket.go b/internal/cmd/object-storage/bucket/bucket.go index 62d928e54..0f8ab39a3 100644 --- a/internal/cmd/object-storage/bucket/bucket.go +++ b/internal/cmd/object-storage/bucket/bucket.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "bucket", Short: "Provides functionality for Object Storage buckets", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index 8d2c6f942..a3409a6a5 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { BucketName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", bucketNameArg), Short: "Creates an Object Storage bucket", diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index 976dab8a0..da4fcb9cf 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.bucketName, tt.args.createBucketResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index eb47d1bd7..010aa121e 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { BucketName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", bucketNameArg), Short: "Deletes an Object Storage bucket", diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index 99fa3e52d..a2a3ceedb 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { BucketName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", bucketNameArg), Short: "Shows details of an Object Storage bucket", diff --git a/internal/cmd/object-storage/bucket/describe/describe_test.go b/internal/cmd/object-storage/bucket/describe/describe_test.go index a55f90bc1..106844ed2 100644 --- a/internal/cmd/object-storage/bucket/describe/describe_test.go +++ b/internal/cmd/object-storage/bucket/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -194,7 +195,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.bucket); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index 595b095b9..ff01c60d6 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Object Storage buckets", diff --git a/internal/cmd/object-storage/bucket/list/list_test.go b/internal/cmd/object-storage/bucket/list/list_test.go index 93b467433..47be7605e 100644 --- a/internal/cmd/object-storage/bucket/list/list_test.go +++ b/internal/cmd/object-storage/bucket/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -174,7 +175,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.buckets); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index b4f8a850c..2081d3550 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { CredentialsGroupName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a credentials group to hold Object Storage access credentials", diff --git a/internal/cmd/object-storage/credentials-group/create/create_test.go b/internal/cmd/object-storage/credentials-group/create/create_test.go index 307876137..2823fc5da 100644 --- a/internal/cmd/object-storage/credentials-group/create/create_test.go +++ b/internal/cmd/object-storage/credentials-group/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -190,7 +191,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.createCredentialsGroupResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials-group/credentials_group.go b/internal/cmd/object-storage/credentials-group/credentials_group.go index 9b9d05129..e9ce52dbd 100644 --- a/internal/cmd/object-storage/credentials-group/credentials_group.go +++ b/internal/cmd/object-storage/credentials-group/credentials_group.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group/create" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials-group", Short: "Provides functionality for Object Storage credentials group", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) diff --git a/internal/cmd/object-storage/credentials-group/delete/delete.go b/internal/cmd/object-storage/credentials-group/delete/delete.go index 6a328b875..aad80623e 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { CredentialsGroupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsGroupIdArg), Short: "Deletes a credentials group that holds Object Storage access credentials", diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index cbad3cba1..f422ad6d3 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials groups that hold Object Storage access credentials", diff --git a/internal/cmd/object-storage/credentials-group/list/list_test.go b/internal/cmd/object-storage/credentials-group/list/list_test.go index 2415108c4..cbbbb1a89 100644 --- a/internal/cmd/object-storage/credentials-group/list/list_test.go +++ b/internal/cmd/object-storage/credentials-group/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -181,7 +182,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentialsGroups); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index e7f9fdcfc..ef75cac78 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -5,8 +5,9 @@ import ( "fmt" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { HidePassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for an Object Storage credentials group", diff --git a/internal/cmd/object-storage/credentials/create/create_test.go b/internal/cmd/object-storage/credentials/create/create_test.go index f351a4d3e..46f0e2e18 100644 --- a/internal/cmd/object-storage/credentials/create/create_test.go +++ b/internal/cmd/object-storage/credentials/create/create_test.go @@ -5,7 +5,8 @@ import ( "testing" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentialsGroupLabel, tt.args.createAccessKeyResponse); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/credentials/credentials.go b/internal/cmd/object-storage/credentials/credentials.go index 8654a6734..4a271019e 100644 --- a/internal/cmd/object-storage/credentials/credentials.go +++ b/internal/cmd/object-storage/credentials/credentials.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for Object Storage credentials", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index 5cab91f49..c8f1c63d8 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of an Object Storage credentials group", diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index 522459440..f1ef8c155 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials for an Object Storage credentials group", diff --git a/internal/cmd/object-storage/credentials/list/list_test.go b/internal/cmd/object-storage/credentials/list/list_test.go index 8e6469b18..ba6967c84 100644 --- a/internal/cmd/object-storage/credentials/list/list_test.go +++ b/internal/cmd/object-storage/credentials/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -206,7 +207,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentialsGroupLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index 12a0f16de..0272151f4 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +22,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables Object Storage for a project", diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index e6a1ade29..c135a1212 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +22,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables Object Storage for a project", diff --git a/internal/cmd/object-storage/object_storage.go b/internal/cmd/object-storage/object_storage.go index 2adfb7001..88358e0d8 100644 --- a/internal/cmd/object-storage/object_storage.go +++ b/internal/cmd/object-storage/object_storage.go @@ -6,14 +6,14 @@ import ( credentialsGroup "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/disable" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/enable" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "object-storage", Short: "Provides functionality for Object Storage", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(bucket.NewCmd(params)) cmd.AddCommand(disable.NewCmd(params)) cmd.AddCommand(enable.NewCmd(params)) diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index f9cd2feb4..a3ef3f615 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for an Observability instance.", diff --git a/internal/cmd/observability/credentials/create/create_test.go b/internal/cmd/observability/credentials/create/create_test.go index 43ba6f271..c00d81989 100644 --- a/internal/cmd/observability/credentials/create/create_test.go +++ b/internal/cmd/observability/credentials/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/credentials/credentials.go b/internal/cmd/observability/credentials/credentials.go index c4aa1e396..2c40cc3d2 100644 --- a/internal/cmd/observability/credentials/credentials.go +++ b/internal/cmd/observability/credentials/credentials.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/credentials/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for Observability credentials", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) diff --git a/internal/cmd/observability/credentials/delete/delete.go b/internal/cmd/observability/credentials/delete/delete.go index eeb00d2b9..86617ab82 100644 --- a/internal/cmd/observability/credentials/delete/delete.go +++ b/internal/cmd/observability/credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Username string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", usernameArg), Short: "Deletes credentials of an Observability instance", diff --git a/internal/cmd/observability/credentials/list/list.go b/internal/cmd/observability/credentials/list/list.go index 5e7e7a3ad..f26af68de 100644 --- a/internal/cmd/observability/credentials/list/list.go +++ b/internal/cmd/observability/credentials/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists the usernames of all credentials for an Observability instance", diff --git a/internal/cmd/observability/credentials/list/list_test.go b/internal/cmd/observability/credentials/list/list_test.go index ceed7952d..f2ed00e46 100644 --- a/internal/cmd/observability/credentials/list/list_test.go +++ b/internal/cmd/observability/credentials/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -203,7 +204,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 225bc18ef..674104a9b 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of the Grafana configuration of an Observability instance", diff --git a/internal/cmd/observability/grafana/describe/describe_test.go b/internal/cmd/observability/grafana/describe/describe_test.go index d84af41cb..c1aeb443d 100644 --- a/internal/cmd/observability/grafana/describe/describe_test.go +++ b/internal/cmd/observability/grafana/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -170,7 +171,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -323,7 +324,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.grafanaConfig, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/grafana/grafana.go b/internal/cmd/observability/grafana/grafana.go index 000da5eac..7ba2a996f 100644 --- a/internal/cmd/observability/grafana/grafana.go +++ b/internal/cmd/observability/grafana/grafana.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/describe" publicreadaccess "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/public-read-access" singlesignon "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/single-sign-on" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "grafana", Short: "Provides functionality for the Grafana configuration of Observability instances", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(publicreadaccess.NewCmd(params)) cmd.AddCommand(singlesignon.NewCmd(params)) diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index bfb42108c..4f63f776f 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disable %s", instanceIdArg), Short: "Disables public read access for Grafana on Observability instances", diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index b868c0535..87a79cfd8 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("enable %s", instanceIdArg), Short: "Enables public read access for Grafana on Observability instances", diff --git a/internal/cmd/observability/grafana/public-read-access/public_read_access.go b/internal/cmd/observability/grafana/public-read-access/public_read_access.go index 94c27eb36..bf45ec5df 100644 --- a/internal/cmd/observability/grafana/public-read-access/public_read_access.go +++ b/internal/cmd/observability/grafana/public-read-access/public_read_access.go @@ -3,16 +3,17 @@ package publicreadaccess import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/public-read-access/disable" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/public-read-access/enable" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "public-read-access", Short: "Enable or disable public read access for Grafana in Observability instances", @@ -27,7 +28,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(enable.NewCmd(params)) cmd.AddCommand(disable.NewCmd(params)) } diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index a26977645..806bd02d0 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disable %s", instanceIdArg), Short: "Disables single sign-on for Grafana on Observability instances", diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go index f95812d80..fa8f7f6de 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("enable %s", instanceIdArg), Short: "Enables single sign-on for Grafana on Observability instances", diff --git a/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go b/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go index c4a73ada2..293066b8f 100644 --- a/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go +++ b/internal/cmd/observability/grafana/single-sign-on/single_sign_on.go @@ -3,16 +3,17 @@ package singlesignon import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/single-sign-on/disable" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/grafana/single-sign-on/enable" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "single-sign-on", Aliases: []string{"sso"}, @@ -28,7 +29,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(enable.NewCmd(params)) cmd.AddCommand(disable.NewCmd(params)) } diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 84e8b1b6b..23c4bc51a 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an Observability instance", diff --git a/internal/cmd/observability/instance/create/create_test.go b/internal/cmd/observability/instance/create/create_test.go index 382cbeb0a..5aac98b82 100644 --- a/internal/cmd/observability/instance/create/create_test.go +++ b/internal/cmd/observability/instance/create/create_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -325,7 +326,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index 165c74f05..b06179e6c 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes an Observability instance", diff --git a/internal/cmd/observability/instance/describe/describe.go b/internal/cmd/observability/instance/describe/describe.go index ad204b74e..e9e4a256a 100644 --- a/internal/cmd/observability/instance/describe/describe.go +++ b/internal/cmd/observability/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of an Observability instance", diff --git a/internal/cmd/observability/instance/describe/describe_test.go b/internal/cmd/observability/instance/describe/describe_test.go index 1aa4cc756..dd1c07d42 100644 --- a/internal/cmd/observability/instance/describe/describe_test.go +++ b/internal/cmd/observability/instance/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/instance/instance.go b/internal/cmd/observability/instance/instance.go index 47a84edf6..955ae39ec 100644 --- a/internal/cmd/observability/instance/instance.go +++ b/internal/cmd/observability/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for Observability instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index ff124b8fb..2d31e348c 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Observability instances", diff --git a/internal/cmd/observability/instance/list/list_test.go b/internal/cmd/observability/instance/list/list_test.go index f4c1b20b7..456dbfb20 100644 --- a/internal/cmd/observability/instance/list/list_test.go +++ b/internal/cmd/observability/instance/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -179,7 +180,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index d4ae51392..c97eb98ba 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates an Observability instance", diff --git a/internal/cmd/observability/observability.go b/internal/cmd/observability/observability.go index 136f29637..66345691a 100644 --- a/internal/cmd/observability/observability.go +++ b/internal/cmd/observability/observability.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/plans" scrapeconfig "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "observability", Short: "Provides functionality for Observability", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(grafana.NewCmd(params)) cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) diff --git a/internal/cmd/observability/plans/plans.go b/internal/cmd/observability/plans/plans.go index 322bebb0d..5ef3952ed 100644 --- a/internal/cmd/observability/plans/plans.go +++ b/internal/cmd/observability/plans/plans.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all Observability service plans", diff --git a/internal/cmd/observability/plans/plans_test.go b/internal/cmd/observability/plans/plans_test.go index 36026aecf..65fb129d3 100644 --- a/internal/cmd/observability/plans/plans_test.go +++ b/internal/cmd/observability/plans/plans_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -179,7 +180,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index 43ff12a8f..c4e8a4dac 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Payload *observability.CreateScrapeConfigPayload } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a scrape configuration for an Observability instance", diff --git a/internal/cmd/observability/scrape-config/delete/delete.go b/internal/cmd/observability/scrape-config/delete/delete.go index 5ec7e3931..ceae80ac5 100644 --- a/internal/cmd/observability/scrape-config/delete/delete.go +++ b/internal/cmd/observability/scrape-config/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", jobNameArg), Short: "Deletes a scrape configuration from an Observability instance", diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 1558edbbc..91dc0d064 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", jobNameArg), Short: "Shows details of a scrape configuration from an Observability instance", diff --git a/internal/cmd/observability/scrape-config/describe/describe_test.go b/internal/cmd/observability/scrape-config/describe/describe_test.go index d975ba82c..5f4326b33 100644 --- a/internal/cmd/observability/scrape-config/describe/describe_test.go +++ b/internal/cmd/observability/scrape-config/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -258,7 +259,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.config); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go index 5476fbd94..e891d728e 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" @@ -32,7 +33,7 @@ type inputModel struct { FilePath *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "generate-payload", Short: "Generates a payload to create/update scrape configurations for an Observability instance ", diff --git a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go index 07be71444..81d3138e3 100644 --- a/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go +++ b/internal/cmd/observability/scrape-config/generate-payload/generate_payload_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -232,7 +233,7 @@ func TestOutputCreateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputCreateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { @@ -266,7 +267,7 @@ func TestOutputUpdateResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputUpdateResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/list/list.go b/internal/cmd/observability/scrape-config/list/list.go index 1002a87d8..faab36b0a 100644 --- a/internal/cmd/observability/scrape-config/list/list.go +++ b/internal/cmd/observability/scrape-config/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all scrape configurations of an Observability instance", diff --git a/internal/cmd/observability/scrape-config/list/list_test.go b/internal/cmd/observability/scrape-config/list/list_test.go index 371944178..6d4569d71 100644 --- a/internal/cmd/observability/scrape-config/list/list_test.go +++ b/internal/cmd/observability/scrape-config/list/list_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -204,7 +205,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.configs); (err != nil) != tt.wantErr { diff --git a/internal/cmd/observability/scrape-config/scrape_config.go b/internal/cmd/observability/scrape-config/scrape_config.go index d0934ff3b..b45cff386 100644 --- a/internal/cmd/observability/scrape-config/scrape_config.go +++ b/internal/cmd/observability/scrape-config/scrape_config.go @@ -7,14 +7,14 @@ import ( generatepayload "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config/generate-payload" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config/list" "github.com/stackitcloud/stackit-cli/internal/cmd/observability/scrape-config/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "scrape-config", Short: "Provides functionality for scrape configurations in Observability", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(generatepayload.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/observability/scrape-config/update/update.go b/internal/cmd/observability/scrape-config/update/update.go index ab39ea9e0..3556e6620 100644 --- a/internal/cmd/observability/scrape-config/update/update.go +++ b/internal/cmd/observability/scrape-config/update/update.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Payload observability.UpdateScrapeConfigPayload } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", jobNameArg), Short: "Updates a scrape configuration of an Observability instance", diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index c74347c51..f44215219 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for an OpenSearch instance", diff --git a/internal/cmd/opensearch/credentials/create/create_test.go b/internal/cmd/opensearch/credentials/create/create_test.go index 9b9057414..0c768de74 100644 --- a/internal/cmd/opensearch/credentials/create/create_test.go +++ b/internal/cmd/opensearch/credentials/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -233,7 +234,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.showPassword, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/credentials/credentials.go b/internal/cmd/opensearch/credentials/credentials.go index 3e1c17ba8..e9c878d02 100644 --- a/internal/cmd/opensearch/credentials/credentials.go +++ b/internal/cmd/opensearch/credentials/credentials.go @@ -5,14 +5,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for OpenSearch credentials", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/opensearch/credentials/delete/delete.go b/internal/cmd/opensearch/credentials/delete/delete.go index c513cb55e..d8b57c185 100644 --- a/internal/cmd/opensearch/credentials/delete/delete.go +++ b/internal/cmd/opensearch/credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of an OpenSearch instance", diff --git a/internal/cmd/opensearch/credentials/describe/describe.go b/internal/cmd/opensearch/credentials/describe/describe.go index 2acf9188a..17ddd78f9 100644 --- a/internal/cmd/opensearch/credentials/describe/describe.go +++ b/internal/cmd/opensearch/credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of an OpenSearch instance", diff --git a/internal/cmd/opensearch/credentials/describe/describe_test.go b/internal/cmd/opensearch/credentials/describe/describe_test.go index f9b43012d..254912869 100644 --- a/internal/cmd/opensearch/credentials/describe/describe_test.go +++ b/internal/cmd/opensearch/credentials/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -221,7 +222,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/credentials/list/list.go b/internal/cmd/opensearch/credentials/list/list.go index 7a086385b..05f4e8ef8 100644 --- a/internal/cmd/opensearch/credentials/list/list.go +++ b/internal/cmd/opensearch/credentials/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for an OpenSearch instance", diff --git a/internal/cmd/opensearch/credentials/list/list_test.go b/internal/cmd/opensearch/credentials/list/list_test.go index ee376658f..514606b9e 100644 --- a/internal/cmd/opensearch/credentials/list/list_test.go +++ b/internal/cmd/opensearch/credentials/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -202,7 +203,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index 826c6990f..91fe825c8 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an OpenSearch instance", diff --git a/internal/cmd/opensearch/instance/create/create_test.go b/internal/cmd/opensearch/instance/create/create_test.go index 9d14e0bd4..27822b653 100644 --- a/internal/cmd/opensearch/instance/create/create_test.go +++ b/internal/cmd/opensearch/instance/create/create_test.go @@ -5,9 +5,10 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -453,7 +454,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/delete/delete.go b/internal/cmd/opensearch/instance/delete/delete.go index 7d5996c6b..31983b4a5 100644 --- a/internal/cmd/opensearch/instance/delete/delete.go +++ b/internal/cmd/opensearch/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes an OpenSearch instance", diff --git a/internal/cmd/opensearch/instance/describe/describe.go b/internal/cmd/opensearch/instance/describe/describe.go index 44aa6cb82..663ce82de 100644 --- a/internal/cmd/opensearch/instance/describe/describe.go +++ b/internal/cmd/opensearch/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of an OpenSearch instance", diff --git a/internal/cmd/opensearch/instance/describe/describe_test.go b/internal/cmd/opensearch/instance/describe/describe_test.go index 633d7da44..a90f5d142 100644 --- a/internal/cmd/opensearch/instance/describe/describe_test.go +++ b/internal/cmd/opensearch/instance/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -194,7 +195,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/instance.go b/internal/cmd/opensearch/instance/instance.go index 05d92bbc6..d8f58a668 100644 --- a/internal/cmd/opensearch/instance/instance.go +++ b/internal/cmd/opensearch/instance/instance.go @@ -6,14 +6,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance/update" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for OpenSearch instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index a6c57bc29..0dacbcf6d 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all OpenSearch instances", diff --git a/internal/cmd/opensearch/instance/list/list_test.go b/internal/cmd/opensearch/instance/list/list_test.go index 15f772725..910c0fab3 100644 --- a/internal/cmd/opensearch/instance/list/list_test.go +++ b/internal/cmd/opensearch/instance/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/opensearch/instance/update/update.go b/internal/cmd/opensearch/instance/update/update.go index 3b1114780..fab2792f0 100644 --- a/internal/cmd/opensearch/instance/update/update.go +++ b/internal/cmd/opensearch/instance/update/update.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -57,7 +58,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates an OpenSearch instance", diff --git a/internal/cmd/opensearch/instance/update/update_test.go b/internal/cmd/opensearch/instance/update/update_test.go index 934088f02..3d7b291d2 100644 --- a/internal/cmd/opensearch/instance/update/update_test.go +++ b/internal/cmd/opensearch/instance/update/update_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -293,7 +294,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/opensearch/opensearch.go b/internal/cmd/opensearch/opensearch.go index 766065ed2..96d02fd3e 100644 --- a/internal/cmd/opensearch/opensearch.go +++ b/internal/cmd/opensearch/opensearch.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch/plans" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "opensearch", Short: "Provides functionality for OpenSearch", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(plans.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index 5ba348f99..3f644c000 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all OpenSearch service plans", diff --git a/internal/cmd/opensearch/plans/plans_test.go b/internal/cmd/opensearch/plans/plans_test.go index 093e129fd..aedcd19b3 100644 --- a/internal/cmd/opensearch/plans/plans_test.go +++ b/internal/cmd/opensearch/plans/plans_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/organization/member/add/add.go b/internal/cmd/organization/member/add/add.go index 297e64c33..f41eaa06d 100644 --- a/internal/cmd/organization/member/add/add.go +++ b/internal/cmd/organization/member/add/add.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -33,7 +34,7 @@ type inputModel struct { Role *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("add %s", subjectArg), Short: "Adds a member to an organization", diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index d4989bc76..7e17796c6 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "sort" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { SortBy string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists members of an organization", @@ -159,9 +160,10 @@ func outputResult(p *print.Printer, outputFormat, sortBy string, members []autho table.AddRow(utils.PtrString(m.Subject), utils.PtrString(m.Role)) } - if sortBy == "subject" { + switch sortBy { + case "subject": table.EnableAutoMergeOnColumns(1) - } else if sortBy == "role" { + case "role": table.EnableAutoMergeOnColumns(2) } diff --git a/internal/cmd/organization/member/list/list_test.go b/internal/cmd/organization/member/list/list_test.go index 37f13746b..675cbd787 100644 --- a/internal/cmd/organization/member/list/list_test.go +++ b/internal/cmd/organization/member/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -198,7 +199,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.sortBy, tt.args.members); (err != nil) != tt.wantErr { diff --git a/internal/cmd/organization/member/member.go b/internal/cmd/organization/member/member.go index fe2b67e5d..bc4a8b200 100644 --- a/internal/cmd/organization/member/member.go +++ b/internal/cmd/organization/member/member.go @@ -4,14 +4,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member/add" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member/list" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member/remove" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "member", Short: "Manages organization members", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(add.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(remove.NewCmd(params)) diff --git a/internal/cmd/organization/member/remove/remove.go b/internal/cmd/organization/member/remove/remove.go index f79075bdb..f0d5ee13c 100644 --- a/internal/cmd/organization/member/remove/remove.go +++ b/internal/cmd/organization/member/remove/remove.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -36,7 +37,7 @@ type inputModel struct { Force bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("remove %s", subjectArg), Short: "Removes a member from an organization", diff --git a/internal/cmd/organization/organization.go b/internal/cmd/organization/organization.go index e7d1376b5..7a68177b7 100644 --- a/internal/cmd/organization/organization.go +++ b/internal/cmd/organization/organization.go @@ -3,16 +3,17 @@ package organization import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/role" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "organization", Short: "Manages organizations", @@ -27,7 +28,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(member.NewCmd(params)) cmd.AddCommand(role.NewCmd(params)) } diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index 9603d0212..bb59b28c5 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists roles and permissions of an organization", diff --git a/internal/cmd/organization/role/list/list_test.go b/internal/cmd/organization/role/list/list_test.go index 7e2dcb518..5396717d0 100644 --- a/internal/cmd/organization/role/list/list_test.go +++ b/internal/cmd/organization/role/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -160,7 +161,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputRolesResult(p, tt.args.outputFormat, tt.args.roles); (err != nil) != tt.wantErr { diff --git a/internal/cmd/organization/role/role.go b/internal/cmd/organization/role/role.go index 286783661..d3146aca8 100644 --- a/internal/cmd/organization/role/role.go +++ b/internal/cmd/organization/role/role.go @@ -2,14 +2,14 @@ package role import ( "github.com/stackitcloud/stackit-cli/internal/cmd/organization/role/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "role", Short: "Manages organization roles", @@ -21,6 +21,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/postgresflex/backup/backup.go b/internal/cmd/postgresflex/backup/backup.go index bac6c4a72..f6ad7c518 100644 --- a/internal/cmd/postgresflex/backup/backup.go +++ b/internal/cmd/postgresflex/backup/backup.go @@ -1,17 +1,17 @@ package backup import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup/list" updateschedule "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup/update-schedule" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for PostgreSQL Flex instance backups", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(updateschedule.NewCmd(params)) diff --git a/internal/cmd/postgresflex/backup/describe/describe.go b/internal/cmd/postgresflex/backup/describe/describe.go index 930bf334a..891b78888 100644 --- a/internal/cmd/postgresflex/backup/describe/describe.go +++ b/internal/cmd/postgresflex/backup/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { BackupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Shows details of a backup for a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/backup/describe/describe_test.go b/internal/cmd/postgresflex/backup/describe/describe_test.go index 6e47eabb0..cd44d829e 100644 --- a/internal/cmd/postgresflex/backup/describe/describe_test.go +++ b/internal/cmd/postgresflex/backup/describe/describe_test.go @@ -5,10 +5,11 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -263,7 +264,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/backup/list/list.go b/internal/cmd/postgresflex/backup/list/list.go index cfd5718d5..004159b2b 100644 --- a/internal/cmd/postgresflex/backup/list/list.go +++ b/internal/cmd/postgresflex/backup/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -37,7 +38,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all backups which are available for a PostgreSQL Flex instance", @@ -77,10 +78,10 @@ func NewCmd(params *params.CmdParams) *cobra.Command { req := buildRequest(ctx, model, apiClient) resp, err := req.Execute() if err != nil { - return fmt.Errorf("get backups for PostgreSQL Flex instance %q: %w\n", instanceLabel, err) + return fmt.Errorf("get backups for PostgreSQL Flex instance %q: %w", instanceLabel, err) } if resp.Items == nil || len(*resp.Items) == 0 { - cmd.Printf("No backups found for instance %q\n", instanceLabel) + params.Printer.Outputf("No backups found for instance %q", instanceLabel) return nil } backups := *resp.Items diff --git a/internal/cmd/postgresflex/backup/list/list_test.go b/internal/cmd/postgresflex/backup/list/list_test.go index 4ac63c37c..39c9d8f53 100644 --- a/internal/cmd/postgresflex/backup/list/list_test.go +++ b/internal/cmd/postgresflex/backup/list/list_test.go @@ -5,12 +5,13 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -209,7 +210,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go index 9d8bf59fc..5e954322e 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { BackupSchedule *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update-schedule", Short: "Updates backup schedule for a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index 10da911bb..9c72a9874 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { RecoveryDate *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("clone %s", instanceIdArg), Short: "Clones a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/instance/clone/clone_test.go b/internal/cmd/postgresflex/instance/clone/clone_test.go index 5f2a60189..657670aa2 100644 --- a/internal/cmd/postgresflex/instance/clone/clone_test.go +++ b/internal/cmd/postgresflex/instance/clone/clone_test.go @@ -6,10 +6,11 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -508,7 +509,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index 1e3172a3b..de9106998 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { Type *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/instance/create/create_test.go b/internal/cmd/postgresflex/instance/create/create_test.go index 09b6b2311..f3fa498c2 100644 --- a/internal/cmd/postgresflex/instance/create/create_test.go +++ b/internal/cmd/postgresflex/instance/create/create_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -503,7 +504,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/postgresflex/instance/delete/delete.go b/internal/cmd/postgresflex/instance/delete/delete.go index 5b8cbbd91..56401d564 100644 --- a/internal/cmd/postgresflex/instance/delete/delete.go +++ b/internal/cmd/postgresflex/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { ForceDelete bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/instance/describe/describe.go b/internal/cmd/postgresflex/instance/describe/describe.go index a9480e74e..a50f3f167 100644 --- a/internal/cmd/postgresflex/instance/describe/describe.go +++ b/internal/cmd/postgresflex/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/instance/describe/describe_test.go b/internal/cmd/postgresflex/instance/describe/describe_test.go index 9331b81d4..80ce6c262 100644 --- a/internal/cmd/postgresflex/instance/describe/describe_test.go +++ b/internal/cmd/postgresflex/instance/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -214,7 +215,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/instance/instance.go b/internal/cmd/postgresflex/instance/instance.go index f43979195..5beba3e48 100644 --- a/internal/cmd/postgresflex/instance/instance.go +++ b/internal/cmd/postgresflex/instance/instance.go @@ -1,7 +1,6 @@ package instance import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/clone" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/delete" @@ -9,12 +8,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for PostgreSQL Flex instances", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index 148a31d46..2b20dc3e2 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all PostgreSQL Flex instances", diff --git a/internal/cmd/postgresflex/instance/list/list_test.go b/internal/cmd/postgresflex/instance/list/list_test.go index c8c2d8a7a..dfde2729a 100644 --- a/internal/cmd/postgresflex/instance/list/list_test.go +++ b/internal/cmd/postgresflex/instance/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -179,7 +180,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index f2784645c..9eef70391 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -53,7 +54,7 @@ type inputModel struct { Type *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a PostgreSQL Flex instance", diff --git a/internal/cmd/postgresflex/instance/update/update_test.go b/internal/cmd/postgresflex/instance/update/update_test.go index 0c4ed96b6..1402996f7 100644 --- a/internal/cmd/postgresflex/instance/update/update_test.go +++ b/internal/cmd/postgresflex/instance/update/update_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -283,7 +284,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -621,7 +622,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index d5afbbbf5..ad57495d3 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -46,7 +46,7 @@ type flavorStorages struct { Storages *postgresflex.ListStoragesResponse `json:"storages"` } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists PostgreSQL Flex options", diff --git a/internal/cmd/postgresflex/options/options_test.go b/internal/cmd/postgresflex/options/options_test.go index 4f7f5c67f..bd47b14ba 100644 --- a/internal/cmd/postgresflex/options/options_test.go +++ b/internal/cmd/postgresflex/options/options_test.go @@ -5,8 +5,9 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -262,7 +263,7 @@ func TestBuildAndExecuteRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := &print.Printer{} - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) p.Cmd = cmd client := &postgresFlexClientMocked{ listFlavorsFails: tt.listFlavorsFails, @@ -332,7 +333,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.flavors, tt.args.versions, tt.args.storages); (err != nil) != tt.wantErr { diff --git a/internal/cmd/postgresflex/postgresflex.go b/internal/cmd/postgresflex/postgresflex.go index 3a86086c2..536584f2f 100644 --- a/internal/cmd/postgresflex/postgresflex.go +++ b/internal/cmd/postgresflex/postgresflex.go @@ -1,18 +1,18 @@ package postgresflex import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/backup" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/options" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "postgresflex", Aliases: []string{"postgresqlflex"}, @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(user.NewCmd(params)) cmd.AddCommand(options.NewCmd(params)) diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index 73682a34a..7623ba786 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a PostgreSQL Flex user", diff --git a/internal/cmd/postgresflex/user/create/create_test.go b/internal/cmd/postgresflex/user/create/create_test.go index bbd08e214..2ab611d42 100644 --- a/internal/cmd/postgresflex/user/create/create_test.go +++ b/internal/cmd/postgresflex/user/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -219,7 +220,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/delete/delete.go b/internal/cmd/postgresflex/user/delete/delete.go index 38b20dbfe..219798121 100644 --- a/internal/cmd/postgresflex/user/delete/delete.go +++ b/internal/cmd/postgresflex/user/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a PostgreSQL Flex user", diff --git a/internal/cmd/postgresflex/user/describe/describe.go b/internal/cmd/postgresflex/user/describe/describe.go index c0f3f450d..01ab5fce1 100644 --- a/internal/cmd/postgresflex/user/describe/describe.go +++ b/internal/cmd/postgresflex/user/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a PostgreSQL Flex user", diff --git a/internal/cmd/postgresflex/user/describe/describe_test.go b/internal/cmd/postgresflex/user/describe/describe_test.go index ad6a2377f..92b83cc99 100644 --- a/internal/cmd/postgresflex/user/describe/describe_test.go +++ b/internal/cmd/postgresflex/user/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -214,7 +215,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index 420619f46..a8dc23773 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all PostgreSQL Flex users of an instance", diff --git a/internal/cmd/postgresflex/user/list/list_test.go b/internal/cmd/postgresflex/user/list/list_test.go index 8985f945f..2695296c7 100644 --- a/internal/cmd/postgresflex/user/list/list_test.go +++ b/internal/cmd/postgresflex/user/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -183,7 +184,7 @@ func Test_outputResult(t *testing.T) { }}}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index 0a69b4c94..3c78d191f 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reset-password %s", userIdArg), Short: "Resets the password of a PostgreSQL Flex user", diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go index 51572b406..920c78b93 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -215,7 +216,7 @@ func Test_outputResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/postgresflex/user/update/update.go b/internal/cmd/postgresflex/user/update/update.go index c8b24f1d3..3ebb2231f 100644 --- a/internal/cmd/postgresflex/user/update/update.go +++ b/internal/cmd/postgresflex/user/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Roles *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", userIdArg), Short: "Updates a PostgreSQL Flex user", diff --git a/internal/cmd/postgresflex/user/user.go b/internal/cmd/postgresflex/user/user.go index af9d371ef..ce566f5b7 100644 --- a/internal/cmd/postgresflex/user/user.go +++ b/internal/cmd/postgresflex/user/user.go @@ -1,7 +1,6 @@ package user import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/create" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/describe" @@ -9,12 +8,13 @@ import ( resetpassword "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/reset-password" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex/user/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for PostgreSQL Flex users", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index c70e58e92..e00210b71 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -5,7 +5,8 @@ import ( "fmt" "regexp" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -40,7 +41,7 @@ type inputModel struct { NetworkAreaId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a STACKIT project", diff --git a/internal/cmd/project/create/create_test.go b/internal/cmd/project/create/create_test.go index 3503b0b68..095469298 100644 --- a/internal/cmd/project/create/create_test.go +++ b/internal/cmd/project/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -330,7 +331,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/delete/delete.go b/internal/cmd/project/delete/delete.go index eff9d2615..314fb621e 100644 --- a/internal/cmd/project/delete/delete.go +++ b/internal/cmd/project/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +22,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "delete", Short: "Deletes a STACKIT project", diff --git a/internal/cmd/project/describe/describe.go b/internal/cmd/project/describe/describe.go index b1db718bf..52dc280b3 100644 --- a/internal/cmd/project/describe/describe.go +++ b/internal/cmd/project/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -30,7 +31,7 @@ type inputModel struct { IncludeParents bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "describe", Short: "Shows details of a STACKIT project", @@ -86,7 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" && projectId == "" { - return nil, fmt.Errorf("Project ID needs to be provided either as an argument or as a flag") + return nil, fmt.Errorf("project ID needs to be provided either as an argument or as a flag") } if projectId == "" { diff --git a/internal/cmd/project/describe/describe_test.go b/internal/cmd/project/describe/describe_test.go index 2afd90610..b5f3ddcff 100644 --- a/internal/cmd/project/describe/describe_test.go +++ b/internal/cmd/project/describe/describe_test.go @@ -5,10 +5,11 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -193,7 +194,7 @@ func Test_outputResult(t *testing.T) { }, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.project); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index fe7f8503a..d4ef99b63 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -42,7 +43,7 @@ type inputModel struct { PageSize int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists STACKIT projects", diff --git a/internal/cmd/project/list/list_test.go b/internal/cmd/project/list/list_test.go index baf7fed6d..8050a0f27 100644 --- a/internal/cmd/project/list/list_test.go +++ b/internal/cmd/project/list/list_test.go @@ -9,12 +9,13 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -486,7 +487,7 @@ func Test_outputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/internal/cmd/project/member/add/add.go b/internal/cmd/project/member/add/add.go index f8491a6de..d08437440 100644 --- a/internal/cmd/project/member/add/add.go +++ b/internal/cmd/project/member/add/add.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Role *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("add %s", subjectArg), Short: "Adds a member to a project", @@ -119,7 +120,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *authorization.APIClient) authorization.ApiAddMembersRequest { - req := apiClient.AddMembers(ctx, model.GlobalFlagModel.ProjectId) + req := apiClient.AddMembers(ctx, model.ProjectId) req = req.AddMembersPayload(authorization.AddMembersPayload{ Members: utils.Ptr([]authorization.Member{ { diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index 04d141e3b..66df41524 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "sort" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { SortBy string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists members of a project", @@ -129,7 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *authorization.APIClient) authorization.ApiListMembersRequest { - req := apiClient.ListMembers(ctx, projectResourceType, model.GlobalFlagModel.ProjectId) + req := apiClient.ListMembers(ctx, projectResourceType, model.ProjectId) if model.Subject != nil { req = req.Subject(*model.Subject) } @@ -164,9 +165,10 @@ func outputResult(p *print.Printer, model inputModel, members []authorization.Me table.AddRow(utils.PtrString(m.Subject), utils.PtrString(m.Role)) } - if model.SortBy == "subject" { + switch model.SortBy { + case "subject": table.EnableAutoMergeOnColumns(1) - } else if model.SortBy == "role" { + case "role": table.EnableAutoMergeOnColumns(2) } diff --git a/internal/cmd/project/member/list/list_test.go b/internal/cmd/project/member/list/list_test.go index 14167c407..af050ba78 100644 --- a/internal/cmd/project/member/list/list_test.go +++ b/internal/cmd/project/member/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -201,7 +202,7 @@ func Test_outputResult(t *testing.T) { false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.members); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/member/member.go b/internal/cmd/project/member/member.go index cef271820..4b247e877 100644 --- a/internal/cmd/project/member/member.go +++ b/internal/cmd/project/member/member.go @@ -1,17 +1,17 @@ package member import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/project/member/add" "github.com/stackitcloud/stackit-cli/internal/cmd/project/member/list" "github.com/stackitcloud/stackit-cli/internal/cmd/project/member/remove" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "member", Short: "Manages project members", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(add.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(remove.NewCmd(params)) diff --git a/internal/cmd/project/member/remove/remove.go b/internal/cmd/project/member/remove/remove.go index 20bf7ee3c..8b7089283 100644 --- a/internal/cmd/project/member/remove/remove.go +++ b/internal/cmd/project/member/remove/remove.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Force bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("remove %s", subjectArg), Short: "Removes a member from a project", @@ -127,7 +128,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *authorization.APIClient) authorization.ApiRemoveMembersRequest { - req := apiClient.RemoveMembers(ctx, model.GlobalFlagModel.ProjectId) + req := apiClient.RemoveMembers(ctx, model.ProjectId) payload := authorization.RemoveMembersPayload{ Members: utils.Ptr([]authorization.Member{ { diff --git a/internal/cmd/project/project.go b/internal/cmd/project/project.go index f888fbbc5..c1a04db9a 100644 --- a/internal/cmd/project/project.go +++ b/internal/cmd/project/project.go @@ -3,7 +3,8 @@ package project import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/project/create" "github.com/stackitcloud/stackit-cli/internal/cmd/project/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/project/describe" @@ -17,7 +18,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "project", Short: "Manages projects", @@ -32,7 +33,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index a2d65e21d..7be67dc6b 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists roles and permissions of a project", @@ -118,7 +119,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *authorization.APIClient) authorization.ApiListRolesRequest { - return apiClient.ListRoles(ctx, projectResourceType, model.GlobalFlagModel.ProjectId) + return apiClient.ListRoles(ctx, projectResourceType, model.ProjectId) } func outputRolesResult(p *print.Printer, outputFormat string, roles []authorization.Role) error { diff --git a/internal/cmd/project/role/list/list_test.go b/internal/cmd/project/role/list/list_test.go index 66f51f7df..3bc59db9a 100644 --- a/internal/cmd/project/role/list/list_test.go +++ b/internal/cmd/project/role/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -157,7 +158,7 @@ func Test_outputRolesResult(t *testing.T) { }}, false}, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputRolesResult(p, tt.args.outputFormat, tt.args.roles); (err != nil) != tt.wantErr { diff --git a/internal/cmd/project/role/role.go b/internal/cmd/project/role/role.go index bb0781f08..1c4c119a9 100644 --- a/internal/cmd/project/role/role.go +++ b/internal/cmd/project/role/role.go @@ -1,15 +1,15 @@ package role import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/project/role/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "role", Short: "Manages project roles", @@ -21,6 +21,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/project/update/update.go b/internal/cmd/project/update/update.go index 7523ff5e1..37e799a36 100644 --- a/internal/cmd/project/update/update.go +++ b/internal/cmd/project/update/update.go @@ -5,7 +5,8 @@ import ( "fmt" "regexp" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "update", Short: "Updates a STACKIT project", diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index ec2ac72c3..a3ed8cc0e 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { AssociatedResourceId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("associate %s", publicIpIdArg), Short: "Associates a Public IP with a network interface or a virtual IP", diff --git a/internal/cmd/public-ip/associate/associate_test.go b/internal/cmd/public-ip/associate/associate_test.go index 18084731d..8d40c1a6a 100644 --- a/internal/cmd/public-ip/associate/associate_test.go +++ b/internal/cmd/public-ip/associate/associate_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -171,7 +172,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index 872a95057..a467529d9 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Public IP", diff --git a/internal/cmd/public-ip/create/create_test.go b/internal/cmd/public-ip/create/create_test.go index 3602a422b..a4d0a4b23 100644 --- a/internal/cmd/public-ip/create/create_test.go +++ b/internal/cmd/public-ip/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -201,7 +202,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.publicIp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index f5f8e340a..4cbcd1094 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", publicIpIdArg), Short: "Deletes a Public IP", diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index 94ff1a5c9..fbcc2b15b 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", publicIpIdArg), Short: "Shows details of a Public IP", diff --git a/internal/cmd/public-ip/describe/describe_test.go b/internal/cmd/public-ip/describe/describe_test.go index 581eb0496..d140e36bf 100644 --- a/internal/cmd/public-ip/describe/describe_test.go +++ b/internal/cmd/public-ip/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -193,7 +194,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.publicIp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index 3a54d40cb..69a5dc77d 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("disassociate %s", publicIpIdArg), Short: "Disassociates a Public IP from a network interface or a virtual IP", diff --git a/internal/cmd/public-ip/disassociate/disassociate_test.go b/internal/cmd/public-ip/disassociate/disassociate_test.go index 1edc96014..41c8d26e8 100644 --- a/internal/cmd/public-ip/disassociate/disassociate_test.go +++ b/internal/cmd/public-ip/disassociate/disassociate_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/google/go-cmp/cmp" @@ -143,7 +144,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index ec95cb0c6..b2acfff92 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Public IPs of a project", diff --git a/internal/cmd/public-ip/list/list_test.go b/internal/cmd/public-ip/list/list_test.go index 2256ed99c..9a10067d9 100644 --- a/internal/cmd/public-ip/list/list_test.go +++ b/internal/cmd/public-ip/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.publicIps); (err != nil) != tt.wantErr { diff --git a/internal/cmd/public-ip/public-ip.go b/internal/cmd/public-ip/public-ip.go index d16565288..77a4e3a2b 100644 --- a/internal/cmd/public-ip/public-ip.go +++ b/internal/cmd/public-ip/public-ip.go @@ -1,7 +1,6 @@ package publicip import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/associate" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/create" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/delete" @@ -11,12 +10,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/ranges" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "public-ip", Short: "Provides functionality for public IPs", @@ -28,7 +28,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/public-ip/ranges/list/list.go b/internal/cmd/public-ip/ranges/list/list.go index 7188146f6..918cb2041 100644 --- a/internal/cmd/public-ip/ranges/list/list.go +++ b/internal/cmd/public-ip/ranges/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all STACKIT public-ip ranges", diff --git a/internal/cmd/public-ip/ranges/list/list_test.go b/internal/cmd/public-ip/ranges/list/list_test.go index 20af8f19f..9a50dfeb1 100644 --- a/internal/cmd/public-ip/ranges/list/list_test.go +++ b/internal/cmd/public-ip/ranges/list/list_test.go @@ -3,10 +3,11 @@ package list import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -180,7 +181,7 @@ func TestOutputResult(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) err := outputResult(p, tt.outputFormat, tt.publicIpRanges) if (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/cmd/public-ip/ranges/ranges.go b/internal/cmd/public-ip/ranges/ranges.go index 8d616ac5a..5978bbbb1 100644 --- a/internal/cmd/public-ip/ranges/ranges.go +++ b/internal/cmd/public-ip/ranges/ranges.go @@ -1,15 +1,15 @@ package ranges import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip/ranges/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "ranges", Short: "Provides functionality for STACKIT public-ip ranges", @@ -21,6 +21,6 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index c4498a032..df2687a76 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -31,7 +31,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", publicIpIdArg), Short: "Updates a Public IP", @@ -103,7 +103,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu labels := flags.FlagToStringToStringPointer(p, cmd, labelFlag) if labels == nil { - return nil, &errors.EmptyUpdateError{} + return nil, &cliErr.EmptyUpdateError{} } model := inputModel{ diff --git a/internal/cmd/public-ip/update/update_test.go b/internal/cmd/public-ip/update/update_test.go index bf987a524..36514978f 100644 --- a/internal/cmd/public-ip/update/update_test.go +++ b/internal/cmd/public-ip/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -151,7 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index f61151f24..d16da37d0 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "strconv" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,7 +23,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists quotas", diff --git a/internal/cmd/quota/list/list_test.go b/internal/cmd/quota/list/list_test.go index 358749384..b508a5c94 100644 --- a/internal/cmd/quota/list/list_test.go +++ b/internal/cmd/quota/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -160,7 +161,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.quotas); (err != nil) != tt.wantErr { diff --git a/internal/cmd/quota/quota.go b/internal/cmd/quota/quota.go index ff323e97e..ed65097d2 100644 --- a/internal/cmd/quota/quota.go +++ b/internal/cmd/quota/quota.go @@ -1,16 +1,16 @@ package quota import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/quota/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "quota", Short: "Manage server quotas", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( list.NewCmd(params), ) diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 9f22b594a..9c43e2ca1 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/credentials/create/create_test.go b/internal/cmd/rabbitmq/credentials/create/create_test.go index b36306cd8..3286d4931 100644 --- a/internal/cmd/rabbitmq/credentials/create/create_test.go +++ b/internal/cmd/rabbitmq/credentials/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -205,7 +206,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/credentials/credentials.go b/internal/cmd/rabbitmq/credentials/credentials.go index 80c06fb8e..2f7c435e2 100644 --- a/internal/cmd/rabbitmq/credentials/credentials.go +++ b/internal/cmd/rabbitmq/credentials/credentials.go @@ -1,18 +1,18 @@ package credentials import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for RabbitMQ credentials", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/rabbitmq/credentials/delete/delete.go b/internal/cmd/rabbitmq/credentials/delete/delete.go index 20f868ddc..7dcd75143 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/credentials/describe/describe.go b/internal/cmd/rabbitmq/credentials/describe/describe.go index fb8d5ea6a..e17a39f73 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/credentials/describe/describe_test.go b/internal/cmd/rabbitmq/credentials/describe/describe_test.go index 0a466858c..b92353fb9 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe_test.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -223,7 +224,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index fd6921b8a..218b4a97f 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/credentials/list/list_test.go b/internal/cmd/rabbitmq/credentials/list/list_test.go index 86e36c0aa..d2593b39b 100644 --- a/internal/cmd/rabbitmq/credentials/list/list_test.go +++ b/internal/cmd/rabbitmq/credentials/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -197,7 +198,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index 143264140..2778e082a 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -56,7 +57,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/instance/create/create_test.go b/internal/cmd/rabbitmq/instance/create/create_test.go index c76fa6af3..8a267ca2a 100644 --- a/internal/cmd/rabbitmq/instance/create/create_test.go +++ b/internal/cmd/rabbitmq/instance/create/create_test.go @@ -5,12 +5,13 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -458,7 +459,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, &tt.args.model, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index 69f955ed5..8be4dacfb 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/instance/describe/describe.go b/internal/cmd/rabbitmq/instance/describe/describe.go index 60ca0bad3..8385bfe7e 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe.go +++ b/internal/cmd/rabbitmq/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/instance/describe/describe_test.go b/internal/cmd/rabbitmq/instance/describe/describe_test.go index b2e2d2a95..c92834466 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe_test.go +++ b/internal/cmd/rabbitmq/instance/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -203,7 +204,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/instance.go b/internal/cmd/rabbitmq/instance/instance.go index 2ad311846..fcbc2b7d9 100644 --- a/internal/cmd/rabbitmq/instance/instance.go +++ b/internal/cmd/rabbitmq/instance/instance.go @@ -1,19 +1,19 @@ package instance import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for RabbitMQ instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 2bf032e8c..715f6fa45 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all RabbitMQ instances", diff --git a/internal/cmd/rabbitmq/instance/list/list_test.go b/internal/cmd/rabbitmq/instance/list/list_test.go index 4f9a0ab7d..18bfa1817 100644 --- a/internal/cmd/rabbitmq/instance/list/list_test.go +++ b/internal/cmd/rabbitmq/instance/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -173,7 +174,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index 792e82681..f2a87e12b 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -57,7 +58,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a RabbitMQ instance", diff --git a/internal/cmd/rabbitmq/instance/update/update_test.go b/internal/cmd/rabbitmq/instance/update/update_test.go index 11198d9a6..2120ac96d 100644 --- a/internal/cmd/rabbitmq/instance/update/update_test.go +++ b/internal/cmd/rabbitmq/instance/update/update_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -293,7 +294,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/rabbitmq/plans/plans.go b/internal/cmd/rabbitmq/plans/plans.go index d62474125..cc9cc3e1b 100644 --- a/internal/cmd/rabbitmq/plans/plans.go +++ b/internal/cmd/rabbitmq/plans/plans.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all RabbitMQ service plans", diff --git a/internal/cmd/rabbitmq/plans/plans_test.go b/internal/cmd/rabbitmq/plans/plans_test.go index 486369731..f98191e88 100644 --- a/internal/cmd/rabbitmq/plans/plans_test.go +++ b/internal/cmd/rabbitmq/plans/plans_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -173,7 +174,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/rabbitmq/rabbitmq.go b/internal/cmd/rabbitmq/rabbitmq.go index 9dc5b76a3..23099b758 100644 --- a/internal/cmd/rabbitmq/rabbitmq.go +++ b/internal/cmd/rabbitmq/rabbitmq.go @@ -1,17 +1,17 @@ package rabbitmq import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq/plans" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "rabbitmq", Short: "Provides functionality for RabbitMQ", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(plans.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index 2b8e011da..c7793c1c7 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ShowPassword bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates credentials for a Redis instance", diff --git a/internal/cmd/redis/credentials/create/create_test.go b/internal/cmd/redis/credentials/create/create_test.go index fc968ce32..79d571121 100644 --- a/internal/cmd/redis/credentials/create/create_test.go +++ b/internal/cmd/redis/credentials/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -187,7 +188,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.instanceLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/credentials/credentials.go b/internal/cmd/redis/credentials/credentials.go index d1d8a4d7a..41a7b4f92 100644 --- a/internal/cmd/redis/credentials/credentials.go +++ b/internal/cmd/redis/credentials/credentials.go @@ -1,18 +1,18 @@ package credentials import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/create" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for Redis credentials", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/redis/credentials/delete/delete.go b/internal/cmd/redis/credentials/delete/delete.go index 34d0a12ac..2209c45b1 100644 --- a/internal/cmd/redis/credentials/delete/delete.go +++ b/internal/cmd/redis/credentials/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", credentialsIdArg), Short: "Deletes credentials of a Redis instance", diff --git a/internal/cmd/redis/credentials/describe/describe.go b/internal/cmd/redis/credentials/describe/describe.go index 36ada5448..115f23f4b 100644 --- a/internal/cmd/redis/credentials/describe/describe.go +++ b/internal/cmd/redis/credentials/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { CredentialsId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", credentialsIdArg), Short: "Shows details of credentials of a Redis instance", diff --git a/internal/cmd/redis/credentials/describe/describe_test.go b/internal/cmd/redis/credentials/describe/describe_test.go index b98c36631..7ee94e50c 100644 --- a/internal/cmd/redis/credentials/describe/describe_test.go +++ b/internal/cmd/redis/credentials/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -222,7 +223,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index 8f2dc6945..332ef35e0 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all credentials' IDs for a Redis instance", diff --git a/internal/cmd/redis/credentials/list/list_test.go b/internal/cmd/redis/credentials/list/list_test.go index cd986c587..fdf207e55 100644 --- a/internal/cmd/redis/credentials/list/list_test.go +++ b/internal/cmd/redis/credentials/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -198,7 +199,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, "dummy-instance-label", tt.args.credentials); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index d5a410d35..f6b4d050c 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Redis instance", diff --git a/internal/cmd/redis/instance/create/create_test.go b/internal/cmd/redis/instance/create/create_test.go index 6316e50b6..cc6baaeed 100644 --- a/internal/cmd/redis/instance/create/create_test.go +++ b/internal/cmd/redis/instance/create/create_test.go @@ -5,10 +5,11 @@ import ( "fmt" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -443,7 +444,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.instanceId, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/delete/delete.go b/internal/cmd/redis/instance/delete/delete.go index c6d3f271b..1b314ea33 100644 --- a/internal/cmd/redis/instance/delete/delete.go +++ b/internal/cmd/redis/instance/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a Redis instance", diff --git a/internal/cmd/redis/instance/describe/describe.go b/internal/cmd/redis/instance/describe/describe.go index 36e6d7b76..aaa003478 100644 --- a/internal/cmd/redis/instance/describe/describe.go +++ b/internal/cmd/redis/instance/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a Redis instance", diff --git a/internal/cmd/redis/instance/describe/describe_test.go b/internal/cmd/redis/instance/describe/describe_test.go index 9c1bf4e39..16a99ab65 100644 --- a/internal/cmd/redis/instance/describe/describe_test.go +++ b/internal/cmd/redis/instance/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -206,7 +207,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/instance.go b/internal/cmd/redis/instance/instance.go index a45e6bd96..82cbe63cd 100644 --- a/internal/cmd/redis/instance/instance.go +++ b/internal/cmd/redis/instance/instance.go @@ -1,19 +1,19 @@ package instance import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for Redis instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index 571004f47..2051f471e 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Redis instances", diff --git a/internal/cmd/redis/instance/list/list_test.go b/internal/cmd/redis/instance/list/list_test.go index fea12c21f..81053ecdd 100644 --- a/internal/cmd/redis/instance/list/list_test.go +++ b/internal/cmd/redis/instance/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -173,7 +174,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, "dummy-project-label", tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/instance/update/update.go b/internal/cmd/redis/instance/update/update.go index 5b254072e..98b192ad6 100644 --- a/internal/cmd/redis/instance/update/update.go +++ b/internal/cmd/redis/instance/update/update.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -54,7 +55,7 @@ type inputModel struct { PlanId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a Redis instance", diff --git a/internal/cmd/redis/instance/update/update_test.go b/internal/cmd/redis/instance/update/update_test.go index 7c5df24d5..c4bfedb8c 100644 --- a/internal/cmd/redis/instance/update/update_test.go +++ b/internal/cmd/redis/instance/update/update_test.go @@ -5,7 +5,8 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -279,7 +280,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index 83125b63a..f7ecfe5cf 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "plans", Short: "Lists all Redis service plans", diff --git a/internal/cmd/redis/plans/plans_test.go b/internal/cmd/redis/plans/plans_test.go index 919b8d01f..a18048cd6 100644 --- a/internal/cmd/redis/plans/plans_test.go +++ b/internal/cmd/redis/plans/plans_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -173,7 +174,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.plans); (err != nil) != tt.wantErr { diff --git a/internal/cmd/redis/redis.go b/internal/cmd/redis/redis.go index 4a45e9c33..e0716339b 100644 --- a/internal/cmd/redis/redis.go +++ b/internal/cmd/redis/redis.go @@ -1,17 +1,17 @@ package redis import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/redis/plans" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "redis", Short: "Provides functionality for Redis", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(plans.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 4e0ac6ea9..33b38ebfa 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -6,6 +6,8 @@ import ( "strings" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + affinityGroups "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups" "github.com/stackitcloud/stackit-cli/internal/cmd/auth" "github.com/stackitcloud/stackit-cli/internal/cmd/beta" @@ -26,7 +28,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/observability" "github.com/stackitcloud/stackit-cli/internal/cmd/opensearch" "github.com/stackitcloud/stackit-cli/internal/cmd/organization" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/postgresflex" "github.com/stackitcloud/stackit-cli/internal/cmd/project" publicip "github.com/stackitcloud/stackit-cli/internal/cmd/public-ip" @@ -116,7 +117,7 @@ func NewRootCmd(version, date string, p *print.Printer) *cobra.Command { err := configureFlags(cmd) cobra.CheckErr(err) - addSubcommands(cmd, ¶ms.CmdParams{ + addSubcommands(cmd, &types.CmdParams{ Printer: p, CliVersion: version, }) @@ -159,7 +160,7 @@ func configureFlags(cmd *cobra.Command) error { return nil } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(auth.NewCmd(params)) cmd.AddCommand(configCmd.NewCmd(params)) cmd.AddCommand(beta.NewCmd(params)) diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index 8f5401d9a..abc0bb5f2 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Acls *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Secrets Manager instance", diff --git a/internal/cmd/secrets-manager/instance/create/create_test.go b/internal/cmd/secrets-manager/instance/create/create_test.go index 641767b53..4cef0d887 100644 --- a/internal/cmd/secrets-manager/instance/create/create_test.go +++ b/internal/cmd/secrets-manager/instance/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -285,7 +286,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instanceId, tt.args.instance); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/instance/delete/delete.go b/internal/cmd/secrets-manager/instance/delete/delete.go index 2432c5a5e..ec8148e34 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete.go +++ b/internal/cmd/secrets-manager/instance/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", instanceIdArg), Short: "Deletes a Secrets Manager instance", diff --git a/internal/cmd/secrets-manager/instance/describe/describe.go b/internal/cmd/secrets-manager/instance/describe/describe.go index ed12cb1b0..bbd162bff 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe.go +++ b/internal/cmd/secrets-manager/instance/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { InstanceId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of a Secrets Manager instance", diff --git a/internal/cmd/secrets-manager/instance/describe/describe_test.go b/internal/cmd/secrets-manager/instance/describe/describe_test.go index 25ee15d66..c1e3e0bb7 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe_test.go +++ b/internal/cmd/secrets-manager/instance/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -248,7 +249,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instance, tt.args.aclList); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/instance/instance.go b/internal/cmd/secrets-manager/instance/instance.go index 5617aeddc..8edeb55fc 100644 --- a/internal/cmd/secrets-manager/instance/instance.go +++ b/internal/cmd/secrets-manager/instance/instance.go @@ -1,19 +1,19 @@ package instance import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/create" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/list" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "instance", Short: "Provides functionality for Secrets Manager instances", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index 9cd6b24ad..e32f99ed0 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Secrets Manager instances", diff --git a/internal/cmd/secrets-manager/instance/list/list_test.go b/internal/cmd/secrets-manager/instance/list/list_test.go index 2b416584d..fa1cc496a 100644 --- a/internal/cmd/secrets-manager/instance/list/list_test.go +++ b/internal/cmd/secrets-manager/instance/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instances); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/instance/update/update.go b/internal/cmd/secrets-manager/instance/update/update.go index d3caca348..c3cfb5956 100644 --- a/internal/cmd/secrets-manager/instance/update/update.go +++ b/internal/cmd/secrets-manager/instance/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Acls *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", instanceIdArg), Short: "Updates a Secrets Manager instance", diff --git a/internal/cmd/secrets-manager/instance/update/update_test.go b/internal/cmd/secrets-manager/instance/update/update_test.go index 1a60db361..24e14d1fb 100644 --- a/internal/cmd/secrets-manager/instance/update/update_test.go +++ b/internal/cmd/secrets-manager/instance/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -199,7 +200,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/secrets-manager/secrets_manager.go b/internal/cmd/secrets-manager/secrets_manager.go index 35745dfde..eb5632c4f 100644 --- a/internal/cmd/secrets-manager/secrets_manager.go +++ b/internal/cmd/secrets-manager/secrets_manager.go @@ -1,16 +1,16 @@ package secretsmanager import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "secrets-manager", Short: "Provides functionality for Secrets Manager", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) cmd.AddCommand(user.NewCmd(params)) } diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index 153bb5035..eba0d736b 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Write *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Secrets Manager user", diff --git a/internal/cmd/secrets-manager/user/create/create_test.go b/internal/cmd/secrets-manager/user/create/create_test.go index bbc606f1e..256a1f29a 100644 --- a/internal/cmd/secrets-manager/user/create/create_test.go +++ b/internal/cmd/secrets-manager/user/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -212,7 +213,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/user/delete/delete.go b/internal/cmd/secrets-manager/user/delete/delete.go index fb1972dbf..e2ad75eb5 100644 --- a/internal/cmd/secrets-manager/user/delete/delete.go +++ b/internal/cmd/secrets-manager/user/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", userIdArg), Short: "Deletes a Secrets Manager user", diff --git a/internal/cmd/secrets-manager/user/describe/describe.go b/internal/cmd/secrets-manager/user/describe/describe.go index 9a2a30280..5a658385c 100644 --- a/internal/cmd/secrets-manager/user/describe/describe.go +++ b/internal/cmd/secrets-manager/user/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { UserId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", userIdArg), Short: "Shows details of a Secrets Manager user", diff --git a/internal/cmd/secrets-manager/user/describe/describe_test.go b/internal/cmd/secrets-manager/user/describe/describe_test.go index f65790dfe..c267fe143 100644 --- a/internal/cmd/secrets-manager/user/describe/describe_test.go +++ b/internal/cmd/secrets-manager/user/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -223,7 +224,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.user); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index 249b0cee5..9b601d47a 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all Secrets Manager users", diff --git a/internal/cmd/secrets-manager/user/list/list_test.go b/internal/cmd/secrets-manager/user/list/list_test.go index cd395dc64..30ce25955 100644 --- a/internal/cmd/secrets-manager/user/list/list_test.go +++ b/internal/cmd/secrets-manager/user/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.users); (err != nil) != tt.wantErr { diff --git a/internal/cmd/secrets-manager/user/update/update.go b/internal/cmd/secrets-manager/user/update/update.go index c41c59b35..31a8e5a6e 100644 --- a/internal/cmd/secrets-manager/user/update/update.go +++ b/internal/cmd/secrets-manager/user/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { DisableWrite *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", userIdArg), Short: "Updates the write privileges Secrets Manager user", diff --git a/internal/cmd/secrets-manager/user/update/update_test.go b/internal/cmd/secrets-manager/user/update/update_test.go index 5ae24676b..830bacdfd 100644 --- a/internal/cmd/secrets-manager/user/update/update_test.go +++ b/internal/cmd/secrets-manager/user/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -190,7 +191,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/secrets-manager/user/user.go b/internal/cmd/secrets-manager/user/user.go index ae4e1c90f..738426858 100644 --- a/internal/cmd/secrets-manager/user/user.go +++ b/internal/cmd/secrets-manager/user/user.go @@ -2,10 +2,10 @@ package user import ( "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/create" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/describe" @@ -13,7 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/update" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "user", Short: "Provides functionality for Secrets Manager users", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index fd10a585d..b5e7143a2 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Stateful *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates security groups", diff --git a/internal/cmd/security-group/create/create_test.go b/internal/cmd/security-group/create/create_test.go index 9b6d8f92c..b025e7419 100644 --- a/internal/cmd/security-group/create/create_test.go +++ b/internal/cmd/security-group/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -256,7 +257,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.name, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 506dce800..37c0b283c 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { const groupIdArg = "GROUP_ID" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", groupIdArg), Short: "Deletes a security group", diff --git a/internal/cmd/security-group/delete/delete_test.go b/internal/cmd/security-group/delete/delete_test.go index e29d614e6..0416a41fe 100644 --- a/internal/cmd/security-group/delete/delete_test.go +++ b/internal/cmd/security-group/delete/delete_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -114,7 +115,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/security-group/describe/describe.go b/internal/cmd/security-group/describe/describe.go index 6d8d615b0..485c2f10d 100644 --- a/internal/cmd/security-group/describe/describe.go +++ b/internal/cmd/security-group/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { const groupIdArg = "GROUP_ID" -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", groupIdArg), Short: "Describes security groups", diff --git a/internal/cmd/security-group/describe/describe_test.go b/internal/cmd/security-group/describe/describe_test.go index 1c6f15431..9342e946e 100644 --- a/internal/cmd/security-group/describe/describe_test.go +++ b/internal/cmd/security-group/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -128,7 +129,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } @@ -225,7 +226,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index 159995162..a368152a6 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ const ( labelSelectorFlag = "label-selector" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists security groups", diff --git a/internal/cmd/security-group/list/list_test.go b/internal/cmd/security-group/list/list_test.go index 7e5515059..22c588604 100644 --- a/internal/cmd/security-group/list/list_test.go +++ b/internal/cmd/security-group/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -196,7 +197,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.items); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index 9c87570f3..5e08c09b0 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -51,7 +52,7 @@ type inputModel struct { ProtocolName *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a security group rule", diff --git a/internal/cmd/security-group/rule/create/create_test.go b/internal/cmd/security-group/rule/create/create_test.go index 4088823e4..5099c7ca3 100644 --- a/internal/cmd/security-group/rule/create/create_test.go +++ b/internal/cmd/security-group/rule/create/create_test.go @@ -4,12 +4,13 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -324,7 +325,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.securityGroupName, tt.args.securityGroupRule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index f0426854b..722142f9d 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { SecurityGroupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", securityGroupRuleIdArg), Short: "Deletes a security group rule", diff --git a/internal/cmd/security-group/rule/delete/delete_test.go b/internal/cmd/security-group/rule/delete/delete_test.go index 9f78a7e1a..0d6a9b4cb 100644 --- a/internal/cmd/security-group/rule/delete/delete_test.go +++ b/internal/cmd/security-group/rule/delete/delete_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -159,7 +160,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index 12d6edece..82486d989 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { SecurityGroupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", securityGroupRuleIdArg), Short: "Shows details of a security group rule", diff --git a/internal/cmd/security-group/rule/describe/describe_test.go b/internal/cmd/security-group/rule/describe/describe_test.go index 357457705..f1af54485 100644 --- a/internal/cmd/security-group/rule/describe/describe_test.go +++ b/internal/cmd/security-group/rule/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -227,7 +228,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.securityGroupRule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/list/list.go b/internal/cmd/security-group/rule/list/list.go index 7ddb33c7a..1d39e5ed8 100644 --- a/internal/cmd/security-group/rule/list/list.go +++ b/internal/cmd/security-group/rule/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { SecurityGroupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all security group rules in a security group of a project", diff --git a/internal/cmd/security-group/rule/list/list_test.go b/internal/cmd/security-group/rule/list/list_test.go index 92ba77801..166b58e58 100644 --- a/internal/cmd/security-group/rule/list/list_test.go +++ b/internal/cmd/security-group/rule/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -198,7 +199,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.securityGroupRules); (err != nil) != tt.wantErr { diff --git a/internal/cmd/security-group/rule/security_group_rule.go b/internal/cmd/security-group/rule/security_group_rule.go index 75f394384..fda58dd87 100644 --- a/internal/cmd/security-group/rule/security_group_rule.go +++ b/internal/cmd/security-group/rule/security_group_rule.go @@ -1,18 +1,18 @@ package rule import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/create" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "rule", Short: "Provides functionality for security group rules", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/security-group/security_group.go b/internal/cmd/security-group/security_group.go index 952da976c..ef613d054 100644 --- a/internal/cmd/security-group/security_group.go +++ b/internal/cmd/security-group/security_group.go @@ -1,7 +1,6 @@ package security_group import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/create" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/describe" @@ -9,13 +8,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/rule" "github.com/stackitcloud/stackit-cli/internal/cmd/security-group/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "security-group", Short: "Manage security groups", @@ -27,7 +27,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand( rule.NewCmd(params), create.NewCmd(params), diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index c9e255929..5a5039fa9 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ const ( labelsArg = "labels" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", groupNameArg), Short: "Updates a security group", diff --git a/internal/cmd/security-group/update/update_test.go b/internal/cmd/security-group/update/update_test.go index 081875080..115cdb32c 100644 --- a/internal/cmd/security-group/update/update_test.go +++ b/internal/cmd/security-group/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -214,7 +215,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) if err := globalflags.Configure(cmd.Flags()); err != nil { t.Errorf("cannot configure global flags: %v", err) } diff --git a/internal/cmd/server/backup/backup.go b/internal/cmd/server/backup/backup.go index e29887143..77d290a42 100644 --- a/internal/cmd/server/backup/backup.go +++ b/internal/cmd/server/backup/backup.go @@ -1,7 +1,6 @@ package backup import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/create" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/describe" @@ -12,12 +11,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule" volumebackup "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/volume-backup" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for server backups", @@ -29,7 +29,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(enable.NewCmd(params)) cmd.AddCommand(disable.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index 4ee1b42a4..c2ab4b028 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -4,9 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server Backup.", diff --git a/internal/cmd/server/backup/create/create_test.go b/internal/cmd/server/backup/create/create_test.go index 9f7799a7f..07d305320 100644 --- a/internal/cmd/server/backup/create/create_test.go +++ b/internal/cmd/server/backup/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -192,7 +193,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/delete/delete.go b/internal/cmd/server/backup/delete/delete.go index f89a451b1..e4cb8118d 100644 --- a/internal/cmd/server/backup/delete/delete.go +++ b/internal/cmd/server/backup/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", backupIdArg), Short: "Deletes a Server Backup.", diff --git a/internal/cmd/server/backup/describe/describe.go b/internal/cmd/server/backup/describe/describe.go index 5289a31d4..b303028c3 100644 --- a/internal/cmd/server/backup/describe/describe.go +++ b/internal/cmd/server/backup/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strconv" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { BackupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Shows details of a Server Backup", diff --git a/internal/cmd/server/backup/describe/describe_test.go b/internal/cmd/server/backup/describe/describe_test.go index 2e3c10af2..1550a9c4e 100644 --- a/internal/cmd/server/backup/describe/describe_test.go +++ b/internal/cmd/server/backup/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -191,7 +192,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backup); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index 7fc57c79b..a9cc28ac4 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables Server Backup service", diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index 369434d55..419d54076 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables Server Backup service", diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index 0e9856d4f..7f60f6a70 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server backups", diff --git a/internal/cmd/server/backup/list/list_test.go b/internal/cmd/server/backup/list/list_test.go index a265c6779..a316ee0c4 100644 --- a/internal/cmd/server/backup/list/list_test.go +++ b/internal/cmd/server/backup/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backups); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/restore/restore.go b/internal/cmd/server/backup/restore/restore.go index ffca1ca53..8d3899dd5 100644 --- a/internal/cmd/server/backup/restore/restore.go +++ b/internal/cmd/server/backup/restore/restore.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", backupIdArg), Short: "Restores a Server Backup.", diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index 415f58a8f..9f113f0e6 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -4,9 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -47,7 +48,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server Backup Schedule", diff --git a/internal/cmd/server/backup/schedule/create/create_test.go b/internal/cmd/server/backup/schedule/create/create_test.go index 5f4d51733..548a93bd4 100644 --- a/internal/cmd/server/backup/schedule/create/create_test.go +++ b/internal/cmd/server/backup/schedule/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -202,7 +203,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/schedule/delete/delete.go b/internal/cmd/server/backup/schedule/delete/delete.go index 344ad02c0..498f7cacd 100644 --- a/internal/cmd/server/backup/schedule/delete/delete.go +++ b/internal/cmd/server/backup/schedule/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", scheduleIdArg), Short: "Deletes a Server Backup Schedule", diff --git a/internal/cmd/server/backup/schedule/describe/describe.go b/internal/cmd/server/backup/schedule/describe/describe.go index 4b5b7079f..a4e3b1f21 100644 --- a/internal/cmd/server/backup/schedule/describe/describe.go +++ b/internal/cmd/server/backup/schedule/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { BackupScheduleId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupScheduleIdArg), Short: "Shows details of a Server Backup Schedule", diff --git a/internal/cmd/server/backup/schedule/describe/describe_test.go b/internal/cmd/server/backup/schedule/describe/describe_test.go index 5d1f51e3a..e5808e545 100644 --- a/internal/cmd/server/backup/schedule/describe/describe_test.go +++ b/internal/cmd/server/backup/schedule/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -218,7 +219,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index 3111ea55f..58f8f7ac9 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server backup schedules", diff --git a/internal/cmd/server/backup/schedule/list/list_test.go b/internal/cmd/server/backup/schedule/list/list_test.go index 2234b0397..9c08b0f5d 100644 --- a/internal/cmd/server/backup/schedule/list/list_test.go +++ b/internal/cmd/server/backup/schedule/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedules); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/schedule/schedule.go b/internal/cmd/server/backup/schedule/schedule.go index 1ce797c4f..fd93c4cde 100644 --- a/internal/cmd/server/backup/schedule/schedule.go +++ b/internal/cmd/server/backup/schedule/schedule.go @@ -1,19 +1,19 @@ package schedule import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/create" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/schedule/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "schedule", Short: "Provides functionality for Server Backup Schedule", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/server/backup/schedule/update/update.go b/internal/cmd/server/backup/schedule/update/update.go index 6d9d2aa69..3a54a12eb 100644 --- a/internal/cmd/server/backup/schedule/update/update.go +++ b/internal/cmd/server/backup/schedule/update/update.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -47,7 +48,7 @@ type inputModel struct { BackupVolumeIds []string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", scheduleIdArg), Short: "Updates a Server Backup Schedule", diff --git a/internal/cmd/server/backup/schedule/update/update_test.go b/internal/cmd/server/backup/schedule/update/update_test.go index 263a9188a..fc42794a0 100644 --- a/internal/cmd/server/backup/schedule/update/update_test.go +++ b/internal/cmd/server/backup/schedule/update/update_test.go @@ -5,7 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -184,7 +185,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -296,7 +297,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/backup/volume-backup/delete/delete.go b/internal/cmd/server/backup/volume-backup/delete/delete.go index fc3cbced4..f13d85633 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", volumeBackupIdArg), Short: "Deletes a Server Volume Backup.", diff --git a/internal/cmd/server/backup/volume-backup/restore/restore.go b/internal/cmd/server/backup/volume-backup/restore/restore.go index d29b21681..676b5135e 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { RestoreVolumeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", volumeBackupIdArg), Short: "Restore a Server Volume Backup to a volume.", diff --git a/internal/cmd/server/backup/volume-backup/volumebackup.go b/internal/cmd/server/backup/volume-backup/volumebackup.go index e0d3b6d62..5bdf0f72d 100644 --- a/internal/cmd/server/backup/volume-backup/volumebackup.go +++ b/internal/cmd/server/backup/volume-backup/volumebackup.go @@ -1,16 +1,16 @@ package volumebackup import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/volume-backup/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup/volume-backup/restore" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "volume-backup", Short: "Provides functionality for Server Backup Volume Backups", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(del.NewCmd(params)) cmd.AddCommand(restore.NewCmd(params)) } diff --git a/internal/cmd/server/command/command.go b/internal/cmd/server/command/command.go index e6c2d79a8..ccd8978fd 100644 --- a/internal/cmd/server/command/command.go +++ b/internal/cmd/server/command/command.go @@ -1,18 +1,18 @@ package command import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/create" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/template" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "command", Short: "Provides functionality for Server Command", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index a95838116..1937f4e28 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Params *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server Command", diff --git a/internal/cmd/server/command/create/create_test.go b/internal/cmd/server/command/create/create_test.go index cb2368d6f..5b19bf508 100644 --- a/internal/cmd/server/command/create/create_test.go +++ b/internal/cmd/server/command/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -187,7 +188,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/describe/describe.go b/internal/cmd/server/command/describe/describe.go index c734cd137..8ca9b6aa3 100644 --- a/internal/cmd/server/command/describe/describe.go +++ b/internal/cmd/server/command/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { CommandId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", commandIdArg), Short: "Shows details of a Server Command", diff --git a/internal/cmd/server/command/describe/describe_test.go b/internal/cmd/server/command/describe/describe_test.go index 89689817d..5ad83715a 100644 --- a/internal/cmd/server/command/describe/describe_test.go +++ b/internal/cmd/server/command/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -216,7 +217,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.command); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index 052f13766..e5607abd0 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server commands", diff --git a/internal/cmd/server/command/list/list_test.go b/internal/cmd/server/command/list/list_test.go index 9af1dfc05..bb806598d 100644 --- a/internal/cmd/server/command/list/list_test.go +++ b/internal/cmd/server/command/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -172,7 +173,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.commands); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index 120040660..a70ee5ae2 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { CommandTemplateName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", commandTemplateNameArg), Short: "Shows details of a Server Command Template", diff --git a/internal/cmd/server/command/template/describe/describe_test.go b/internal/cmd/server/command/template/describe/describe_test.go index 45cbe627a..aaa90096a 100644 --- a/internal/cmd/server/command/template/describe/describe_test.go +++ b/internal/cmd/server/command/template/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -216,7 +217,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.commandTemplate); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index ffd76ac24..723772b45 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server command templates", diff --git a/internal/cmd/server/command/template/list/list_test.go b/internal/cmd/server/command/template/list/list_test.go index 9255b13fe..df57cce22 100644 --- a/internal/cmd/server/command/template/list/list_test.go +++ b/internal/cmd/server/command/template/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -171,7 +172,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.templates); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/command/template/template.go b/internal/cmd/server/command/template/template.go index 6b41f434b..5607fa5c4 100644 --- a/internal/cmd/server/command/template/template.go +++ b/internal/cmd/server/command/template/template.go @@ -1,16 +1,16 @@ package template import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/template/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command/template/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "template", Short: "Provides functionality for Server Command Template", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index ea363c540..23e7f5c10 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -5,7 +5,8 @@ import ( "fmt" "net/url" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("console %s", serverIdArg), Short: "Gets a URL for server remote console", diff --git a/internal/cmd/server/console/console_test.go b/internal/cmd/server/console/console_test.go index a449d49bc..6fa46ba1b 100644 --- a/internal/cmd/server/console/console_test.go +++ b/internal/cmd/server/console/console_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -193,7 +194,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.serverUrl); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index afd46385c..841f21d1d 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -64,7 +65,7 @@ type inputModel struct { Volumes *[]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a server", diff --git a/internal/cmd/server/create/create_test.go b/internal/cmd/server/create/create_test.go index 1270eed51..521b80922 100644 --- a/internal/cmd/server/create/create_test.go +++ b/internal/cmd/server/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -403,7 +404,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.server); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index b55da54b2..9c8d7971c 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("deallocate %s", serverIdArg), Short: "Deallocates an existing server", diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index 1a63f5ae1..85c264b5e 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", serverIdArg), Short: "Deletes a server", diff --git a/internal/cmd/server/describe/describe.go b/internal/cmd/server/describe/describe.go index 3058cd465..f13e6f5c8 100644 --- a/internal/cmd/server/describe/describe.go +++ b/internal/cmd/server/describe/describe.go @@ -6,7 +6,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", serverIdArg), Short: "Shows details of a server", diff --git a/internal/cmd/server/describe/describe_test.go b/internal/cmd/server/describe/describe_test.go index af975d7c6..0b835a8da 100644 --- a/internal/cmd/server/describe/describe_test.go +++ b/internal/cmd/server/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -202,7 +203,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.server); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/list/list.go b/internal/cmd/server/list/list.go index 98faf6365..54c058dc0 100644 --- a/internal/cmd/server/list/list.go +++ b/internal/cmd/server/list/list.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all servers of a project", diff --git a/internal/cmd/server/list/list_test.go b/internal/cmd/server/list/list_test.go index f23efc370..4eb3a78cf 100644 --- a/internal/cmd/server/list/list_test.go +++ b/internal/cmd/server/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -190,7 +191,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.servers); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index 6b6a59f67..a211a44c1 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Length *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("log %s", serverIdArg), Short: "Gets server console log", diff --git a/internal/cmd/server/log/log_test.go b/internal/cmd/server/log/log_test.go index e9c0c657a..87375530f 100644 --- a/internal/cmd/server/log/log_test.go +++ b/internal/cmd/server/log/log_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -199,7 +200,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.log); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index 2fbdae1de..d496d5a83 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { MachineType string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", machineTypeArg), Short: "Shows details of a server machine type", diff --git a/internal/cmd/server/machine-type/describe/describe_test.go b/internal/cmd/server/machine-type/describe/describe_test.go index f423455f6..4343f6fb6 100644 --- a/internal/cmd/server/machine-type/describe/describe_test.go +++ b/internal/cmd/server/machine-type/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -181,7 +182,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.machineType); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index db88e7be5..9dc3aad50 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ const ( limitFlag = "limit" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Get list of all machine types available in a project", diff --git a/internal/cmd/server/machine-type/list/list_test.go b/internal/cmd/server/machine-type/list/list_test.go index 55b5c3c4a..8b07ca64c 100644 --- a/internal/cmd/server/machine-type/list/list_test.go +++ b/internal/cmd/server/machine-type/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -175,7 +176,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.machineTypes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/machine-type/machine-type.go b/internal/cmd/server/machine-type/machine-type.go index 9482a6143..ee4e2ae54 100644 --- a/internal/cmd/server/machine-type/machine-type.go +++ b/internal/cmd/server/machine-type/machine-type.go @@ -1,16 +1,16 @@ package machinetype import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/machine-type/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/machine-type/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "machine-type", Short: "Provides functionality for server machine types available inside a project", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 639c070a0..3e98a366e 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -36,7 +36,7 @@ type inputModel struct { Create *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "attach", Short: "Attaches a network interface to a server", @@ -134,7 +134,7 @@ func configureFlags(cmd *cobra.Command) { func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } // if create is not provided then network-interface-id is needed diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index 287b715f4..1e8babe16 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -4,10 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -36,7 +36,7 @@ type inputModel struct { Delete *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "detach", Short: "Detaches a network interface from a server", @@ -136,7 +136,7 @@ func configureFlags(cmd *cobra.Command) { func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { globalFlags := globalflags.Parse(p, cmd) if globalFlags.ProjectId == "" { - return nil, &errors.ProjectIdError{} + return nil, &cliErr.ProjectIdError{} } // if delete is not provided then network-interface-id is needed diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index a63095dd6..607798a89 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all attached network interfaces of a server", diff --git a/internal/cmd/server/network-interface/list/list_test.go b/internal/cmd/server/network-interface/list/list_test.go index 3c93f92c3..27f411166 100644 --- a/internal/cmd/server/network-interface/list/list_test.go +++ b/internal/cmd/server/network-interface/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -204,7 +205,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverId, tt.args.serverNics); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/network-interface/network-interface.go b/internal/cmd/server/network-interface/network-interface.go index 998ee07d3..2496def12 100644 --- a/internal/cmd/server/network-interface/network-interface.go +++ b/internal/cmd/server/network-interface/network-interface.go @@ -1,17 +1,17 @@ package networkinterface import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/network-interface/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/network-interface/detach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/network-interface/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "network-interface", Short: "Allows attaching/detaching network interfaces to servers", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(attach.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(detach.NewCmd(params)) diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index 1c8bddf44..eac250845 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -4,9 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { MaintenanceWindow int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server os-update.", diff --git a/internal/cmd/server/os-update/create/create_test.go b/internal/cmd/server/os-update/create/create_test.go index 073ea1db6..c95f62de3 100644 --- a/internal/cmd/server/os-update/create/create_test.go +++ b/internal/cmd/server/os-update/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -190,7 +191,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/describe/describe.go b/internal/cmd/server/os-update/describe/describe.go index 5686ff5be..026cec137 100644 --- a/internal/cmd/server/os-update/describe/describe.go +++ b/internal/cmd/server/os-update/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { UpdateId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", updateIdArg), Short: "Shows details of a Server os-update", diff --git a/internal/cmd/server/os-update/describe/describe_test.go b/internal/cmd/server/os-update/describe/describe_test.go index 32dfa4334..646b5ac87 100644 --- a/internal/cmd/server/os-update/describe/describe_test.go +++ b/internal/cmd/server/os-update/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -186,7 +187,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.update); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index 81086b85f..c0cc0bb8d 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables server os-update service", diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index c2538aa0f..5e25334bb 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables Server os-update service", diff --git a/internal/cmd/server/os-update/list/list.go b/internal/cmd/server/os-update/list/list.go index 94112f256..7ff61504e 100644 --- a/internal/cmd/server/os-update/list/list.go +++ b/internal/cmd/server/os-update/list/list.go @@ -5,7 +5,8 @@ import ( "fmt" "strconv" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server os-updates", diff --git a/internal/cmd/server/os-update/list/list_test.go b/internal/cmd/server/os-update/list/list_test.go index 541ad0567..99cf70484 100644 --- a/internal/cmd/server/os-update/list/list_test.go +++ b/internal/cmd/server/os-update/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -172,7 +173,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.updates); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/os-update.go b/internal/cmd/server/os-update/os-update.go index 516d7ce06..53abb7893 100644 --- a/internal/cmd/server/os-update/os-update.go +++ b/internal/cmd/server/os-update/os-update.go @@ -1,7 +1,6 @@ package osupdate import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/create" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/disable" @@ -9,12 +8,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "os-update", Short: "Provides functionality for managed server updates", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index b9c1e3a1a..446859534 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -42,7 +43,7 @@ type inputModel struct { MaintenanceWindow int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a Server os-update Schedule", diff --git a/internal/cmd/server/os-update/schedule/create/create_test.go b/internal/cmd/server/os-update/schedule/create/create_test.go index c944e63e7..1e29f4f30 100644 --- a/internal/cmd/server/os-update/schedule/create/create_test.go +++ b/internal/cmd/server/os-update/schedule/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -197,7 +198,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/schedule/delete/delete.go b/internal/cmd/server/os-update/schedule/delete/delete.go index f97ee0ec6..de1d19d3e 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete.go +++ b/internal/cmd/server/os-update/schedule/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", scheduleIdArg), Short: "Deletes a Server os-update Schedule", diff --git a/internal/cmd/server/os-update/schedule/describe/describe.go b/internal/cmd/server/os-update/schedule/describe/describe.go index c7e9a9e93..4e68b04bd 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/server/os-update/schedule/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ScheduleId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", scheduleIdArg), Short: "Shows details of a Server os-update Schedule", diff --git a/internal/cmd/server/os-update/schedule/describe/describe_test.go b/internal/cmd/server/os-update/schedule/describe/describe_test.go index 1f938f1de..0904ac5b5 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe_test.go +++ b/internal/cmd/server/os-update/schedule/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -186,7 +187,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedule); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index 4047fba6d..0e300e547 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -4,10 +4,11 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server os-update schedules", diff --git a/internal/cmd/server/os-update/schedule/list/list_test.go b/internal/cmd/server/os-update/schedule/list/list_test.go index f39c88508..5f4fceebc 100644 --- a/internal/cmd/server/os-update/schedule/list/list_test.go +++ b/internal/cmd/server/os-update/schedule/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -172,7 +173,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.schedules); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/os-update/schedule/schedule.go b/internal/cmd/server/os-update/schedule/schedule.go index 3ffeb36ea..d3ccd6b63 100644 --- a/internal/cmd/server/os-update/schedule/schedule.go +++ b/internal/cmd/server/os-update/schedule/schedule.go @@ -1,19 +1,19 @@ package schedule import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/create" del "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/os-update/schedule/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "schedule", Short: "Provides functionality for Server os-update Schedule", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index 78570839e..59ca210b1 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -42,7 +43,7 @@ type inputModel struct { MaintenanceWindow *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", scheduleIdArg), Short: "Updates a Server os-update Schedule", diff --git a/internal/cmd/server/os-update/schedule/update/update_test.go b/internal/cmd/server/os-update/schedule/update/update_test.go index a19c77958..e3cf7c7ab 100644 --- a/internal/cmd/server/os-update/schedule/update/update_test.go +++ b/internal/cmd/server/os-update/schedule/update/update_test.go @@ -5,7 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -174,7 +175,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -286,7 +287,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 3f76d8852..52ef99867 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("attach %s", publicIpIdArg), Short: "Attaches a public IP to a server", diff --git a/internal/cmd/server/public-ip/attach/attach_test.go b/internal/cmd/server/public-ip/attach/attach_test.go index 3f0e10763..4aef71f1f 100644 --- a/internal/cmd/server/public-ip/attach/attach_test.go +++ b/internal/cmd/server/public-ip/attach/attach_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -151,7 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index ecf43cba5..adfa2ad47 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { PublicIpId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("detach %s", publicIpIdArg), Short: "Detaches a public IP from a server", diff --git a/internal/cmd/server/public-ip/detach/detach_test.go b/internal/cmd/server/public-ip/detach/detach_test.go index ccea98e12..99251eae0 100644 --- a/internal/cmd/server/public-ip/detach/detach_test.go +++ b/internal/cmd/server/public-ip/detach/detach_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -150,7 +151,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/public-ip/public_ip.go b/internal/cmd/server/public-ip/public_ip.go index 494993ce8..db04a0a67 100644 --- a/internal/cmd/server/public-ip/public_ip.go +++ b/internal/cmd/server/public-ip/public_ip.go @@ -1,16 +1,16 @@ package publicip import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/public-ip/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/public-ip/detach" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "public-ip", Short: "Allows attaching/detaching public IPs to servers", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(attach.NewCmd(params)) cmd.AddCommand(detach.NewCmd(params)) } diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index ed13d02ce..4f4b3e268 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { HardReboot bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reboot %s", serverIdArg), Short: "Reboots a server", diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index 3ae4f99b5..746fbadc4 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { ImageId *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("rescue %s", serverIdArg), Short: "Rescues an existing server", diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index 329d5a6b4..495098b40 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { MachineType *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("resize %s", serverIdArg), Short: "Resizes the server to the given machine type", diff --git a/internal/cmd/server/server.go b/internal/cmd/server/server.go index ac3101b41..e671fda2b 100644 --- a/internal/cmd/server/server.go +++ b/internal/cmd/server/server.go @@ -1,7 +1,6 @@ package server import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/backup" "github.com/stackitcloud/stackit-cli/internal/cmd/server/command" "github.com/stackitcloud/stackit-cli/internal/cmd/server/console" @@ -24,6 +23,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/unrescue" "github.com/stackitcloud/stackit-cli/internal/cmd/server/update" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -31,7 +31,7 @@ import ( "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "server", Short: "Provides functionality for servers", @@ -43,7 +43,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(backup.NewCmd(params)) cmd.AddCommand(command.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index 5644ee45f..1bf853199 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ServiceAccMail string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("attach %s", serviceAccMailArg), Short: "Attach a service account to a server", diff --git a/internal/cmd/server/service-account/attach/attach_test.go b/internal/cmd/server/service-account/attach/attach_test.go index 0edf073b4..b34109960 100644 --- a/internal/cmd/server/service-account/attach/attach_test.go +++ b/internal/cmd/server/service-account/attach/attach_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -151,7 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -249,7 +250,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccMail, tt.args.serverLabel, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index 59966f6d5..ab9fbbe03 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { ServiceAccMail string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("detach %s", serviceAccMailArg), Short: "Detach a service account from a server", diff --git a/internal/cmd/server/service-account/detach/detach_test.go b/internal/cmd/server/service-account/detach/detach_test.go index a1e6c89cd..0867408f1 100644 --- a/internal/cmd/server/service-account/detach/detach_test.go +++ b/internal/cmd/server/service-account/detach/detach_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -151,7 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -249,7 +250,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccMail, tt.args.serverLabel, tt.args.service); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/service-account/list/list.go b/internal/cmd/server/service-account/list/list.go index 95773fc6e..a8188b65b 100644 --- a/internal/cmd/server/service-account/list/list.go +++ b/internal/cmd/server/service-account/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "List all attached service accounts for a server", diff --git a/internal/cmd/server/service-account/list/list_test.go b/internal/cmd/server/service-account/list/list_test.go index a58d5e671..a239a9392 100644 --- a/internal/cmd/server/service-account/list/list_test.go +++ b/internal/cmd/server/service-account/list/list_test.go @@ -5,7 +5,8 @@ import ( "strconv" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -217,7 +218,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverId, tt.args.serverName, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/service-account/service-account.go b/internal/cmd/server/service-account/service-account.go index b9455c563..6bb4576ba 100644 --- a/internal/cmd/server/service-account/service-account.go +++ b/internal/cmd/server/service-account/service-account.go @@ -2,8 +2,8 @@ package serviceaccount import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/detach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/list" @@ -11,7 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "service-account", Short: "Allows attaching/detaching service accounts to servers", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(attach.NewCmd(params)) cmd.AddCommand(detach.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index e025e2890..3dc23ff31 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("start %s", serverIdArg), Short: "Starts an existing server or allocates the server if deallocated", diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index 958127da7..07a8008c3 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("stop %s", serverIdArg), Short: "Stops an existing server", diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index 6f433ebeb..e65d13d6e 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("unrescue %s", serverIdArg), Short: "Unrescues an existing server", diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index f8b404794..76973b91c 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", serverIdArg), Short: "Updates a server", diff --git a/internal/cmd/server/update/update_test.go b/internal/cmd/server/update/update_test.go index d13d32c87..7aea4f1c1 100644 --- a/internal/cmd/server/update/update_test.go +++ b/internal/cmd/server/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -178,7 +179,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -275,7 +276,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.server); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index 65a631ddf..f8bf74a2f 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { DeleteOnTermination *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("attach %s", volumeIdArg), Short: "Attaches a volume to a server", diff --git a/internal/cmd/server/volume/attach/attach_test.go b/internal/cmd/server/volume/attach/attach_test.go index 2f3ed3e69..69bffcfee 100644 --- a/internal/cmd/server/volume/attach/attach_test.go +++ b/internal/cmd/server/volume/attach/attach_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -177,7 +178,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -275,7 +276,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.serverLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 4c0288851..385b585bf 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { VolumeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", volumeIdArg), Short: "Describes a server volume attachment", diff --git a/internal/cmd/server/volume/describe/describe_test.go b/internal/cmd/server/volume/describe/describe_test.go index 3d6634075..2e88ae1c4 100644 --- a/internal/cmd/server/volume/describe/describe_test.go +++ b/internal/cmd/server/volume/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -151,7 +152,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -249,7 +250,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.volumeLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index 5c271b8fe..7ae8dee8e 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { VolumeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("detach %s", volumeIdArg), Short: "Detaches a volume from a server", diff --git a/internal/cmd/server/volume/detach/detach_test.go b/internal/cmd/server/volume/detach/detach_test.go index e9ebecb32..a9b5843b1 100644 --- a/internal/cmd/server/volume/detach/detach_test.go +++ b/internal/cmd/server/volume/detach/detach_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -150,7 +151,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index 4dddab072..10df56261 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { ServerId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all server volumes", diff --git a/internal/cmd/server/volume/list/list_test.go b/internal/cmd/server/volume/list/list_test.go index 82e73dff8..ea65dc2cb 100644 --- a/internal/cmd/server/volume/list/list_test.go +++ b/internal/cmd/server/volume/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -187,7 +188,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serverLabel, tt.args.volumeNames, tt.args.volumes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 12c7e66ee..b3faf2d2f 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { DeleteOnTermination *bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", volumeIdArg), Short: "Updates an attached volume of a server", diff --git a/internal/cmd/server/volume/update/update_test.go b/internal/cmd/server/volume/update/update_test.go index a15d5e810..532b37d5a 100644 --- a/internal/cmd/server/volume/update/update_test.go +++ b/internal/cmd/server/volume/update/update_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -176,7 +177,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -274,7 +275,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.serverLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/server/volume/volume.go b/internal/cmd/server/volume/volume.go index 15dd14ef7..444ef040b 100644 --- a/internal/cmd/server/volume/volume.go +++ b/internal/cmd/server/volume/volume.go @@ -1,19 +1,19 @@ package volume import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/attach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/detach" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/list" "github.com/stackitcloud/stackit-cli/internal/cmd/server/volume/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "volume", Short: "Provides functionality for server volumes", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(attach.NewCmd(params)) cmd.AddCommand(detach.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index 73618ca1f..aca5c8133 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Name *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a service account", diff --git a/internal/cmd/service-account/create/create_test.go b/internal/cmd/service-account/create/create_test.go index 2f95584f8..5418822eb 100644 --- a/internal/cmd/service-account/create/create_test.go +++ b/internal/cmd/service-account/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -177,7 +178,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.serviceAccount); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/delete/delete.go b/internal/cmd/service-account/delete/delete.go index ad0a9dc45..ff843534d 100644 --- a/internal/cmd/service-account/delete/delete.go +++ b/internal/cmd/service-account/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -25,7 +26,7 @@ type inputModel struct { Email string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", emailArg), Short: "Deletes a service account", diff --git a/internal/cmd/service-account/get-jwks/get_jwks.go b/internal/cmd/service-account/get-jwks/get_jwks.go index a99655c1c..340df926f 100644 --- a/internal/cmd/service-account/get-jwks/get_jwks.go +++ b/internal/cmd/service-account/get-jwks/get_jwks.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -23,7 +24,7 @@ type inputModel struct { Email string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("get-jwks %s", emailArg), Short: "Shows the JWKS for a service account", diff --git a/internal/cmd/service-account/get-jwks/get_jwks_test.go b/internal/cmd/service-account/get-jwks/get_jwks_test.go index c418ffb22..cd1ed4435 100644 --- a/internal/cmd/service-account/get-jwks/get_jwks_test.go +++ b/internal/cmd/service-account/get-jwks/get_jwks_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -70,7 +71,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -169,7 +170,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/key/create/create.go b/internal/cmd/service-account/key/create/create.go index e23d11cc8..6af133cdc 100644 --- a/internal/cmd/service-account/key/create/create.go +++ b/internal/cmd/service-account/key/create/create.go @@ -6,7 +6,8 @@ import ( "fmt" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { PublicKey *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a service account key", diff --git a/internal/cmd/service-account/key/delete/delete.go b/internal/cmd/service-account/key/delete/delete.go index 61c551652..b6ff682d8 100644 --- a/internal/cmd/service-account/key/delete/delete.go +++ b/internal/cmd/service-account/key/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { KeyId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", keyIdArg), Short: "Deletes a service account key", diff --git a/internal/cmd/service-account/key/describe/describe.go b/internal/cmd/service-account/key/describe/describe.go index 8fdc2d7c1..84fb62dd8 100644 --- a/internal/cmd/service-account/key/describe/describe.go +++ b/internal/cmd/service-account/key/describe/describe.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { KeyId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", keyIdArg), Short: "Shows details of a service account key", diff --git a/internal/cmd/service-account/key/describe/describe_test.go b/internal/cmd/service-account/key/describe/describe_test.go index 38a7af958..5884f4ce4 100644 --- a/internal/cmd/service-account/key/describe/describe_test.go +++ b/internal/cmd/service-account/key/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -208,7 +209,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.key); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/key/key.go b/internal/cmd/service-account/key/key.go index b91d31b6a..36d982f4e 100644 --- a/internal/cmd/service-account/key/key.go +++ b/internal/cmd/service-account/key/key.go @@ -1,19 +1,19 @@ package key import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/create" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/list" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/key/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "key", Short: "Provides functionality for service account keys", @@ -25,7 +25,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index bd7184caa..e450ef021 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all service account keys", diff --git a/internal/cmd/service-account/key/list/list_test.go b/internal/cmd/service-account/key/list/list_test.go index 845c5cae9..043b1b522 100644 --- a/internal/cmd/service-account/key/list/list_test.go +++ b/internal/cmd/service-account/key/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.keys); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/key/update/update.go b/internal/cmd/service-account/key/update/update.go index ff3387965..fd5d3383a 100644 --- a/internal/cmd/service-account/key/update/update.go +++ b/internal/cmd/service-account/key/update/update.go @@ -6,7 +6,8 @@ import ( "fmt" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { Deactivate bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", keyIdArg), Short: "Updates a service account key", diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index 7dcd16322..f444e83b3 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all service accounts", diff --git a/internal/cmd/service-account/list/list_test.go b/internal/cmd/service-account/list/list_test.go index f6bcc47ec..051d78044 100644 --- a/internal/cmd/service-account/list/list_test.go +++ b/internal/cmd/service-account/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -179,7 +180,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccounts); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/service_account.go b/internal/cmd/service-account/service_account.go index 9c2462bfa..856be2fba 100644 --- a/internal/cmd/service-account/service_account.go +++ b/internal/cmd/service-account/service_account.go @@ -1,7 +1,6 @@ package serviceaccount import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/create" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/delete" getjwks "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/get-jwks" @@ -9,12 +8,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/list" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "service-account", Short: "Provides functionality for service accounts", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index d01da3a99..ea0b1f39d 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { TTLDays *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates an access token for a service account", diff --git a/internal/cmd/service-account/token/create/create_test.go b/internal/cmd/service-account/token/create/create_test.go index a7935e1a7..3dfc4340b 100644 --- a/internal/cmd/service-account/token/create/create_test.go +++ b/internal/cmd/service-account/token/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -183,7 +184,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.serviceAccountEmail, tt.args.token); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/token/list/list.go b/internal/cmd/service-account/token/list/list.go index 7e8f6e12d..436d599f6 100644 --- a/internal/cmd/service-account/token/list/list.go +++ b/internal/cmd/service-account/token/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists access tokens of a service account", diff --git a/internal/cmd/service-account/token/list/list_test.go b/internal/cmd/service-account/token/list/list_test.go index c4cbcf9df..1410b275a 100644 --- a/internal/cmd/service-account/token/list/list_test.go +++ b/internal/cmd/service-account/token/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.tokensMetadata); (err != nil) != tt.wantErr { diff --git a/internal/cmd/service-account/token/revoke/revoke.go b/internal/cmd/service-account/token/revoke/revoke.go index a3bd60f3a..ee3c05a81 100644 --- a/internal/cmd/service-account/token/revoke/revoke.go +++ b/internal/cmd/service-account/token/revoke/revoke.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { TokenId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("revoke %s", tokenIdArg), Short: "Revokes an access token of a service account", diff --git a/internal/cmd/service-account/token/token.go b/internal/cmd/service-account/token/token.go index ce4b4eac6..5faeff394 100644 --- a/internal/cmd/service-account/token/token.go +++ b/internal/cmd/service-account/token/token.go @@ -1,17 +1,17 @@ package token import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token/create" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token/list" "github.com/stackitcloud/stackit-cli/internal/cmd/service-account/token/revoke" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "token", Short: "Provides functionality for service account tokens", @@ -23,7 +23,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(revoke.NewCmd(params)) diff --git a/internal/cmd/ske/cluster/cluster.go b/internal/cmd/ske/cluster/cluster.go index 87994c2fa..e4dd6bcbb 100644 --- a/internal/cmd/ske/cluster/cluster.go +++ b/internal/cmd/ske/cluster/cluster.go @@ -1,7 +1,6 @@ package cluster import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/create" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/describe" @@ -13,12 +12,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/update" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster/wakeup" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "cluster", Short: "Provides functionality for SKE cluster", @@ -30,7 +30,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(generatepayload.NewCmd(params)) cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index f1874fb65..18113539b 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -5,8 +5,9 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -36,7 +37,7 @@ type inputModel struct { Payload *ske.CreateOrUpdateClusterPayload } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", clusterNameArg), Short: "Creates a SKE cluster", diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index b8bb55557..99392a63d 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -6,9 +6,10 @@ import ( "testing" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -295,7 +296,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.cluster); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index d0ebb34fe..fc8b70978 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", clusterNameArg), Short: "Deletes a SKE cluster", diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 7bbf9ac6b..3e94fa9d9 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", clusterNameArg), Short: "Shows details of a SKE cluster", diff --git a/internal/cmd/ske/cluster/describe/describe_test.go b/internal/cmd/ske/cluster/describe/describe_test.go index da85e7af3..3049998fe 100644 --- a/internal/cmd/ske/cluster/describe/describe_test.go +++ b/internal/cmd/ske/cluster/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -369,7 +370,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.cluster); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index e7fcbe234..5afa14cf8 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { FilePath *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "generate-payload", Short: "Generates a payload to create/update SKE clusters", diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go index 415f83359..97f0aa013 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -201,7 +202,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.filePath, tt.args.payload); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go index 1ee7aff06..ce4c416e5 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("hibernate %s", clusterNameArg), Short: "Trigger hibernate for a SKE cluster", diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index 33e93389a..b1fa9f024 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Limit *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all SKE clusters", diff --git a/internal/cmd/ske/cluster/list/list_test.go b/internal/cmd/ske/cluster/list/list_test.go index a2d8f4d44..2b123dba0 100644 --- a/internal/cmd/ske/cluster/list/list_test.go +++ b/internal/cmd/ske/cluster/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -183,7 +184,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, "dummy-projectlabel", tt.args.clusters); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go index bad6c37f4..cc3c1ab1d 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("maintenance %s", clusterNameArg), Short: "Trigger maintenance for a SKE cluster", diff --git a/internal/cmd/ske/cluster/reconcile/reconcile.go b/internal/cmd/ske/cluster/reconcile/reconcile.go index 719ebeb44..0108ae568 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("reconcile %s", clusterNameArg), Short: "Trigger reconcile for a SKE cluster", diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 81187ccd4..e59fa9990 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -5,7 +5,8 @@ import ( "encoding/json" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -33,7 +34,7 @@ type inputModel struct { Payload ske.CreateOrUpdateClusterPayload } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", clusterNameArg), Short: "Updates a SKE cluster", diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index 8285af7e1..e4a28fb91 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -6,7 +6,8 @@ import ( "testing" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -282,7 +283,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.clusterName, tt.args.cluster); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/cluster/wakeup/wakeup.go b/internal/cmd/ske/cluster/wakeup/wakeup.go index 950dbf3b1..64b0e5ccf 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -26,7 +27,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("wakeup %s", clusterNameArg), Short: "Trigger wakeup from hibernation for a SKE cluster", diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index f4a1fcc5b..d9970b539 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("complete-rotation %s", clusterNameArg), Short: "Completes the rotation of the credentials associated to a SKE cluster", diff --git a/internal/cmd/ske/credentials/credentials.go b/internal/cmd/ske/credentials/credentials.go index 2770f349a..13218d2fa 100644 --- a/internal/cmd/ske/credentials/credentials.go +++ b/internal/cmd/ske/credentials/credentials.go @@ -1,16 +1,16 @@ package credentials import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" completerotation "github.com/stackitcloud/stackit-cli/internal/cmd/ske/credentials/complete-rotation" startrotation "github.com/stackitcloud/stackit-cli/internal/cmd/ske/credentials/start-rotation" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "credentials", Short: "Provides functionality for SKE credentials", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(startrotation.NewCmd(params)) cmd.AddCommand(completerotation.NewCmd(params)) } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index ea65650ea..91af511fd 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -27,7 +28,7 @@ type inputModel struct { ClusterName string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("start-rotation %s", clusterNameArg), Short: "Starts the rotation of the credentials associated to a SKE cluster", diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index c1804fc9a..414525335 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,7 +23,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "describe", Short: "Shows overall details regarding SKE", diff --git a/internal/cmd/ske/describe/describe_test.go b/internal/cmd/ske/describe/describe_test.go index 3a0283a6c..53dd3afc8 100644 --- a/internal/cmd/ske/describe/describe_test.go +++ b/internal/cmd/ske/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" @@ -159,7 +160,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.project, tt.args.projectId); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index f9eb1ac3b..cd2dc87db 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -24,7 +25,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "disable", Short: "Disables SKE for a project", diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 9d9783dd2..411140edc 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -24,7 +25,7 @@ type inputModel struct { *globalflags.GlobalFlagModel } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "enable", Short: "Enables SKE for a project", diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index 86b282cfa..725c53636 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -5,8 +5,9 @@ import ( "encoding/json" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/goccy/go-yaml" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -41,7 +42,7 @@ type inputModel struct { Overwrite bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", clusterNameArg), Short: "Creates or update a kubeconfig for a SKE cluster", diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index 5c7b25e58..f8e826064 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -283,7 +284,7 @@ func Test_outputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.clusterName, tt.args.kubeconfigPath, tt.args.respKubeconfig, tt.args.respLogin); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/kubeconfig/kubeconfig.go b/internal/cmd/ske/kubeconfig/kubeconfig.go index ad5482dbe..e1fb827c2 100644 --- a/internal/cmd/ske/kubeconfig/kubeconfig.go +++ b/internal/cmd/ske/kubeconfig/kubeconfig.go @@ -1,16 +1,16 @@ package kubeconfig import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/kubeconfig/create" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/kubeconfig/login" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "kubeconfig", Short: "Provides functionality for SKE kubeconfig", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(login.NewCmd(params)) } diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index e51f69c63..68775aed3 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -12,7 +12,8 @@ import ( "strconv" "time" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/cache" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "k8s.io/client-go/rest" @@ -36,7 +37,7 @@ const ( refreshBeforeDuration = 15 * time.Minute // 15 min ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "login", Short: "Login plugin for kubernetes clients", diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 5da30e803..21f04d028 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -7,8 +7,9 @@ import ( "strings" "time" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -37,7 +38,7 @@ type inputModel struct { VolumeTypes bool } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists SKE provider options", @@ -272,13 +273,13 @@ func buildMachineImagesTable(resp *ske.ProviderOptions) tables.Table { } func buildMachineTypesTable(resp *ske.ProviderOptions) tables.Table { - types := *resp.MachineTypes + machineTypes := *resp.MachineTypes table := tables.NewTable() table.SetTitle("Machine Types") table.SetHeader("TYPE", "CPU", "MEMORY") - for i := range types { - t := types[i] + for i := range machineTypes { + t := machineTypes[i] table.AddRow( utils.PtrString(t.Name), utils.PtrString(t.Cpu), @@ -289,13 +290,13 @@ func buildMachineTypesTable(resp *ske.ProviderOptions) tables.Table { } func buildVolumeTypesTable(resp *ske.ProviderOptions) tables.Table { - types := *resp.VolumeTypes + volumeTypes := *resp.VolumeTypes table := tables.NewTable() table.SetTitle("Volume Types") table.SetHeader("TYPE") - for i := range types { - z := types[i] + for i := range volumeTypes { + z := volumeTypes[i] table.AddRow(utils.PtrString(z.Name)) } return table diff --git a/internal/cmd/ske/options/options_test.go b/internal/cmd/ske/options/options_test.go index 1627f3709..43f58c5b4 100644 --- a/internal/cmd/ske/options/options_test.go +++ b/internal/cmd/ske/options/options_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -211,7 +212,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { @@ -244,7 +245,7 @@ func TestOutputResultAsTable(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResultAsTable(p, tt.args.options); (err != nil) != tt.wantErr { diff --git a/internal/cmd/ske/ske.go b/internal/cmd/ske/ske.go index e782119db..3c052fa71 100644 --- a/internal/cmd/ske/ske.go +++ b/internal/cmd/ske/ske.go @@ -1,7 +1,6 @@ package ske import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/cluster" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/credentials" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/describe" @@ -10,12 +9,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/ske/kubeconfig" "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "ske", Short: "Provides functionality for SKE", @@ -27,7 +27,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(cluster.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/volume/backup/backup.go b/internal/cmd/volume/backup/backup.go index b7cf8b37b..271336ba2 100644 --- a/internal/cmd/volume/backup/backup.go +++ b/internal/cmd/volume/backup/backup.go @@ -1,7 +1,6 @@ package backup import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/create" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/describe" @@ -9,12 +8,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/restore" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "backup", Short: "Provides functionality for volume backups", @@ -26,7 +26,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index 316efc520..3673b6ac8 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -39,7 +40,7 @@ type inputModel struct { Labels map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a backup from a specific source", @@ -77,14 +78,16 @@ func NewCmd(params *params.CmdParams) *cobra.Command { // Get source name for label (use ID if name not available) sourceLabel := model.SourceID - if model.SourceType == "volume" { + + switch model.SourceType { + case "volume": name, err := iaasutils.GetVolumeName(ctx, apiClient, model.ProjectId, model.Region, model.SourceID) if err != nil { params.Printer.Debug(print.ErrorLevel, "get volume name: %v", err) } else if name != "" { sourceLabel = name } - } else if model.SourceType == "snapshot" { + case "snapshot": name, err := iaasutils.GetSnapshotName(ctx, apiClient, model.ProjectId, model.Region, model.SourceID) if err != nil { params.Printer.Debug(print.ErrorLevel, "get snapshot name: %v", err) diff --git a/internal/cmd/volume/backup/create/create_test.go b/internal/cmd/volume/backup/create/create_test.go index 3f4e64d15..3b7d432e6 100644 --- a/internal/cmd/volume/backup/create/create_test.go +++ b/internal/cmd/volume/backup/create/create_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -263,7 +264,7 @@ func TestOutputResult(t *testing.T) { } p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) p.Cmd = cmd for _, tt := range tests { diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go index b439f0d6d..e8e2ce676 100644 --- a/internal/cmd/volume/backup/delete/delete.go +++ b/internal/cmd/volume/backup/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { BackupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", backupIdArg), Short: "Deletes a backup", diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go index 3f95fe355..c8c1b66d1 100644 --- a/internal/cmd/volume/backup/describe/describe.go +++ b/internal/cmd/volume/backup/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { BackupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", backupIdArg), Short: "Describes a backup", diff --git a/internal/cmd/volume/backup/describe/describe_test.go b/internal/cmd/volume/backup/describe/describe_test.go index 1ba033cb2..8ffe6e03e 100644 --- a/internal/cmd/volume/backup/describe/describe_test.go +++ b/internal/cmd/volume/backup/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -174,7 +175,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backup); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index 825a6793e..c434b3df5 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all backups", diff --git a/internal/cmd/volume/backup/list/list_test.go b/internal/cmd/volume/backup/list/list_test.go index 3734dc1f7..0722dd90d 100644 --- a/internal/cmd/volume/backup/list/list_test.go +++ b/internal/cmd/volume/backup/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -189,7 +190,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.backups); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go index 3922c4ae8..29239a7fe 100644 --- a/internal/cmd/volume/backup/restore/restore.go +++ b/internal/cmd/volume/backup/restore/restore.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { BackupId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("restore %s", backupIdArg), Short: "Restores a backup", diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go index 920ef6667..02fe3703a 100644 --- a/internal/cmd/volume/backup/update/update.go +++ b/internal/cmd/volume/backup/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Labels map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", backupIdArg), Short: "Updates a backup", diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index a9b624c67..8b3a536a5 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -44,7 +45,7 @@ type inputModel struct { SourceType *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a volume", diff --git a/internal/cmd/volume/create/create_test.go b/internal/cmd/volume/create/create_test.go index dde4f7893..9628fd508 100644 --- a/internal/cmd/volume/create/create_test.go +++ b/internal/cmd/volume/create/create_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -280,7 +281,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index 58d47c8ae..f6550714c 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { VolumeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", volumeIdArg), Short: "Deletes a volume", diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index 0683ae255..8ff8dbfab 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { VolumeId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", volumeIdArg), Short: "Shows details of a volume", diff --git a/internal/cmd/volume/describe/describe_test.go b/internal/cmd/volume/describe/describe_test.go index 9396645d4..eb595b37e 100644 --- a/internal/cmd/volume/describe/describe_test.go +++ b/internal/cmd/volume/describe/describe_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -199,7 +200,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index 586f8b721..5d82bad1a 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -30,7 +31,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all volumes of a project", diff --git a/internal/cmd/volume/list/list_test.go b/internal/cmd/volume/list/list_test.go index 4fdeab7b2..d81ee310f 100644 --- a/internal/cmd/volume/list/list_test.go +++ b/internal/cmd/volume/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -195,7 +196,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumes); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index 324609ada..23c763e84 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -5,7 +5,8 @@ import ( "fmt" "strings" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { VolumePerformanceClass string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", volumePerformanceClassArg), Short: "Shows details of a volume performance class", diff --git a/internal/cmd/volume/performance-class/describe/describe_test.go b/internal/cmd/volume/performance-class/describe/describe_test.go index 269dae052..d24d96eaf 100644 --- a/internal/cmd/volume/performance-class/describe/describe_test.go +++ b/internal/cmd/volume/performance-class/describe/describe_test.go @@ -4,12 +4,13 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -194,7 +195,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.performanceClass); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index 46ef6574b..7062011aa 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all volume performance classes for a project", diff --git a/internal/cmd/volume/performance-class/list/list_test.go b/internal/cmd/volume/performance-class/list/list_test.go index 7bbd048f0..53004a31b 100644 --- a/internal/cmd/volume/performance-class/list/list_test.go +++ b/internal/cmd/volume/performance-class/list/list_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -195,7 +196,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.performanceClasses); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/performance-class/performance_class.go b/internal/cmd/volume/performance-class/performance_class.go index 6ed86618a..dd00fe2d6 100644 --- a/internal/cmd/volume/performance-class/performance_class.go +++ b/internal/cmd/volume/performance-class/performance_class.go @@ -1,16 +1,16 @@ package performanceclass import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/performance-class/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/performance-class/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "performance-class", Short: "Provides functionality for volume performance classes available inside a project", @@ -22,7 +22,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) } diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index 58be4800d..7bcc40dc0 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -4,7 +4,8 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -31,7 +32,7 @@ type inputModel struct { Size *int64 } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("resize %s", volumeIdArg), Short: "Resizes a volume", diff --git a/internal/cmd/volume/resize/resize_test.go b/internal/cmd/volume/resize/resize_test.go index 094cb7864..a45ecb6ea 100644 --- a/internal/cmd/volume/resize/resize_test.go +++ b/internal/cmd/volume/resize/resize_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -158,7 +159,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index a49b89da4..29dd2894c 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -35,7 +36,7 @@ type inputModel struct { Labels map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "create", Short: "Creates a snapshot from a volume", diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go index a94ef6bf1..c4c06b34d 100644 --- a/internal/cmd/volume/snapshot/delete/delete.go +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -29,7 +30,7 @@ type inputModel struct { SnapshotId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("delete %s", snapshotIdArg), Short: "Deletes a snapshot", diff --git a/internal/cmd/volume/snapshot/describe/describe.go b/internal/cmd/volume/snapshot/describe/describe.go index 17ed41c88..c87336496 100644 --- a/internal/cmd/volume/snapshot/describe/describe.go +++ b/internal/cmd/volume/snapshot/describe/describe.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -28,7 +29,7 @@ type inputModel struct { SnapshotId string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", snapshotIdArg), Short: "Describes a snapshot", diff --git a/internal/cmd/volume/snapshot/describe/describe_test.go b/internal/cmd/volume/snapshot/describe/describe_test.go index ff1e25aec..046e19f24 100644 --- a/internal/cmd/volume/snapshot/describe/describe_test.go +++ b/internal/cmd/volume/snapshot/describe/describe_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -199,7 +200,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.snapshot); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go index ce8052287..70b97edf2 100644 --- a/internal/cmd/volume/snapshot/list/list.go +++ b/internal/cmd/volume/snapshot/list/list.go @@ -5,8 +5,9 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { LabelSelector *string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "list", Short: "Lists all snapshots", diff --git a/internal/cmd/volume/snapshot/list/list_test.go b/internal/cmd/volume/snapshot/list/list_test.go index 5e9c8b0c8..ff2d86383 100644 --- a/internal/cmd/volume/snapshot/list/list_test.go +++ b/internal/cmd/volume/snapshot/list/list_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" @@ -217,7 +218,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.snapshots); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/snapshot/snapshot.go b/internal/cmd/volume/snapshot/snapshot.go index 9656b1465..579233ca9 100644 --- a/internal/cmd/volume/snapshot/snapshot.go +++ b/internal/cmd/volume/snapshot/snapshot.go @@ -2,17 +2,17 @@ package snapshot import ( "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/create" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/describe" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/list" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "snapshot", Short: "Provides functionality for snapshots", @@ -24,7 +24,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/cmd/volume/snapshot/update/update.go b/internal/cmd/volume/snapshot/update/update.go index 766c33b34..b43072bce 100644 --- a/internal/cmd/volume/snapshot/update/update.go +++ b/internal/cmd/volume/snapshot/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -32,7 +33,7 @@ type inputModel struct { Labels map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", snapshotIdArg), Short: "Updates a snapshot", diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 55e2e2a70..194a70db3 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -4,8 +4,9 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -34,7 +35,7 @@ type inputModel struct { Labels *map[string]string } -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("update %s", volumeIdArg), Short: "Updates a volume", diff --git a/internal/cmd/volume/update/update_test.go b/internal/cmd/volume/update/update_test.go index 6b890a82c..0f34841aa 100644 --- a/internal/cmd/volume/update/update_test.go +++ b/internal/cmd/volume/update/update_test.go @@ -4,10 +4,11 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -182,7 +183,7 @@ func TestParseInput(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { p := print.NewPrinter() - cmd := NewCmd(¶ms.CmdParams{Printer: p}) + cmd := NewCmd(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) @@ -286,7 +287,7 @@ func TestOutputResult(t *testing.T) { }, } p := print.NewPrinter() - p.Cmd = NewCmd(¶ms.CmdParams{Printer: p}) + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := outputResult(p, tt.args.outputFormat, tt.args.volumeLabel, tt.args.volume); (err != nil) != tt.wantErr { diff --git a/internal/cmd/volume/volume.go b/internal/cmd/volume/volume.go index 8da9cbd13..a6967a9ae 100644 --- a/internal/cmd/volume/volume.go +++ b/internal/cmd/volume/volume.go @@ -1,7 +1,6 @@ package volume import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/backup" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/create" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/delete" @@ -12,12 +11,13 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" ) -func NewCmd(params *params.CmdParams) *cobra.Command { +func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "volume", Short: "Provides functionality for volumes", @@ -29,7 +29,7 @@ func NewCmd(params *params.CmdParams) *cobra.Command { return cmd } -func addSubcommands(cmd *cobra.Command, params *params.CmdParams) { +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) diff --git a/internal/pkg/projectname/project_name.go b/internal/pkg/projectname/project_name.go index 84381a8c6..b2c77117f 100644 --- a/internal/pkg/projectname/project_name.go +++ b/internal/pkg/projectname/project_name.go @@ -42,7 +42,7 @@ func GetProjectName(ctx context.Context, p *print.Printer, cliVersion string, cm // If project ID is set in config, we store the project name in config // (So next time we can just pull it from there) - if !(isProjectIdSetInFlags(p, cmd) || isProjectIdSetInEnvVar()) { + if !isProjectIdSetInFlags(p, cmd) && !isProjectIdSetInEnvVar() { viper.Set(config.ProjectNameKey, projectName) err = config.Write() if err != nil { @@ -61,10 +61,7 @@ func useProjectNameFromConfig(p *print.Printer, cmd *cobra.Command) bool { projectIdSetInFlags := isProjectIdSetInFlags(p, cmd) projectIdSetInEnv := isProjectIdSetInEnvVar() projectName := viper.GetString(config.ProjectNameKey) - projectNameSet := false - if projectName != "" { - projectNameSet = true - } + projectNameSet := projectName != "" return !projectIdSetInFlags && !projectIdSetInEnv && projectNameSet } @@ -73,10 +70,7 @@ func isProjectIdSetInFlags(p *print.Printer, cmd *cobra.Command) bool { // viper.GetString uses the flags, and fallsback to config file // To check if projectId was passed, we use the first rather than the second projectIdFromFlag := flags.FlagToStringPointer(p, cmd, globalflags.ProjectIdFlag) - projectIdSetInFlag := false - if projectIdFromFlag != nil { - projectIdSetInFlag = true - } + projectIdSetInFlag := projectIdFromFlag != nil return projectIdSetInFlag } diff --git a/internal/pkg/testutils/testutils.go b/internal/pkg/testutils/testutils.go index 8f970fd0a..f9ac93524 100644 --- a/internal/pkg/testutils/testutils.go +++ b/internal/pkg/testutils/testutils.go @@ -3,23 +3,24 @@ package testutils import ( "testing" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/google/go-cmp/cmp" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/cmd/params" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) // TestParseInput centralizes the logic to test a combination of inputs (arguments, flags) for a cobra command -func TestParseInput[T any](t *testing.T, cmdFactory func(*params.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, isValid bool) { +func TestParseInput[T any](t *testing.T, cmdFactory func(*types.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, isValid bool) { TestParseInputWithAdditionalFlags(t, cmdFactory, parseInputFunc, expectedModel, argValues, flagValues, map[string][]string{}, isValid) } // TestParseInputWithAdditionalFlags centralizes the logic to test a combination of inputs (arguments, flags) for a cobra command. // It allows to pass multiple instances of a single flag to the cobra command using the `additionalFlagValues` parameter. -func TestParseInputWithAdditionalFlags[T any](t *testing.T, cmdFactory func(*params.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, additionalFlagValues map[string][]string, isValid bool) { +func TestParseInputWithAdditionalFlags[T any](t *testing.T, cmdFactory func(*types.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, additionalFlagValues map[string][]string, isValid bool) { p := print.NewPrinter() - cmd := cmdFactory(¶ms.CmdParams{Printer: p}) + cmd := cmdFactory(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) if err != nil { t.Fatalf("configure global flags: %v", err) diff --git a/internal/cmd/params/cmd_params.go b/internal/pkg/types/cmd_params.go similarity index 90% rename from internal/cmd/params/cmd_params.go rename to internal/pkg/types/cmd_params.go index 572c80706..e221ac7bb 100644 --- a/internal/cmd/params/cmd_params.go +++ b/internal/pkg/types/cmd_params.go @@ -1,4 +1,4 @@ -package params +package types import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" From 5870218b4fb08889bffc098700b7781d5eb4be8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 08:32:00 +0100 Subject: [PATCH 258/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex (#1149) Bumps [github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.3.3 to 1.3.4. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/runcommand/v1.3.3...services/serverbackup/v1.3.4) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex dependency-version: 1.3.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bae42f51f..a480fd168 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.3 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.30.0 golang.org/x/oauth2 v0.33.0 diff --git a/go.sum b/go.sum index a4e5c9be6..735375a28 100644 --- a/go.sum +++ b/go.sum @@ -650,8 +650,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3/go.mod h1:icu5WtsZ8c57/pUrXeFLmZu29Qhwr/rsjTkVRWJYTqY= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miWlS5Dvo+cW90hbePaxOyWF67EE= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0/go.mod h1:/Ujlw+qo6RgKm69dD8y6MgmJFcUmrHjuJPO6VFoQX9U= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.3 h1:TFefEGGxvcI7euqyosbLS/zSEOy+3JMGOirW3vNj/84= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.3/go.mod h1:Jsry+gfhuXv2P0ldfa48BaL605NhDjdQMgaoV8czlbo= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 h1:IUhMJH9fQ+CaMas+5bbnrH7m1Hadf1vWoUtu9KeAEFM= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From a686b9fdff144f8e899656556f93ccfc7708f794 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 07:40:36 +0000 Subject: [PATCH 259/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverbackup (#1150) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serverbackup](https://github.com/stackitcloud/stackit-sdk-go) from 1.3.3 to 1.3.4. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/runcommand/v1.3.3...services/serverbackup/v1.3.4) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serverbackup dependency-version: 1.3.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a480fd168..cbd8c6062 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 diff --git a/go.sum b/go.sum index 735375a28..9357799e2 100644 --- a/go.sum +++ b/go.sum @@ -640,8 +640,8 @@ github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 h1:Jts49V7XvLL github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2/go.mod h1:hV1rmsyb3jlL5kWO+flhtXTbm5EM9vU+BJsV4U/YEUU= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3 h1:LONKouoyrgDfu4Tu152YFjd5cw3SoG8P7PHdd8tsBOU= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.3/go.mod h1:mCiDOqMHQKM9cFs5/GULaYz6Ni0QA2TTMQZJcj4GFUE= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2nwMi1JxDYW2p8LL4cSB3eoOjlqPHioDWU0= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 h1:ubaIeflBZ70evMhU5Xl4NzzDUTk0Z309jnv18OikXgs= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2/go.mod h1:NH6dyKSkJ0WezDgIpXr5PkhSGUXJvwEFcsQmeGScDs8= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 h1:+S5yPftGLH99ByzDCwzdI927bvKOKMQxMkd/tuPeQTE= From 3eabca4e6ad68d0682e1768f44f32b2daa0ff003 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 07:50:22 +0000 Subject: [PATCH 260/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mariadb (#1151) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mariadb](https://github.com/stackitcloud/stackit-sdk-go) from 0.25.2 to 0.25.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/logme/v0.25.2...services/logme/v0.25.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mariadb dependency-version: 0.25.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cbd8c6062..53fe6a5c5 100644 --- a/go.mod +++ b/go.mod @@ -264,7 +264,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 diff --git a/go.sum b/go.sum index 9357799e2..3626f57ab 100644 --- a/go.sum +++ b/go.sum @@ -618,8 +618,8 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 h1:BHNjq4+Os github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1/go.mod h1:sTV6ylmBoMOrOxUED8Ebts4a1PaJSPLtmNh5m+s5fus= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638gOKTZRAnnQuMhYqaliuz/A8BcfjhU= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2/go.mod h1:OlGmMlXKp33ZYpUm9TqaLYf8SdzhDW5uBKcbgq1zXOk= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2 h1:SfRbw3DxvDnZF2q6D9xfSy8EKHyrG5TgLMP0qRW8r9o= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.2/go.mod h1:VmXwRQHZsGUjGWdLf8d2WhKNyuPi5+JgCAF/meOp4DE= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 h1:tGa+NcjNKTWvChN+0OMdLomb9Jod4MmY6YAiPTJMgfo= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3/go.mod h1:ciuOzwN5GcqplRy95fXRaS44dFmhfNxvmzTl/ALwV/k= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7R74xuH/ztcPrDIuMp2KV3QQMjeE7lFudboM= From 0e90fb5966cadc91651b33c1292e79bf0452edcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:01:37 +0100 Subject: [PATCH 261/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/redis (#1152) Bumps [github.com/stackitcloud/stackit-sdk-go/services/redis](https://github.com/stackitcloud/stackit-sdk-go) from 0.25.2 to 0.25.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/logme/v0.25.2...services/logme/v0.25.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/redis dependency-version: 0.25.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 53fe6a5c5..f1fe41ecd 100644 --- a/go.mod +++ b/go.mod @@ -268,7 +268,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.38.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 3626f57ab..1f35fc7d2 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1/go.mod h1:hyhw+I19NtjKmRLcUkY4boaTxnYSPFGbpn4RxvGqH2s= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4H1thfEEsDq+O0Ce0hNhdbkJ5eDdGEoE= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2 h1:VWx+u5b9r+HEm2rCtGlS7OFKl6Fnqe6s2xyCBA3IbM8= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.2/go.mod h1:fg1pAqju7q5A696aiok2L4SHZIjZCCiBCpsm7FrQZMA= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 h1:KDa5sy6NSzMOXaf4a9skxOm8oUoleI45fLbD3ww7qsc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1/go.mod h1:+k3iHkWpehO+FLC5WsW7eGhYdNjDklYqRcpIxQBLbZg= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 h1:Jts49V7XvLLr7MwI9o5Mo0NW3iUVVt8DtqNqRDt6ags= From bddbc7b7440d70265481d463e9233cc542bcf952 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:17:57 +0100 Subject: [PATCH 262/422] chore(deps): update module github.com/golangci/golangci-lint/v2 to v2.7.2 (#1154) Co-authored-by: Renovate Bot --- go.mod | 18 +++++++++--------- go.sum | 40 ++++++++++++++++++++-------------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index f1fe41ecd..df5f75555 100644 --- a/go.mod +++ b/go.mod @@ -66,7 +66,7 @@ require ( github.com/BurntSushi/toml v1.5.0 // indirect github.com/Djarvur/go-err113 v0.1.1 // indirect github.com/Masterminds/semver/v3 v3.4.0 // indirect - github.com/MirrexOne/unqueryvet v1.2.1 // indirect + github.com/MirrexOne/unqueryvet v1.3.0 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect github.com/alecthomas/chroma/v2 v2.20.0 // indirect github.com/alecthomas/go-check-sumtype v0.3.1 // indirect @@ -87,7 +87,7 @@ require ( github.com/breml/errchkjson v0.4.1 // indirect github.com/butuzov/ireturn v0.4.0 // indirect github.com/butuzov/mirror v1.3.0 // indirect - github.com/catenacyber/perfsprint v0.10.0 // indirect + github.com/catenacyber/perfsprint v0.10.1 // indirect github.com/ccojocar/zxcvbn-go v1.0.4 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charithe/durationcheck v0.0.11 // indirect @@ -119,14 +119,14 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/godoc-lint/godoc-lint v0.10.1 // indirect + github.com/godoc-lint/godoc-lint v0.10.2 // indirect github.com/gofrs/flock v0.13.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect - github.com/golangci/golangci-lint/v2 v2.6.2 // indirect + github.com/golangci/golangci-lint/v2 v2.7.2 // indirect github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect github.com/golangci/misspell v0.7.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect @@ -139,7 +139,7 @@ require ( github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect github.com/gostaticanalysis/nilerr v0.1.2 // indirect github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect - github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/go-version v1.8.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/jgautheron/goconst v1.8.2 // indirect @@ -167,7 +167,7 @@ require ( github.com/matoous/godox v1.1.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mgechev/revive v1.12.0 // indirect + github.com/mgechev/revive v1.13.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moricho/tparallel v0.3.2 // indirect github.com/muesli/termenv v0.16.0 // indirect @@ -195,19 +195,19 @@ require ( github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect - github.com/securego/gosec/v2 v2.22.10 // indirect + github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/sonatard/noctx v0.4.0 // indirect github.com/sourcegraph/go-diff v0.7.0 // indirect github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect + github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.11.1 // indirect github.com/tetafro/godot v1.5.4 // indirect github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect github.com/timonwong/loggercheck v0.11.0 // indirect - github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect + github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect github.com/ultraware/funlen v0.2.0 // indirect github.com/ultraware/whitespace v0.2.0 // indirect diff --git a/go.sum b/go.sum index 1f35fc7d2..9ac8e9379 100644 --- a/go.sum +++ b/go.sum @@ -65,8 +65,8 @@ github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/MirrexOne/unqueryvet v1.2.1 h1:M+zdXMq84g+E1YOLa7g7ExN3dWfZQrdDSTCM7gC+m/A= -github.com/MirrexOne/unqueryvet v1.2.1/go.mod h1:IWwCwMQlSWjAIteW0t+28Q5vouyktfujzYznSIWiuOg= +github.com/MirrexOne/unqueryvet v1.3.0 h1:5slWSomgqpYU4zFuZ3NNOfOUxVPlXFDBPAVasZOGlAY= +github.com/MirrexOne/unqueryvet v1.3.0/go.mod h1:IWwCwMQlSWjAIteW0t+28Q5vouyktfujzYznSIWiuOg= github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= @@ -118,8 +118,8 @@ github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70= github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= -github.com/catenacyber/perfsprint v0.10.0 h1:AZj1mYyxbxLRqmnYOeguZXEQwWOgQGm2wzLI5d7Hl/0= -github.com/catenacyber/perfsprint v0.10.0/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc= +github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ= +github.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc= github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc= github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -243,8 +243,8 @@ github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godoc-lint/godoc-lint v0.10.1 h1:ZPUVzlDtJfA+P688JfPJPkI/SuzcBr/753yGIk5bOPA= -github.com/godoc-lint/godoc-lint v0.10.1/go.mod h1:KleLcHu/CGSvkjUH2RvZyoK1MBC7pDQg4NxMYLcBBsw= +github.com/godoc-lint/godoc-lint v0.10.2 h1:dksNgK+zebnVlj4Fx83CRnCmPO0qRat/9xfFsir1nfg= +github.com/godoc-lint/godoc-lint v0.10.2/go.mod h1:KleLcHu/CGSvkjUH2RvZyoK1MBC7pDQg4NxMYLcBBsw= github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -289,8 +289,8 @@ github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarog github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= -github.com/golangci/golangci-lint/v2 v2.6.2 h1:jkMSVv36JmyTENcEertckvimvjPcD5qxNM7W7qhECvI= -github.com/golangci/golangci-lint/v2 v2.6.2/go.mod h1:fSIMDiBt9kzdpnvvV7GO6iWzyv5uaeZ+iPor+2uRczE= +github.com/golangci/golangci-lint/v2 v2.7.2 h1:AhBC+YeEueec4AGlIbvPym5C70Thx0JykIqXbdIXWx0= +github.com/golangci/golangci-lint/v2 v2.7.2/go.mod h1:pDijleoBu7e8sejMqyZ3L5n6geqe+cVvOAz2QImqqVc= github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8= github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ= github.com/golangci/misspell v0.7.0 h1:4GOHr/T1lTW0hhR4tgaaV1WS/lJ+ncvYCoFKmqJsj0c= @@ -358,8 +358,8 @@ github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1T github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= -github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= +github.com/hashicorp/go-version v1.8.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= @@ -457,8 +457,8 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgechev/revive v1.12.0 h1:Q+/kkbbwerrVYPv9d9efaPGmAO/NsxwW/nE6ahpQaCU= -github.com/mgechev/revive v1.12.0/go.mod h1:VXsY2LsTigk8XU9BpZauVLjVrhICMOV3k1lpB3CXrp8= +github.com/mgechev/revive v1.13.0 h1:yFbEVliCVKRXY8UgwEO7EOYNopvjb1BFbmYqm9hZjBM= +github.com/mgechev/revive v1.13.0/go.mod h1:efJfeBVCX2JUumNQ7dtOLDja+QKj9mYGgEZA7rt5u+0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -485,8 +485,8 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.21.2 h1:khzWfm2/Br8ZemX8QM1pl72LwM+rMeW6VUbQ4rzh0Po= github.com/nunnatsa/ginkgolinter v0.21.2/go.mod h1:GItSI5fw7mCGLPmkvGYrr1kEetZe7B593jcyOpyabsY= -github.com/onsi/ginkgo/v2 v2.26.0 h1:1J4Wut1IlYZNEAWIV3ALrT9NfiaGW2cDCJQSFQMs/gE= -github.com/onsi/ginkgo/v2 v2.26.0/go.mod h1:qhEywmzWTBUY88kfO0BRvX4py7scov9yR+Az2oavUzw= +github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= +github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= @@ -565,8 +565,8 @@ github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tM github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= -github.com/securego/gosec/v2 v2.22.10 h1:ntbBqdWXnu46DUOXn+R2SvPo3PiJCDugTCgTW2g4tQg= -github.com/securego/gosec/v2 v2.22.10/go.mod h1:9UNjK3tLpv/w2b0+7r82byV43wCJDNtEDQMeS+H/g2w= +github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7 h1:rZg6IGn0ySYZwCX8LHwZoYm03JhG/cVAJJ3O+u3Vclo= +github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7/go.mod h1:9sr22NZO5Kfh7unW/xZxkGYTmj2484/fCiE54gw7UTY= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= @@ -652,8 +652,8 @@ github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miW github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0/go.mod h1:/Ujlw+qo6RgKm69dD8y6MgmJFcUmrHjuJPO6VFoQX9U= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 h1:IUhMJH9fQ+CaMas+5bbnrH7m1Hadf1vWoUtu9KeAEFM= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= -github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= -github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= +github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= +github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= @@ -676,8 +676,8 @@ github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= -github.com/tomarrell/wrapcheck/v2 v2.11.0 h1:BJSt36snX9+4WTIXeJ7nvHBQBcm1h2SjQMSlmQ6aFSU= -github.com/tomarrell/wrapcheck/v2 v2.11.0/go.mod h1:wFL9pDWDAbXhhPZZt+nG8Fu+h29TtnZ2MW6Lx4BRXIU= +github.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is= +github.com/tomarrell/wrapcheck/v2 v2.12.0/go.mod h1:AQhQuZd0p7b6rfW+vUwHm5OMCGgp63moQ9Qr/0BpIWo= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= From 2989931c14ab971d1ee6d87ce59ba63aa699b3b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:37:51 +0100 Subject: [PATCH 263/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/postgresflex (#1153) Bumps [github.com/stackitcloud/stackit-sdk-go/services/postgresflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.1 to 1.3.2. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.2.1...services/cdn/v1.3.2) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/postgresflex dependency-version: 1.3.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- internal/cmd/postgresflex/instance/update/update.go | 4 ++-- internal/cmd/postgresflex/instance/update/update_test.go | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index df5f75555..3b305393e 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 diff --git a/go.sum b/go.sum index 9ac8e9379..2caab5731 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47Gh github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1/go.mod h1:vapb/sJqbHlf+c7pZWdE9GqrbyI8wesGvUc9o7oJ1Xk= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqmaQF/OjDw4MwDUbmhwlNBTi9zHdwsXJ3ug= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2/go.mod h1:QenOJF1LD39d/arGFGZFCzHoQuwF6VuWCvS8CbdoMBw= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1 h1:K8vXele3U6b5urcSIpq21EkVblWfPDY3eMPSuQ48TkI= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.2.1/go.mod h1:hyhw+I19NtjKmRLcUkY4boaTxnYSPFGbpn4RxvGqH2s= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2/go.mod h1:rPwdDiCx0eZ+yKiy6Wo6uv76LuCgFlQxkomvun1c740= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4H1thfEEsDq+O0Ce0hNhdbkJ5eDdGEoE= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 9eef70391..821d10b1c 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -264,9 +264,9 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient PostgreSQLFl payloadAcl = &postgresflex.ACL{Items: model.ACL} } - var payloadStorage *postgresflex.Storage + var payloadStorage *postgresflex.StorageUpdate if model.StorageClass != nil || model.StorageSize != nil { - payloadStorage = &postgresflex.Storage{ + payloadStorage = &postgresflex.StorageUpdate{ Class: model.StorageClass, Size: model.StorageSize, } diff --git a/internal/cmd/postgresflex/instance/update/update_test.go b/internal/cmd/postgresflex/instance/update/update_test.go index 1402996f7..17cfb46c8 100644 --- a/internal/cmd/postgresflex/instance/update/update_test.go +++ b/internal/cmd/postgresflex/instance/update/update_test.go @@ -427,7 +427,7 @@ func TestBuildRequest(t *testing.T) { }, expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId). PartialUpdateInstancePayload(postgresflex.PartialUpdateInstancePayload{ - Storage: &postgresflex.Storage{ + Storage: &postgresflex.StorageUpdate{ Class: utils.Ptr("class"), }, }), @@ -455,7 +455,7 @@ func TestBuildRequest(t *testing.T) { }, expectedRequest: testClient.PartialUpdateInstance(testCtx, testProjectId, testRegion, testInstanceId). PartialUpdateInstancePayload(postgresflex.PartialUpdateInstancePayload{ - Storage: &postgresflex.Storage{ + Storage: &postgresflex.StorageUpdate{ Class: utils.Ptr("class"), Size: utils.Ptr(int64(10)), }, From 0c5b30e6b12403687119540dae09accf5fa5440a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:15:57 +0100 Subject: [PATCH 264/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1156) Bumps [github.com/stackitcloud/stackit-sdk-go/services/iaas](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.2 to 1.2.4. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/iaas/v1.2.2...services/iaas/v1.2.4) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/iaas dependency-version: 1.2.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3b305393e..0b1123ee0 100644 --- a/go.mod +++ b/go.mod @@ -20,12 +20,12 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 diff --git a/go.sum b/go.sum index 2caab5731..7f1c195b0 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0e github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0 h1:fWAjxvf5D1jc1hvziGxJq68RO4pDXBUAPVrIumHb5mw= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2 h1:afGHMCqBM/E/FPUvbfSTFb9ddI+eDm2a7DpWPCkxMzs= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.2/go.mod h1:/DlO7+cOqyYKROIxkBYIUdMoEfFevkVXhsShglxyUOQ= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 h1:OpPPLUIpObDYmqJr+8aRq/J+YD663nhl3t1Fft2cIzQ= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 h1:KwjR5L+IoUbRYS8k3dyqHgtBUuq8cqRPrUrzzZSSnRI= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0/go.mod h1:Nea8wkoPGvcjKCsjfbAB3pE3kA7oZLi+Zk9hUtunjRI= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= @@ -634,8 +634,8 @@ github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1 h1:KDa5sy6NSzMOXaf4a9skxOm8oUoleI45fLbD3ww7qsc= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.1/go.mod h1:+k3iHkWpehO+FLC5WsW7eGhYdNjDklYqRcpIxQBLbZg= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXOvRNmSYMeF0qQ2+w4/ez04YutVDz73hSMuuOJ54= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 h1:Jts49V7XvLLr7MwI9o5Mo0NW3iUVVt8DtqNqRDt6ags= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2/go.mod h1:hV1rmsyb3jlL5kWO+flhtXTbm5EM9vU+BJsV4U/YEUU= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= From 79eda982909311d107f1383f32f9cee1e7b83fbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 10:24:43 +0000 Subject: [PATCH 265/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverupdate (#1157) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serverupdate](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/iaas/v1.2.2...services/iaas/v1.2.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serverupdate dependency-version: 1.2.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0b1123ee0..aa432e36a 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 diff --git a/go.sum b/go.sum index 7f1c195b0..c427617ce 100644 --- a/go.sum +++ b/go.sum @@ -642,8 +642,8 @@ github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2nwMi1JxDYW2p8LL4cSB3eoOjlqPHioDWU0= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2 h1:ubaIeflBZ70evMhU5Xl4NzzDUTk0Z309jnv18OikXgs= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.2/go.mod h1:NH6dyKSkJ0WezDgIpXr5PkhSGUXJvwEFcsQmeGScDs8= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 h1:+S5yPftGLH99ByzDCwzdI927bvKOKMQxMkd/tuPeQTE= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2/go.mod h1:gaHXopzXPDP1AmquUVhMmz9opAr2QYVBL0XbBdPtB7s= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL+rpQZWXZazL8w8DqXYxGbIOInaUc155BWTshNRA= From 1f50702b3789224de852ad9219d08585b395b052 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:47:10 +0100 Subject: [PATCH 266/422] chore(deps): update module golang.org/x/tools to v0.40.0 (#1161) Co-authored-by: Renovate Bot --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index aa432e36a..4b4fc2719 100644 --- a/go.mod +++ b/go.mod @@ -35,16 +35,16 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.30.0 + golang.org/x/mod v0.31.0 golang.org/x/oauth2 v0.33.0 - golang.org/x/term v0.37.0 - golang.org/x/text v0.31.0 + golang.org/x/term v0.38.0 + golang.org/x/text v0.32.0 k8s.io/apimachinery v0.34.2 k8s.io/client-go v0.34.2 ) require ( - golang.org/x/net v0.47.0 // indirect + golang.org/x/net v0.48.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -230,9 +230,9 @@ require ( go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 // indirect - golang.org/x/tools v0.39.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect + golang.org/x/tools v0.40.0 // indirect google.golang.org/protobuf v1.36.8 // indirect honnef.co/go/tools v0.6.1 // indirect mvdan.cc/gofumpt v0.9.2 // indirect @@ -270,7 +270,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/subosito/gotenv v1.6.0 // indirect - golang.org/x/sys v0.38.0 // indirect + golang.org/x/sys v0.39.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index c427617ce..508d403b1 100644 --- a/go.sum +++ b/go.sum @@ -790,8 +790,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +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-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -830,8 +830,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +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.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -855,8 +855,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +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-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -907,18 +907,18 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54 h1:E2/AqCUMZGgd73TQkxUMcMla25GB9i/5HOdLr+uH7Vo= -golang.org/x/telemetry v0.0.0-20251111182119-bc8e575c7b54/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= +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/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= +golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +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.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -929,8 +929,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +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.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -988,8 +988,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +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/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= From 1cd50456e7152453a658aecb89394e209cd6295e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:59:58 +0100 Subject: [PATCH 267/422] fix(deps): update module golang.org/x/oauth2 to v0.34.0 (#1163) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4b4fc2719..e40c4e5b4 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.31.0 - golang.org/x/oauth2 v0.33.0 + golang.org/x/oauth2 v0.34.0 golang.org/x/term v0.38.0 golang.org/x/text v0.32.0 k8s.io/apimachinery v0.34.2 diff --git a/go.sum b/go.sum index 508d403b1..42577307c 100644 --- a/go.sum +++ b/go.sum @@ -838,8 +838,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= -golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 11be379a7bfe9c1341b0eaa75a4bfe45f16f9fe0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:09:31 +0000 Subject: [PATCH 268/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/git (#1158) Bumps [github.com/stackitcloud/stackit-sdk-go/services/git](https://github.com/stackitcloud/stackit-sdk-go) from 0.10.0 to 0.10.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.10.0...core/v0.10.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/git dependency-version: 0.10.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e40c4e5b4..1c5db4e36 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 - github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0 + github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 diff --git a/go.sum b/go.sum index 42577307c..c3c76201d 100644 --- a/go.sum +++ b/go.sum @@ -606,8 +606,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5C github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0/go.mod h1:40XVgsSOcVCjoIAsbSycDh8Ikp2y88AdAeqwqIIHvZE= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0eb68ZD2KL1C8OFD8RG2sWMQGL6o= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= -github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0 h1:fWAjxvf5D1jc1hvziGxJq68RO4pDXBUAPVrIumHb5mw= -github.com/stackitcloud/stackit-sdk-go/services/git v0.10.0/go.mod h1:HgScss2f+/k/wDxcsM1K8SzLgDso/EZyhoJC2eZ+tFA= +github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= +github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 h1:OpPPLUIpObDYmqJr+8aRq/J+YD663nhl3t1Fft2cIzQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 h1:KwjR5L+IoUbRYS8k3dyqHgtBUuq8cqRPrUrzzZSSnRI= From 7caa3019322adb336dafcbdbc315f096bfc68b31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:18:58 +0000 Subject: [PATCH 269/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/objectstorage (#1159) Bumps [github.com/stackitcloud/stackit-sdk-go/services/objectstorage](https://github.com/stackitcloud/stackit-sdk-go) from 1.4.1 to 1.4.2. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/ske/v1.4.1...services/objectstorage/v1.4.2) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/objectstorage dependency-version: 1.4.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1c5db4e36..90ffd9630 100644 --- a/go.mod +++ b/go.mod @@ -265,7 +265,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 diff --git a/go.sum b/go.sum index c3c76201d..58877a6f0 100644 --- a/go.sum +++ b/go.sum @@ -622,8 +622,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOw github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 h1:tGa+NcjNKTWvChN+0OMdLomb9Jod4MmY6YAiPTJMgfo= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3/go.mod h1:ciuOzwN5GcqplRy95fXRaS44dFmhfNxvmzTl/ALwV/k= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1 h1:I9B/zUU7R74xuH/ztcPrDIuMp2KV3QQMjeE7lFudboM= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.1/go.mod h1:h4aX5tyTQoO6KLrugkvfkqgKTjIzh7e4q9N92kT5OBs= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 h1:nsC6oA1whA4ibxEuD+0Osngmnpz8dLdV6bv+9jYP4Eo= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2/go.mod h1:WA6QlAAQ8aaw81W0VSVoDrxOfchGkdtmn2jQL/ub/50= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1/go.mod h1:vapb/sJqbHlf+c7pZWdE9GqrbyI8wesGvUc9o7oJ1Xk= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqmaQF/OjDw4MwDUbmhwlNBTi9zHdwsXJ3ug= From 2c0fa1401a41639fa75e2b5faba3f929566d4e23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:28:36 +0000 Subject: [PATCH 270/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#1160) Bumps [github.com/stackitcloud/stackit-sdk-go/services/rabbitmq](https://github.com/stackitcloud/stackit-sdk-go) from 0.25.2 to 0.25.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/logme/v0.25.2...services/logme/v0.25.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/rabbitmq dependency-version: 0.25.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 90ffd9630..a2b22022e 100644 --- a/go.mod +++ b/go.mod @@ -267,7 +267,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.39.0 // indirect diff --git a/go.sum b/go.sum index 58877a6f0..4e5a48809 100644 --- a/go.sum +++ b/go.sum @@ -630,8 +630,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqm github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2/go.mod h1:QenOJF1LD39d/arGFGZFCzHoQuwF6VuWCvS8CbdoMBw= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2/go.mod h1:rPwdDiCx0eZ+yKiy6Wo6uv76LuCgFlQxkomvun1c740= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2 h1:Ww0baLTiZha4H1thfEEsDq+O0Ce0hNhdbkJ5eDdGEoE= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.2/go.mod h1:lPz9iQ3kLvpzPR7jt6P1VJyjSumo2+D1i3RkjFGpVTI= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 h1:a9XjDC01il+3IDQIDgg5qcJBYcsu5rrTJyMfJZPyvCg= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3/go.mod h1:tjbSLF5+5JFx+qNazqhakqfPlCZPzque9R4XqRZzTRc= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXOvRNmSYMeF0qQ2+w4/ez04YutVDz73hSMuuOJ54= From 2bdaa5b918ab4b0688aaf0401e61594be13f45e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kce=20G=C3=B6k=20Klingel?= <161626272+GokceGK@users.noreply.github.com> Date: Tue, 9 Dec 2025 15:21:38 +0100 Subject: [PATCH 271/422] chore(docs): update links to new STACKIT docs (#1167) --- AUTHENTICATION.md | 6 +++--- README.md | 2 +- docs/stackit_beta_sqlserverflex_user_create.md | 2 +- docs/stackit_server_create.md | 2 +- docs/stackit_server_resize.md | 2 +- docs/stackit_ske_credentials_complete-rotation.md | 2 +- docs/stackit_ske_credentials_start-rotation.md | 2 +- internal/cmd/beta/sqlserverflex/user/create/create.go | 2 +- internal/cmd/server/create/create.go | 2 +- internal/cmd/server/resize/resize.go | 2 +- .../ske/credentials/complete-rotation/complete_rotation.go | 2 +- .../cmd/ske/credentials/start-rotation/start_rotation.go | 2 +- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/AUTHENTICATION.md b/AUTHENTICATION.md index 1cf3003f8..7da16657f 100644 --- a/AUTHENTICATION.md +++ b/AUTHENTICATION.md @@ -4,7 +4,7 @@ This document describes how you can configure authentication for the STACKIT CLI ## Service account -You can use a [service account](https://docs.stackit.cloud/stackit/en/service-accounts-134415819.html) to authenticate to the STACKIT CLI. +You can use a [service account](https://docs.stackit.cloud/platform/access-and-identity/service-accounts/) to authenticate to the STACKIT CLI. The CLI will search for service account credentials similarly to the [STACKIT SDK](https://github.com/stackitcloud/stackit-sdk-go) and [STACKIT Terraform Provider](https://github.com/stackitcloud/terraform-provider-stackit), so if you have already set up your environment for those tools, you can just run: ```bash @@ -47,14 +47,14 @@ To use the key flow, you need to have a service account key, which must have an When creating the service account key, a new RSA key-pair can be created automatically, which will be included in the service account key. This will make it much easier to configure the key flow authentication in the CLI, by just providing the service account key. -**Optionally**, you can provide your own private key when creating the service account key, which will then require you to also provide it explicitly to the CLI, additionally to the service account key. Check the STACKIT Knowledge Base for an [example of how to create your own key-pair](https://docs.stackit.cloud/stackit/en/usage-of-the-service-account-keys-in-stackit-175112464.html#UsageoftheserviceaccountkeysinSTACKIT-CreatinganRSAkey-pair). +**Optionally**, you can provide your own private key when creating the service account key, which will then require you to also provide it explicitly to the CLI, additionally to the service account key. Check the STACKIT Docs for an [example of how to create your own key-pair](https://docs.stackit.cloud/platform/access-and-identity/service-accounts/how-tos/manage-service-account-keys/). To configure the key flow, follow this steps: 1. Create a service account key: - In the CLI, run `stackit service-account key create --email ` -- As an alternative, use the [STACKIT Portal](https://portal.stackit.cloud/): go to the `Service Accounts` tab, choose a `Service Account` and go to `Service Account Keys` to create a key. For more details, see [Create a service account key](https://docs.stackit.cloud/stackit/en/create-a-service-account-key-175112456.html) +- As an alternative, use the [STACKIT Portal](https://portal.stackit.cloud/): go to the `Service Accounts` tab, choose a `Service Account` and go to `Service Account Keys` to create a key. For more details, see [Create a service account key](https://docs.stackit.cloud/platform/access-and-identity/service-accounts/how-tos/manage-service-account-keys/) 2. Save the content of the service account key by copying it and saving it in a JSON file. diff --git a/README.md b/README.md index 56fa01bcf..8c66fa532 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,6 @@ Apache 2.0 - [STACKIT](https://www.stackit.de/en/) -- [STACKIT Knowledge Base](https://docs.stackit.cloud/stackit/en/knowledge-base-85301704.html) +- [STACKIT Docs](https://docs.stackit.cloud/) - [STACKIT Terraform Provider](https://registry.terraform.io/providers/stackitcloud/stackit/latest/docs) diff --git a/docs/stackit_beta_sqlserverflex_user_create.md b/docs/stackit_beta_sqlserverflex_user_create.md index f1cf9dbbe..47aa6a5e3 100644 --- a/docs/stackit_beta_sqlserverflex_user_create.md +++ b/docs/stackit_beta_sqlserverflex_user_create.md @@ -9,7 +9,7 @@ Creates a SQLServer Flex user for an instance. The password is only visible upon creation and cannot be retrieved later. Alternatively, you can reset the password and access the new one by running: $ stackit beta sqlserverflex user reset-password USER_ID --instance-id INSTANCE_ID -Please refer to https://docs.stackit.cloud/stackit/en/creating-logins-and-users-in-sqlserver-flex-instances-210862358.html for additional information. +Please refer to https://docs.stackit.cloud/products/databases/sqlserver-flex/how-tos/create-logins-and-users-in-sqlserver-flex-instances/ for additional information. The allowed user roles for your instance can be obtained by running: $ stackit beta sqlserverflex options --user-roles --instance-id INSTANCE_ID diff --git a/docs/stackit_server_create.md b/docs/stackit_server_create.md index 27412840a..c1c4e9b21 100644 --- a/docs/stackit_server_create.md +++ b/docs/stackit_server_create.md @@ -55,7 +55,7 @@ stackit server create [flags] --image-id string The image ID to be used for an ephemeral disk on the server. Either 'image-id' or 'boot-volume-...' flags are required --keypair-name string The name of the SSH keypair used during the server creation --labels stringToString Labels are key-value string pairs which can be attached to a server. E.g. '--labels key1=value1,key2=value2,...' (default []) - --machine-type string Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/stackit/en/virtual-machine-flavors-75137231.html + --machine-type string Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/products/compute-engine/server/basics/machine-types/ -n, --name string Server name --network-id string ID of the network for the initial networking setup for the server creation --network-interface-ids strings List of network interface IDs for the initial networking setup for the server creation diff --git a/docs/stackit_server_resize.md b/docs/stackit_server_resize.md index c91335432..bbcb239f5 100644 --- a/docs/stackit_server_resize.md +++ b/docs/stackit_server_resize.md @@ -21,7 +21,7 @@ stackit server resize SERVER_ID [flags] ``` -h, --help Help for "stackit server resize" - --machine-type string Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/stackit/en/virtual-machine-flavors-75137231.html + --machine-type string Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/products/compute-engine/server/basics/machine-types/ ``` ### Options inherited from parent commands diff --git a/docs/stackit_ske_credentials_complete-rotation.md b/docs/stackit_ske_credentials_complete-rotation.md index 12536dba5..7df00136f 100644 --- a/docs/stackit_ske_credentials_complete-rotation.md +++ b/docs/stackit_ske_credentials_complete-rotation.md @@ -14,7 +14,7 @@ To ensure continued access to the Kubernetes cluster, please update your kubecon If you haven't, please start the process by running: $ stackit ske credentials start-rotation my-cluster -For more information, visit: https://docs.stackit.cloud/stackit/en/how-to-rotate-ske-credentials-200016334.html +For more information, visit: https://docs.stackit.cloud/products/runtime/kubernetes-engine/how-tos/rotate-ske-credentials/ ``` stackit ske credentials complete-rotation CLUSTER_NAME [flags] diff --git a/docs/stackit_ske_credentials_start-rotation.md b/docs/stackit_ske_credentials_start-rotation.md index aa8160adf..05200a386 100644 --- a/docs/stackit_ske_credentials_start-rotation.md +++ b/docs/stackit_ske_credentials_start-rotation.md @@ -18,7 +18,7 @@ After completing the rotation of credentials, you can generate a new kubeconfig $ stackit ske kubeconfig create my-cluster Complete the rotation by running: $ stackit ske credentials complete-rotation my-cluster -For more information, visit: https://docs.stackit.cloud/stackit/en/how-to-rotate-ske-credentials-200016334.html +For more information, visit: https://docs.stackit.cloud/products/runtime/kubernetes-engine/how-tos/rotate-ske-credentials/ ``` stackit ske credentials start-rotation CLUSTER_NAME [flags] diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index cb77255f9..5a818be70 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -43,7 +43,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { "The password is only visible upon creation and cannot be retrieved later.", "Alternatively, you can reset the password and access the new one by running:", " $ stackit beta sqlserverflex user reset-password USER_ID --instance-id INSTANCE_ID", - "Please refer to https://docs.stackit.cloud/stackit/en/creating-logins-and-users-in-sqlserver-flex-instances-210862358.html for additional information.", + "Please refer to https://docs.stackit.cloud/products/databases/sqlserver-flex/how-tos/create-logins-and-users-in-sqlserver-flex-instances/ for additional information.", "The allowed user roles for your instance can be obtained by running:", " $ stackit beta sqlserverflex options --user-roles --instance-id INSTANCE_ID", ), diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 841f21d1d..86f0af5dc 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -164,7 +164,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(nameFlag, "n", "", "Server name") - cmd.Flags().String(machineTypeFlag, "", "Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/stackit/en/virtual-machine-flavors-75137231.html") + cmd.Flags().String(machineTypeFlag, "", "Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/products/compute-engine/server/basics/machine-types/") cmd.Flags().String(affinityGroupFlag, "", "The affinity group the server is assigned to") cmd.Flags().String(availabilityZoneFlag, "", "The availability zone of the server") cmd.Flags().String(bootVolumeSourceIdFlag, "", "ID of the source object of boot volume. It can be either an image or volume ID") diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index 495098b40..d2a7836a2 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -107,7 +107,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { - cmd.Flags().String(machineTypeFlag, "", "Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/stackit/en/virtual-machine-flavors-75137231.html") + cmd.Flags().String(machineTypeFlag, "", "Name of the type of the machine for the server. Possible values are documented in https://docs.stackit.cloud/products/compute-engine/server/basics/machine-types/") err := flags.MarkFlagsRequired(cmd, machineTypeFlag) cobra.CheckErr(err) diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index d9970b539..5fc0f81bb 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -41,7 +41,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { " $ stackit ske kubeconfig create my-cluster", "If you haven't, please start the process by running:", " $ stackit ske credentials start-rotation my-cluster", - "For more information, visit: https://docs.stackit.cloud/stackit/en/how-to-rotate-ske-credentials-200016334.html", + "For more information, visit: https://docs.stackit.cloud/products/runtime/kubernetes-engine/how-tos/rotate-ske-credentials/", ), Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index 91af511fd..fa239775a 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -45,7 +45,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { " $ stackit ske kubeconfig create my-cluster", "Complete the rotation by running:", " $ stackit ske credentials complete-rotation my-cluster", - "For more information, visit: https://docs.stackit.cloud/stackit/en/how-to-rotate-ske-credentials-200016334.html", + "For more information, visit: https://docs.stackit.cloud/products/runtime/kubernetes-engine/how-tos/rotate-ske-credentials/", ), Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( From aead8fd4c94dab91cf1a53e1477732c0c9b1bb03 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:25:23 +0100 Subject: [PATCH 272/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/logme (#1172) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a2b22022e..5a5b5fc02 100644 --- a/go.mod +++ b/go.mod @@ -263,7 +263,7 @@ require ( github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 diff --git a/go.sum b/go.sum index 4e5a48809..479880ed1 100644 --- a/go.sum +++ b/go.sum @@ -616,8 +616,8 @@ github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EG github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1/go.mod h1:Wh1NKX5ZI0FuIdYavOYu0Cjh0yA3S9rlm4j5g0vuPVI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 h1:BHNjq4+OsmVrGu1KBOv0dh/++nwysyINtAUTxNFz2Uo= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1/go.mod h1:sTV6ylmBoMOrOxUED8Ebts4a1PaJSPLtmNh5m+s5fus= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2 h1:g3xzRqwul8W638gOKTZRAnnQuMhYqaliuz/A8BcfjhU= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.2/go.mod h1:OlGmMlXKp33ZYpUm9TqaLYf8SdzhDW5uBKcbgq1zXOk= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 h1:tGa+NcjNKTWvChN+0OMdLomb9Jod4MmY6YAiPTJMgfo= From f9d5b221f8c81f8337fe210c7848dbd48bb6820b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:34:00 +0000 Subject: [PATCH 273/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1171) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5a5b5fc02..1053f4244 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.31.0 diff --git a/go.sum b/go.sum index 479880ed1..be8359a3e 100644 --- a/go.sum +++ b/go.sum @@ -648,8 +648,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 h1:+S5yPf github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2/go.mod h1:gaHXopzXPDP1AmquUVhMmz9opAr2QYVBL0XbBdPtB7s= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL+rpQZWXZazL8w8DqXYxGbIOInaUc155BWTshNRA= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3/go.mod h1:icu5WtsZ8c57/pUrXeFLmZu29Qhwr/rsjTkVRWJYTqY= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0 h1:bQk5qKid5Kv3fZ2miWlS5Dvo+cW90hbePaxOyWF67EE= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.0/go.mod h1:/Ujlw+qo6RgKm69dD8y6MgmJFcUmrHjuJPO6VFoQX9U= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 h1:HVlBylGwXVR3qDUGwUMqofAcLEawRaWSgeYXbyAcN1E= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 h1:IUhMJH9fQ+CaMas+5bbnrH7m1Hadf1vWoUtu9KeAEFM= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= From 037122d98779bd99a955fc0000adfdbae662b16d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 10:43:53 +0000 Subject: [PATCH 274/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/dns (#1170) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1053f4244..eb88f4938 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.20.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 diff --git a/go.sum b/go.sum index be8359a3e..d60cfb652 100644 --- a/go.sum +++ b/go.sum @@ -604,8 +604,8 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 h1:x7ndqw6yaOw+TmThNe github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2/go.mod h1:wbPNu6e5r/5xhzznCKbC7fEJahrAOb89gmaIm+0w2/s= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5CuPb5ixdMHx4tKjmsQkMn0Hpj0xJ+aNDimKnk= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0/go.mod h1:40XVgsSOcVCjoIAsbSycDh8Ikp2y88AdAeqwqIIHvZE= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2 h1:x1i5rqhEVuUPq5M0eb68ZD2KL1C8OFD8RG2sWMQGL6o= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.2/go.mod h1:nOdpHeRWeiPlioOGovHzLpojlilbxAxoXsAy+TiOpw4= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 h1:OpPPLUIpObDYmqJr+8aRq/J+YD663nhl3t1Fft2cIzQ= From 74a682d0d3b0adb099265c00932d752aacc4cb70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:55:43 +0100 Subject: [PATCH 275/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/runcommand (#1168) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eb88f4938..316f757f0 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 diff --git a/go.sum b/go.sum index d60cfb652..835d79925 100644 --- a/go.sum +++ b/go.sum @@ -636,8 +636,8 @@ github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRugh github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXOvRNmSYMeF0qQ2+w4/ez04YutVDz73hSMuuOJ54= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2 h1:Jts49V7XvLLr7MwI9o5Mo0NW3iUVVt8DtqNqRDt6ags= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.2/go.mod h1:hV1rmsyb3jlL5kWO+flhtXTbm5EM9vU+BJsV4U/YEUU= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRAVUMsbeoVQhCxb7GpNSmzq15jJuaBUSFo= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2nwMi1JxDYW2p8LL4cSB3eoOjlqPHioDWU0= From f15e9666ddce0f566fb01d85c943a144902151ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:04:42 +0000 Subject: [PATCH 276/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1169) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 316f757f0..1bb0cbb95 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 diff --git a/go.sum b/go.sum index 835d79925..c3c0b6b82 100644 --- a/go.sum +++ b/go.sum @@ -600,8 +600,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2 h1:x7ndqw6yaOw+TmThNeAkI+eN9vK5hWgjIJlFZrYPREo= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.2/go.mod h1:wbPNu6e5r/5xhzznCKbC7fEJahrAOb89gmaIm+0w2/s= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 h1:DqRtyuIb34/x9C3/sT7Uz5xrD0TQOL3ERnDOS1gst4E= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5CuPb5ixdMHx4tKjmsQkMn0Hpj0xJ+aNDimKnk= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0/go.mod h1:40XVgsSOcVCjoIAsbSycDh8Ikp2y88AdAeqwqIIHvZE= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= From 43a57652b984022169e84e9e8b5eae8fc0e7bf8a Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:13:42 +0100 Subject: [PATCH 277/422] fix(deps): update module github.com/jedib0t/go-pretty/v6 to v6.7.7 (#1174) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1bb0cbb95..d29cdb085 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.7.5 + github.com/jedib0t/go-pretty/v6 v6.7.7 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.2 diff --git a/go.sum b/go.sum index c3c0b6b82..ac62b2c33 100644 --- a/go.sum +++ b/go.sum @@ -371,8 +371,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3UzhtuiM= -github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.7 h1:Y1Id3lJ3k4UB8uwWWy3l8EVFnUlx5chR5+VbsofPNX0= +github.com/jedib0t/go-pretty/v6 v6.7.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4= github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From ac6919d3426a848c04fd29f6c275fcc3b29e80a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:36:30 +0100 Subject: [PATCH 278/422] chore(deps): bump actions/upload-artifact from 5 to 6 (#1181) --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 48e304976..67954c08f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -36,7 +36,7 @@ jobs: run: make test - name: Archive code coverage results - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} path: ${{ env.CODE_COVERAGE_FILE_NAME }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 108d24521..3cd5f7d9d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -90,7 +90,7 @@ jobs: rm -f "$GPG_KEY_PATH" - name: Upload artifacts to workflow - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: goreleaser-dist-temp path: dist From f27c598a05d744d26c86bb94d5c585c461e8f8bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 08:42:53 +0000 Subject: [PATCH 279/422] chore(deps): bump actions/download-artifact from 6 to 7 (#1180) --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3cd5f7d9d..e9377a728 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -110,7 +110,7 @@ jobs: # use the artifacts from the "goreleaser" job - name: Download artifacts from workflow - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: goreleaser-dist-temp path: dist @@ -147,7 +147,7 @@ jobs: uses: actions/checkout@v6 - name: Download artifacts from workflow - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: goreleaser-dist-temp path: dist From 9660efb0de49658cd41c32dfb9e805fddf34f784 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 08:51:56 +0000 Subject: [PATCH 280/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/secretsmanager (#1179) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d29cdb085..174813580 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 diff --git a/go.sum b/go.sum index ac62b2c33..372d4dd28 100644 --- a/go.sum +++ b/go.sum @@ -638,8 +638,8 @@ github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXO github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRAVUMsbeoVQhCxb7GpNSmzq15jJuaBUSFo= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2 h1:z7ZJtp742W6AgleV2eEXrJFZ7ai9rXu9V1Lkmir0drI= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.2/go.mod h1:xm0ARtIbfzmqw8e8qThtrYdHHEkpuYvKt13SZGBoWSE= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3 h1:9DZDISle23rdgWH8YBBujCWnEqUOQ9RAh6/G8wEHb3w= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3/go.mod h1:dMBt/b/LXfXTDLQTCW6PRhBlbl41q7XS+5mAyBezSJk= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2nwMi1JxDYW2p8LL4cSB3eoOjlqPHioDWU0= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= From d821c09e87c451c10cae21c51541a1518317920c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:27:21 +0100 Subject: [PATCH 281/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#1178) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 174813580..2804f40cd 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 diff --git a/go.sum b/go.sum index 372d4dd28..01af6c3cf 100644 --- a/go.sum +++ b/go.sum @@ -620,8 +620,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+Ft github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3 h1:tGa+NcjNKTWvChN+0OMdLomb9Jod4MmY6YAiPTJMgfo= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.3/go.mod h1:ciuOzwN5GcqplRy95fXRaS44dFmhfNxvmzTl/ALwV/k= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 h1:4LA0Mw7Y8swLRQBvQ/JRv1fUSlnrIHilWklX4v3SZ0A= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4/go.mod h1:G/UD3tzPzzu79MiFWUYqogxdLMB+YArNHR6Yqz7Cqr0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 h1:nsC6oA1whA4ibxEuD+0Osngmnpz8dLdV6bv+9jYP4Eo= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2/go.mod h1:WA6QlAAQ8aaw81W0VSVoDrxOfchGkdtmn2jQL/ub/50= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= From 4a046e63ec6b0f1e35422e1f37a2bb943ea7b473 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 09:37:11 +0000 Subject: [PATCH 282/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/authorization (#1176) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2804f40cd..5648f7990 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 diff --git a/go.sum b/go.sum index 01af6c3cf..599e04f4a 100644 --- a/go.sum +++ b/go.sum @@ -602,8 +602,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98e github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 h1:DqRtyuIb34/x9C3/sT7Uz5xrD0TQOL3ERnDOS1gst4E= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0 h1:6Buzw5CuPb5ixdMHx4tKjmsQkMn0Hpj0xJ+aNDimKnk= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.0/go.mod h1:40XVgsSOcVCjoIAsbSycDh8Ikp2y88AdAeqwqIIHvZE= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1 h1:Z7K6CfjbWSAzFbAXFzxefRBap/dujpK2TZgJqBUZ8NQ= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= From 1e87acb9ab6f99c9f5509dac356f455150a61ba3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:52:33 +0100 Subject: [PATCH 283/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/intake (#1177) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5648f7990..bb0b97338 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 - github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 + github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 diff --git a/go.sum b/go.sum index 599e04f4a..ad9680c84 100644 --- a/go.sum +++ b/go.sum @@ -610,8 +610,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjU github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 h1:OpPPLUIpObDYmqJr+8aRq/J+YD663nhl3t1Fft2cIzQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= -github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0 h1:KwjR5L+IoUbRYS8k3dyqHgtBUuq8cqRPrUrzzZSSnRI= -github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.0/go.mod h1:Nea8wkoPGvcjKCsjfbAB3pE3kA7oZLi+Zk9hUtunjRI= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u+YU3brMhQwYZYxu809o3uW5SH4HA= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1/go.mod h1:Wh1NKX5ZI0FuIdYavOYu0Cjh0yA3S9rlm4j5g0vuPVI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 h1:BHNjq4+OsmVrGu1KBOv0dh/++nwysyINtAUTxNFz2Uo= From ea693eec30aaa9663683af43093071fbf73d863f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:01:22 +0000 Subject: [PATCH 284/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/opensearch (#1175) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bb0b97338..15675e785 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 diff --git a/go.sum b/go.sum index ad9680c84..e48119717 100644 --- a/go.sum +++ b/go.sum @@ -626,8 +626,8 @@ github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 h1:nsC6oA1w github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2/go.mod h1:WA6QlAAQ8aaw81W0VSVoDrxOfchGkdtmn2jQL/ub/50= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1/go.mod h1:vapb/sJqbHlf+c7pZWdE9GqrbyI8wesGvUc9o7oJ1Xk= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2 h1:J9WP0lBoqmaQF/OjDw4MwDUbmhwlNBTi9zHdwsXJ3ug= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.2/go.mod h1:QenOJF1LD39d/arGFGZFCzHoQuwF6VuWCvS8CbdoMBw= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 h1:CAgu3Wsmo8pA1/VWqnqLftMn7X26uDs5zctTci4WG7A= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3/go.mod h1:VC3vqIQIDN+8SAzhlMdrK4eXeiSaNE1JtjIGFzpgiRI= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2/go.mod h1:rPwdDiCx0eZ+yKiy6Wo6uv76LuCgFlQxkomvun1c740= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 h1:a9XjDC01il+3IDQIDgg5qcJBYcsu5rrTJyMfJZPyvCg= From 1535eec6c385d45fd8160487aa024d55f210a93b Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Wed, 17 Dec 2025 12:04:46 +0100 Subject: [PATCH 285/422] feat: max_age is set during auth request to limit user session (#1134) relates to STACKITCLI-294 --- docs/stackit_config_set.md | 2 +- docs/stackit_config_unset.md | 2 +- .../config/profile/import/template/profile.json | 2 +- internal/cmd/config/set/set.go | 2 +- internal/pkg/auth/auth.go | 14 +++++++++++--- internal/pkg/auth/user_login.go | 7 ++++++- internal/pkg/config/config.go | 2 +- internal/pkg/config/template/test_profile.json | 2 +- 8 files changed, 23 insertions(+), 10 deletions(-) diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index 1b4549617..13050384f 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -55,7 +55,7 @@ stackit config set [flags] --serverbackup-custom-endpoint string Server Backup API base URL, used in calls to this API --service-account-custom-endpoint string Service Account API base URL, used in calls to this API --service-enablement-custom-endpoint string Service Enablement API base URL, used in calls to this API - --session-time-limit string Maximum time before authentication is required again. After this time, you will be prompted to login again to execute commands that require authentication. Can't be larger than 24h. Requires authentication after being set to take effect. Examples: 3h, 5h30m40s (BETA: currently values greater than 2h have no effect) + --session-time-limit string Maximum time before authentication is required again. After this time, you will be prompted to login again to execute commands that require authentication. Can't be larger than 24h. Requires authentication after being set to take effect. Examples: 3h, 5h30m40s --ske-custom-endpoint string SKE API base URL, used in calls to this API --sqlserverflex-custom-endpoint string SQLServer Flex API base URL, used in calls to this API --token-custom-endpoint string Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication. diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index cfe34ab0b..88b5b3bd8 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -56,7 +56,7 @@ stackit config unset [flags] --serverbackup-custom-endpoint Server Backup base URL. If unset, uses the default base URL --service-account-custom-endpoint Service Account API base URL. If unset, uses the default base URL --service-enablement-custom-endpoint Service Enablement API base URL. If unset, uses the default base URL - --session-time-limit Maximum time before authentication is required again. If unset, defaults to 2h + --session-time-limit Maximum time before authentication is required again. If unset, defaults to 12h --ske-custom-endpoint SKE API base URL. If unset, uses the default base URL --sqlserverflex-custom-endpoint SQLServer Flex API base URL. If unset, uses the default base URL --token-custom-endpoint Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication. diff --git a/internal/cmd/config/profile/import/template/profile.json b/internal/cmd/config/profile/import/template/profile.json index ab56ce66b..dbc0bad02 100644 --- a/internal/cmd/config/profile/import/template/profile.json +++ b/internal/cmd/config/profile/import/template/profile.json @@ -25,7 +25,7 @@ "serverbackup_custom_endpoint": "", "service_account_custom_endpoint": "", "service_enablement_custom_endpoint": "", - "session_time_limit": "2h", + "session_time_limit": "12h", "ske_custom_endpoint": "", "sqlserverflex_custom_endpoint": "", "token_custom_endpoint": "", diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index e6da6ce7c..b23fbba9b 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -135,7 +135,7 @@ Use "{{.CommandPath}} [command] --help" for more information about a command.{{e } func configureFlags(cmd *cobra.Command) { - cmd.Flags().String(sessionTimeLimitFlag, "", "Maximum time before authentication is required again. After this time, you will be prompted to login again to execute commands that require authentication. Can't be larger than 24h. Requires authentication after being set to take effect. Examples: 3h, 5h30m40s (BETA: currently values greater than 2h have no effect)") + cmd.Flags().String(sessionTimeLimitFlag, "", "Maximum time before authentication is required again. After this time, you will be prompted to login again to execute commands that require authentication. Can't be larger than 24h. Requires authentication after being set to take effect. Examples: 3h, 5h30m40s") cmd.Flags().String(identityProviderCustomWellKnownConfigurationFlag, "", "Identity Provider well-known OpenID configuration URL, used for user authentication") cmd.Flags().String(identityProviderCustomClientIdFlag, "", "Identity Provider client ID, used for user authentication") cmd.Flags().String(allowedUrlDomainFlag, "", `Domain name, used for the verification of the URLs that are given in the custom identity provider endpoint and "STACKIT curl" command`) diff --git a/internal/pkg/auth/auth.go b/internal/pkg/auth/auth.go index ea549a2cb..dd56536d3 100644 --- a/internal/pkg/auth/auth.go +++ b/internal/pkg/auth/auth.go @@ -110,15 +110,23 @@ func GetAccessToken() (string, error) { func getStartingSessionExpiresAtUnix() (string, error) { sessionStart := time.Now() - sessionTimeLimitString := viper.GetString(config.SessionTimeLimitKey) - sessionTimeLimit, err := time.ParseDuration(sessionTimeLimitString) + sessionTimeLimit, err := getSessionExpiration() if err != nil { - return "", fmt.Errorf("parse session time limit \"%s\": %w", sessionTimeLimitString, err) + return "", err } sessionExpiresAt := sessionStart.Add(sessionTimeLimit) return strconv.FormatInt(sessionExpiresAt.Unix(), 10), nil } +func getSessionExpiration() (time.Duration, error) { + sessionTimeLimitString := viper.GetString(config.SessionTimeLimitKey) + duration, err := time.ParseDuration(sessionTimeLimitString) + if err != nil { + return 0, fmt.Errorf("parse session time limit \"%s\": %w", sessionTimeLimitString, err) + } + return duration, nil +} + func getEmailFromToken(token string) (string, error) { // We can safely use ParseUnverified because we are not authenticating the user at this point, // We are parsing the token just to get the service account e-mail diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index c01dbccba..054c74c89 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -121,8 +121,13 @@ func AuthorizeUser(p *print.Printer, isReauthentication bool) error { // Initialize the code verifier codeVerifier := oauth2.GenerateVerifier() + // Generate max age based on the session time limit + maxSessionDuration, err := getSessionExpiration() + if err != nil { + return err + } // Construct the authorization URL - authorizationURL := conf.AuthCodeURL("", oauth2.S256ChallengeOption(codeVerifier)) + authorizationURL := conf.AuthCodeURL("", oauth2.S256ChallengeOption(codeVerifier), oauth2.SetAuthURLParam("max_age", fmt.Sprintf("%d", int64(maxSessionDuration.Seconds())))) // Start a web server to listen on a callback URL mux := http.NewServeMux() diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 89cc4decb..68ca2ee8c 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -55,7 +55,7 @@ const ( AsyncDefault = false RegionDefault = "eu01" - SessionTimeLimitDefault = "2h" + SessionTimeLimitDefault = "12h" AllowedUrlDomainDefault = "stackit.cloud" ) diff --git a/internal/pkg/config/template/test_profile.json b/internal/pkg/config/template/test_profile.json index ab56ce66b..dbc0bad02 100644 --- a/internal/pkg/config/template/test_profile.json +++ b/internal/pkg/config/template/test_profile.json @@ -25,7 +25,7 @@ "serverbackup_custom_endpoint": "", "service_account_custom_endpoint": "", "service_enablement_custom_endpoint": "", - "session_time_limit": "2h", + "session_time_limit": "12h", "ske_custom_endpoint": "", "sqlserverflex_custom_endpoint": "", "token_custom_endpoint": "", From ae0838d911d382c5701c9058caabdca9ecb7566b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:30:52 +0100 Subject: [PATCH 286/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1189) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 15675e785..125052932 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 diff --git a/go.sum b/go.sum index e48119717..979212ba4 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwi github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4 h1:OpPPLUIpObDYmqJr+8aRq/J+YD663nhl3t1Fft2cIzQ= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.2.4/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u+YU3brMhQwYZYxu809o3uW5SH4HA= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= From f7bb29bd4e980cb024f69e4c3cb8ce475e9cc7ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 15:43:53 +0000 Subject: [PATCH 287/422] chore(deps): bump renovatebot/github-action from 44.0.5 to 44.2.0 (#1182) --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index d9eddd18a..d0c4954cf 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.0.5 + uses: renovatebot/github-action@v44.2.0 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From d3695f514a884bc7a63ef92d5aba4c9383293fc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:01:05 +0000 Subject: [PATCH 288/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#1185) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 125052932..7d761aa94 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 diff --git a/go.sum b/go.sum index 979212ba4..927d3f4fd 100644 --- a/go.sum +++ b/go.sum @@ -644,8 +644,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2 h1:+S5yPftGLH99ByzDCwzdI927bvKOKMQxMkd/tuPeQTE= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.2/go.mod h1:gaHXopzXPDP1AmquUVhMmz9opAr2QYVBL0XbBdPtB7s= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 h1:XV3pPXpdvQjR5Z90FFutU4iqCHfejDYQAL840Y4ztLM= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3/go.mod h1:YNJJ1jwBWjEdLH6vECuzoslJY9jQThIvDvTa30J3D0U= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL+rpQZWXZazL8w8DqXYxGbIOInaUc155BWTshNRA= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3/go.mod h1:icu5WtsZ8c57/pUrXeFLmZu29Qhwr/rsjTkVRWJYTqY= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 h1:HVlBylGwXVR3qDUGwUMqofAcLEawRaWSgeYXbyAcN1E= From 81edb2db36295ee97aaf415a3237da86f5ac3e71 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 18 Dec 2025 09:13:09 +0100 Subject: [PATCH 289/422] fix(deps): update module github.com/goccy/go-yaml to v1.19.1 (#1191) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7d761aa94..2e8b75395 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.24.0 require ( github.com/fatih/color v1.18.0 - github.com/goccy/go-yaml v1.19.0 + github.com/goccy/go-yaml v1.19.1 github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 927d3f4fd..434c5f67c 100644 --- a/go.sum +++ b/go.sum @@ -239,8 +239,8 @@ github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUW github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.19.0 h1:EmkZ9RIsX+Uq4DYFowegAuJo8+xdX3T/2dwNPXbxEYE= -github.com/goccy/go-yaml v1.19.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.19.1 h1:3rG3+v8pkhRqoQ/88NYNMHYVGYztCOCIZ7UQhu7H+NE= +github.com/goccy/go-yaml v1.19.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godoc-lint/godoc-lint v0.10.2 h1:dksNgK+zebnVlj4Fx83CRnCmPO0qRat/9xfFsir1nfg= From d84c7a42bf431ca789776e543a3676cf7786b37a Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Thu, 18 Dec 2025 11:30:26 +0100 Subject: [PATCH 290/422] feat: add label to ignore stale (#1193) --- .github/workflows/stale.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index f5e745a71..894da7025 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -11,6 +11,7 @@ on: env: DAYS_BEFORE_PR_STALE: 7 DAYS_BEFORE_PR_CLOSE: 7 + EXEMPT_PR_LABELS: "ignore-stale" permissions: issues: write @@ -30,6 +31,7 @@ jobs: close-pr-message: "This PR was closed automatically because it has been stalled for ${{ env.DAYS_BEFORE_PR_CLOSE }} days with no activity. Feel free to re-open it at any time." days-before-pr-stale: ${{ env.DAYS_BEFORE_PR_STALE }} days-before-pr-close: ${{ env.DAYS_BEFORE_PR_CLOSE }} + exempt-pr-labels: ${{ env.EXEMPT_PR_LABELS }} # never mark issues as stale or close them days-before-issue-stale: -1 days-before-issue-close: -1 From 2e3dac3330893c22b74aa04d0b26b77951a0c6ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Dec 2025 11:27:15 +0000 Subject: [PATCH 291/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceenablement (#1188) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2e8b75395..e1331561e 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 github.com/zalando/go-keyring v0.2.6 diff --git a/go.sum b/go.sum index 434c5f67c..4c65f767c 100644 --- a/go.sum +++ b/go.sum @@ -646,8 +646,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91q github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 h1:XV3pPXpdvQjR5Z90FFutU4iqCHfejDYQAL840Y4ztLM= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3/go.mod h1:YNJJ1jwBWjEdLH6vECuzoslJY9jQThIvDvTa30J3D0U= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3 h1:zcfL+rpQZWXZazL8w8DqXYxGbIOInaUc155BWTshNRA= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.3/go.mod h1:icu5WtsZ8c57/pUrXeFLmZu29Qhwr/rsjTkVRWJYTqY= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aSfJPMBBcXrG/BZiLLZRvvGJesRdll4bLP7jetuKA= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 h1:HVlBylGwXVR3qDUGwUMqofAcLEawRaWSgeYXbyAcN1E= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 h1:IUhMJH9fQ+CaMas+5bbnrH7m1Hadf1vWoUtu9KeAEFM= From 9f5e2e5e8a4874c3751870525947949d3c8e99c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 13:41:14 +0100 Subject: [PATCH 292/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/kms (#1187) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e1331561e..fd6c3faba 100644 --- a/go.mod +++ b/go.mod @@ -261,7 +261,7 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 + github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 diff --git a/go.sum b/go.sum index 4c65f767c..f39fa6d47 100644 --- a/go.sum +++ b/go.sum @@ -612,8 +612,8 @@ 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/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u+YU3brMhQwYZYxu809o3uW5SH4HA= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1 h1:F/2qLBATi0nDjKR8EGbsmSX9CLFp3nBcWV8JAeTz4p8= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.1/go.mod h1:Wh1NKX5ZI0FuIdYavOYu0Cjh0yA3S9rlm4j5g0vuPVI= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2 h1:YsgqwU+qc+AL5yOaXIb/Va3ANAjXDnSJtIflZ6EeM0w= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 h1:BHNjq4+OsmVrGu1KBOv0dh/++nwysyINtAUTxNFz2Uo= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1/go.mod h1:sTV6ylmBoMOrOxUED8Ebts4a1PaJSPLtmNh5m+s5fus= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= From d536b0c22f50862e613cb0e294c22387dc3f763e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 12:50:42 +0000 Subject: [PATCH 293/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#1194) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fd6c3faba..249261c95 100644 --- a/go.mod +++ b/go.mod @@ -262,7 +262,7 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2 - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 diff --git a/go.sum b/go.sum index f39fa6d47..ae0c06e51 100644 --- a/go.sum +++ b/go.sum @@ -614,8 +614,8 @@ github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2 h1:YsgqwU+qc+AL5yOaXIb/Va3ANAjXDnSJtIflZ6EeM0w= github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1 h1:BHNjq4+OsmVrGu1KBOv0dh/++nwysyINtAUTxNFz2Uo= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.1/go.mod h1:sTV6ylmBoMOrOxUED8Ebts4a1PaJSPLtmNh5m+s5fus= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2 h1:DwwRMzvnKWTbfmLvq2xe+mYhv5fA1AwWdQGznI05sGc= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= From 09164393b28063b9f0e11619a68df7111b51fcce Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Fri, 19 Dec 2025 14:36:00 +0100 Subject: [PATCH 294/422] feat(sfs): Onboard sfs commands (#1197) - export-policy - performance-class - resource-pool - share - snapshot Signed-off-by: Alexander Dahmen --- docs/stackit_beta.md | 1 + docs/stackit_beta_sfs.md | 38 ++ docs/stackit_beta_sfs_export-policy.md | 38 ++ docs/stackit_beta_sfs_export-policy_create.md | 45 +++ docs/stackit_beta_sfs_export-policy_delete.md | 40 ++ ...stackit_beta_sfs_export-policy_describe.md | 40 ++ docs/stackit_beta_sfs_export-policy_list.md | 44 +++ docs/stackit_beta_sfs_export-policy_update.md | 45 +++ docs/stackit_beta_sfs_performance-class.md | 34 ++ ...stackit_beta_sfs_performance-class_list.md | 40 ++ docs/stackit_beta_sfs_resource-pool.md | 38 ++ docs/stackit_beta_sfs_resource-pool_create.md | 58 +++ docs/stackit_beta_sfs_resource-pool_delete.md | 40 ++ ...stackit_beta_sfs_resource-pool_describe.md | 40 ++ docs/stackit_beta_sfs_resource-pool_list.md | 47 +++ docs/stackit_beta_sfs_resource-pool_update.md | 56 +++ docs/stackit_beta_sfs_share.md | 38 ++ docs/stackit_beta_sfs_share_create.md | 47 +++ docs/stackit_beta_sfs_share_delete.md | 41 ++ docs/stackit_beta_sfs_share_describe.md | 41 ++ docs/stackit_beta_sfs_share_list.md | 45 +++ docs/stackit_beta_sfs_share_update.md | 46 +++ docs/stackit_beta_sfs_snapshot.md | 37 ++ docs/stackit_beta_sfs_snapshot_create.md | 46 +++ docs/stackit_beta_sfs_snapshot_delete.md | 41 ++ docs/stackit_beta_sfs_snapshot_describe.md | 41 ++ docs/stackit_beta_sfs_snapshot_list.md | 42 ++ docs/stackit_config_set.md | 1 + docs/stackit_config_unset.md | 1 + go.mod | 1 + go.sum | 2 + internal/cmd/beta/beta.go | 2 + .../beta/sfs/export-policy/create/create.go | 151 ++++++++ .../sfs/export-policy/create/create_test.go | 212 ++++++++++ .../beta/sfs/export-policy/delete/delete.go | 100 +++++ .../sfs/export-policy/delete/delete_test.go | 174 +++++++++ .../sfs/export-policy/describe/describe.go | 151 ++++++++ .../export-policy/describe/describe_test.go | 221 +++++++++++ .../beta/sfs/export-policy/export-policy.go | 33 ++ .../cmd/beta/sfs/export-policy/list/list.go | 147 +++++++ .../beta/sfs/export-policy/list/list_test.go | 176 +++++++++ .../test-files/rules-example.json | 14 + .../beta/sfs/export-policy/update/update.go | 172 +++++++++ .../sfs/export-policy/update/update_test.go | 251 ++++++++++++ .../beta/sfs/performance-class/list/list.go | 110 ++++++ .../sfs/performance-class/list/list_test.go | 170 +++++++++ .../performance-class/performance_class.go | 26 ++ .../beta/sfs/resource-pool/create/create.go | 184 +++++++++ .../sfs/resource-pool/create/create_test.go | 295 ++++++++++++++ .../beta/sfs/resource-pool/delete/delete.go | 120 ++++++ .../sfs/resource-pool/delete/delete_test.go | 209 ++++++++++ .../sfs/resource-pool/describe/describe.go | 152 ++++++++ .../resource-pool/describe/describe_test.go | 211 ++++++++++ .../cmd/beta/sfs/resource-pool/list/list.go | 153 ++++++++ .../beta/sfs/resource-pool/list/list_test.go | 199 ++++++++++ .../beta/sfs/resource-pool/resource_pool.go | 34 ++ .../beta/sfs/resource-pool/update/update.go | 179 +++++++++ .../sfs/resource-pool/update/update_test.go | 361 ++++++++++++++++++ internal/cmd/beta/sfs/sfs.go | 34 ++ internal/cmd/beta/sfs/share/create/create.go | 181 +++++++++ .../cmd/beta/sfs/share/create/create_test.go | 207 ++++++++++ internal/cmd/beta/sfs/share/delete/delete.go | 134 +++++++ .../cmd/beta/sfs/share/delete/delete_test.go | 186 +++++++++ .../cmd/beta/sfs/share/describe/describe.go | 191 +++++++++ .../beta/sfs/share/describe/describe_test.go | 233 +++++++++++ internal/cmd/beta/sfs/share/list/list.go | 158 ++++++++ internal/cmd/beta/sfs/share/list/list_test.go | 207 ++++++++++ internal/cmd/beta/sfs/share/share.go | 34 ++ internal/cmd/beta/sfs/share/update/update.go | 181 +++++++++ .../cmd/beta/sfs/share/update/update_test.go | 266 +++++++++++++ .../cmd/beta/sfs/snapshot/create/create.go | 142 +++++++ .../beta/sfs/snapshot/create/create_test.go | 218 +++++++++++ .../cmd/beta/sfs/snapshot/delete/delete.go | 114 ++++++ .../beta/sfs/snapshot/delete/delete_test.go | 188 +++++++++ .../beta/sfs/snapshot/describe/describe.go | 129 +++++++ .../sfs/snapshot/describe/describe_test.go | 233 +++++++++++ internal/cmd/beta/sfs/snapshot/list/list.go | 148 +++++++ .../cmd/beta/sfs/snapshot/list/list_test.go | 173 +++++++++ internal/cmd/beta/sfs/snapshot/snapshot.go | 32 ++ .../profile/import/template/profile.json | 1 + internal/cmd/config/set/set.go | 4 + internal/cmd/config/unset/unset.go | 7 + internal/cmd/config/unset/unset_test.go | 13 + internal/pkg/config/config.go | 1 + .../pkg/config/template/test_profile.json | 1 + internal/pkg/services/sfs/client/client.go | 14 + internal/pkg/services/sfs/utils/utils.go | 47 +++ internal/pkg/services/sfs/utils/utils_test.go | 206 ++++++++++ internal/pkg/testutils/options.go | 16 + internal/pkg/testutils/testutils.go | 15 +- 90 files changed, 9034 insertions(+), 1 deletion(-) create mode 100644 docs/stackit_beta_sfs.md create mode 100644 docs/stackit_beta_sfs_export-policy.md create mode 100644 docs/stackit_beta_sfs_export-policy_create.md create mode 100644 docs/stackit_beta_sfs_export-policy_delete.md create mode 100644 docs/stackit_beta_sfs_export-policy_describe.md create mode 100644 docs/stackit_beta_sfs_export-policy_list.md create mode 100644 docs/stackit_beta_sfs_export-policy_update.md create mode 100644 docs/stackit_beta_sfs_performance-class.md create mode 100644 docs/stackit_beta_sfs_performance-class_list.md create mode 100644 docs/stackit_beta_sfs_resource-pool.md create mode 100644 docs/stackit_beta_sfs_resource-pool_create.md create mode 100644 docs/stackit_beta_sfs_resource-pool_delete.md create mode 100644 docs/stackit_beta_sfs_resource-pool_describe.md create mode 100644 docs/stackit_beta_sfs_resource-pool_list.md create mode 100644 docs/stackit_beta_sfs_resource-pool_update.md create mode 100644 docs/stackit_beta_sfs_share.md create mode 100644 docs/stackit_beta_sfs_share_create.md create mode 100644 docs/stackit_beta_sfs_share_delete.md create mode 100644 docs/stackit_beta_sfs_share_describe.md create mode 100644 docs/stackit_beta_sfs_share_list.md create mode 100644 docs/stackit_beta_sfs_share_update.md create mode 100644 docs/stackit_beta_sfs_snapshot.md create mode 100644 docs/stackit_beta_sfs_snapshot_create.md create mode 100644 docs/stackit_beta_sfs_snapshot_delete.md create mode 100644 docs/stackit_beta_sfs_snapshot_describe.md create mode 100644 docs/stackit_beta_sfs_snapshot_list.md create mode 100644 internal/cmd/beta/sfs/export-policy/create/create.go create mode 100644 internal/cmd/beta/sfs/export-policy/create/create_test.go create mode 100644 internal/cmd/beta/sfs/export-policy/delete/delete.go create mode 100644 internal/cmd/beta/sfs/export-policy/delete/delete_test.go create mode 100644 internal/cmd/beta/sfs/export-policy/describe/describe.go create mode 100644 internal/cmd/beta/sfs/export-policy/describe/describe_test.go create mode 100644 internal/cmd/beta/sfs/export-policy/export-policy.go create mode 100644 internal/cmd/beta/sfs/export-policy/list/list.go create mode 100644 internal/cmd/beta/sfs/export-policy/list/list_test.go create mode 100644 internal/cmd/beta/sfs/export-policy/test-files/rules-example.json create mode 100644 internal/cmd/beta/sfs/export-policy/update/update.go create mode 100644 internal/cmd/beta/sfs/export-policy/update/update_test.go create mode 100644 internal/cmd/beta/sfs/performance-class/list/list.go create mode 100644 internal/cmd/beta/sfs/performance-class/list/list_test.go create mode 100644 internal/cmd/beta/sfs/performance-class/performance_class.go create mode 100644 internal/cmd/beta/sfs/resource-pool/create/create.go create mode 100644 internal/cmd/beta/sfs/resource-pool/create/create_test.go create mode 100644 internal/cmd/beta/sfs/resource-pool/delete/delete.go create mode 100644 internal/cmd/beta/sfs/resource-pool/delete/delete_test.go create mode 100644 internal/cmd/beta/sfs/resource-pool/describe/describe.go create mode 100644 internal/cmd/beta/sfs/resource-pool/describe/describe_test.go create mode 100644 internal/cmd/beta/sfs/resource-pool/list/list.go create mode 100644 internal/cmd/beta/sfs/resource-pool/list/list_test.go create mode 100644 internal/cmd/beta/sfs/resource-pool/resource_pool.go create mode 100644 internal/cmd/beta/sfs/resource-pool/update/update.go create mode 100644 internal/cmd/beta/sfs/resource-pool/update/update_test.go create mode 100644 internal/cmd/beta/sfs/sfs.go create mode 100644 internal/cmd/beta/sfs/share/create/create.go create mode 100644 internal/cmd/beta/sfs/share/create/create_test.go create mode 100644 internal/cmd/beta/sfs/share/delete/delete.go create mode 100644 internal/cmd/beta/sfs/share/delete/delete_test.go create mode 100644 internal/cmd/beta/sfs/share/describe/describe.go create mode 100644 internal/cmd/beta/sfs/share/describe/describe_test.go create mode 100644 internal/cmd/beta/sfs/share/list/list.go create mode 100644 internal/cmd/beta/sfs/share/list/list_test.go create mode 100644 internal/cmd/beta/sfs/share/share.go create mode 100644 internal/cmd/beta/sfs/share/update/update.go create mode 100644 internal/cmd/beta/sfs/share/update/update_test.go create mode 100644 internal/cmd/beta/sfs/snapshot/create/create.go create mode 100644 internal/cmd/beta/sfs/snapshot/create/create_test.go create mode 100644 internal/cmd/beta/sfs/snapshot/delete/delete.go create mode 100644 internal/cmd/beta/sfs/snapshot/delete/delete_test.go create mode 100644 internal/cmd/beta/sfs/snapshot/describe/describe.go create mode 100644 internal/cmd/beta/sfs/snapshot/describe/describe_test.go create mode 100644 internal/cmd/beta/sfs/snapshot/list/list.go create mode 100644 internal/cmd/beta/sfs/snapshot/list/list_test.go create mode 100644 internal/cmd/beta/sfs/snapshot/snapshot.go create mode 100644 internal/pkg/services/sfs/client/client.go create mode 100644 internal/pkg/services/sfs/utils/utils.go create mode 100644 internal/pkg/services/sfs/utils/utils_test.go create mode 100644 internal/pkg/testutils/options.go diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index c099db5b3..fab1825e5 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -44,5 +44,6 @@ stackit beta [flags] * [stackit beta alb](./stackit_beta_alb.md) - Manages application loadbalancers * [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS +* [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) * [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex diff --git a/docs/stackit_beta_sfs.md b/docs/stackit_beta_sfs.md new file mode 100644 index 000000000..7067bb52b --- /dev/null +++ b/docs/stackit_beta_sfs.md @@ -0,0 +1,38 @@ +## stackit beta sfs + +Provides functionality for SFS (stackit file storage) + +### Synopsis + +Provides functionality for SFS (stackit file storage). + +``` +stackit beta sfs [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta sfs export-policy](./stackit_beta_sfs_export-policy.md) - Provides functionality for SFS export policies +* [stackit beta sfs performance-class](./stackit_beta_sfs_performance-class.md) - Provides functionality for SFS performance classes +* [stackit beta sfs resource-pool](./stackit_beta_sfs_resource-pool.md) - Provides functionality for SFS resource pools +* [stackit beta sfs share](./stackit_beta_sfs_share.md) - Provides functionality for SFS shares +* [stackit beta sfs snapshot](./stackit_beta_sfs_snapshot.md) - Provides functionality for SFS snapshots + diff --git a/docs/stackit_beta_sfs_export-policy.md b/docs/stackit_beta_sfs_export-policy.md new file mode 100644 index 000000000..eaad44e74 --- /dev/null +++ b/docs/stackit_beta_sfs_export-policy.md @@ -0,0 +1,38 @@ +## stackit beta sfs export-policy + +Provides functionality for SFS export policies + +### Synopsis + +Provides functionality for SFS export policies. + +``` +stackit beta sfs export-policy [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs export-policy" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) +* [stackit beta sfs export-policy create](./stackit_beta_sfs_export-policy_create.md) - Creates a export policy +* [stackit beta sfs export-policy delete](./stackit_beta_sfs_export-policy_delete.md) - Deletes a export policy +* [stackit beta sfs export-policy describe](./stackit_beta_sfs_export-policy_describe.md) - Shows details of a export policy +* [stackit beta sfs export-policy list](./stackit_beta_sfs_export-policy_list.md) - Lists all export policies of a project +* [stackit beta sfs export-policy update](./stackit_beta_sfs_export-policy_update.md) - Updates a export policy + diff --git a/docs/stackit_beta_sfs_export-policy_create.md b/docs/stackit_beta_sfs_export-policy_create.md new file mode 100644 index 000000000..87198e9c4 --- /dev/null +++ b/docs/stackit_beta_sfs_export-policy_create.md @@ -0,0 +1,45 @@ +## stackit beta sfs export-policy create + +Creates a export policy + +### Synopsis + +Creates a export policy. + +``` +stackit beta sfs export-policy create [flags] +``` + +### Examples + +``` + Create a new export policy with name "EXPORT_POLICY_NAME" + $ stackit beta sfs export-policy create --name EXPORT_POLICY_NAME + + Create a new export policy with name "EXPORT_POLICY_NAME" and rules from file "./rules.json" + $ stackit beta sfs export-policy create --name EXPORT_POLICY_NAME --rules @./rules.json +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs export-policy create" + --name string Export policy name + --rules string Rules of the export policy (format: json) +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs export-policy](./stackit_beta_sfs_export-policy.md) - Provides functionality for SFS export policies + diff --git a/docs/stackit_beta_sfs_export-policy_delete.md b/docs/stackit_beta_sfs_export-policy_delete.md new file mode 100644 index 000000000..af95dfa5f --- /dev/null +++ b/docs/stackit_beta_sfs_export-policy_delete.md @@ -0,0 +1,40 @@ +## stackit beta sfs export-policy delete + +Deletes a export policy + +### Synopsis + +Deletes a export policy. + +``` +stackit beta sfs export-policy delete EXPORT_POLICY_ID [flags] +``` + +### Examples + +``` + Delete a export policy with ID "xxx" + $ stackit beta sfs export-policy delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs export-policy delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs export-policy](./stackit_beta_sfs_export-policy.md) - Provides functionality for SFS export policies + diff --git a/docs/stackit_beta_sfs_export-policy_describe.md b/docs/stackit_beta_sfs_export-policy_describe.md new file mode 100644 index 000000000..79b314f38 --- /dev/null +++ b/docs/stackit_beta_sfs_export-policy_describe.md @@ -0,0 +1,40 @@ +## stackit beta sfs export-policy describe + +Shows details of a export policy + +### Synopsis + +Shows details of a export policy. + +``` +stackit beta sfs export-policy describe EXPORT_POLICY_ID [flags] +``` + +### Examples + +``` + Describe a export policy with ID "xxx" + $ stackit beta sfs export-policy describe xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs export-policy describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs export-policy](./stackit_beta_sfs_export-policy.md) - Provides functionality for SFS export policies + diff --git a/docs/stackit_beta_sfs_export-policy_list.md b/docs/stackit_beta_sfs_export-policy_list.md new file mode 100644 index 000000000..0611395c7 --- /dev/null +++ b/docs/stackit_beta_sfs_export-policy_list.md @@ -0,0 +1,44 @@ +## stackit beta sfs export-policy list + +Lists all export policies of a project + +### Synopsis + +Lists all export policies of a project. + +``` +stackit beta sfs export-policy list [flags] +``` + +### Examples + +``` + List all export policies + $ stackit beta sfs export-policy list + + List up to 10 export policies + $ stackit beta sfs export-policy list --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs export-policy list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs export-policy](./stackit_beta_sfs_export-policy.md) - Provides functionality for SFS export policies + diff --git a/docs/stackit_beta_sfs_export-policy_update.md b/docs/stackit_beta_sfs_export-policy_update.md new file mode 100644 index 000000000..99bdec9d7 --- /dev/null +++ b/docs/stackit_beta_sfs_export-policy_update.md @@ -0,0 +1,45 @@ +## stackit beta sfs export-policy update + +Updates a export policy + +### Synopsis + +Updates a export policy. + +``` +stackit beta sfs export-policy update EXPORT_POLICY_ID [flags] +``` + +### Examples + +``` + Update a export policy with ID "xxx" and with rules from file "./rules.json" + $ stackit beta sfs export-policy update xxx --rules @./rules.json + + Update a export policy with ID "xxx" and remove the rules + $ stackit beta sfs export-policy update XXX --remove-rules +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs export-policy update" + --remove-rules Remove the export policy rules + --rules string Rules of the export policy +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs export-policy](./stackit_beta_sfs_export-policy.md) - Provides functionality for SFS export policies + diff --git a/docs/stackit_beta_sfs_performance-class.md b/docs/stackit_beta_sfs_performance-class.md new file mode 100644 index 000000000..31b10d31c --- /dev/null +++ b/docs/stackit_beta_sfs_performance-class.md @@ -0,0 +1,34 @@ +## stackit beta sfs performance-class + +Provides functionality for SFS performance classes + +### Synopsis + +Provides functionality for SFS performance classes. + +``` +stackit beta sfs performance-class [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs performance-class" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) +* [stackit beta sfs performance-class list](./stackit_beta_sfs_performance-class_list.md) - Lists all performances classes available + diff --git a/docs/stackit_beta_sfs_performance-class_list.md b/docs/stackit_beta_sfs_performance-class_list.md new file mode 100644 index 000000000..14c264a8a --- /dev/null +++ b/docs/stackit_beta_sfs_performance-class_list.md @@ -0,0 +1,40 @@ +## stackit beta sfs performance-class list + +Lists all performances classes available + +### Synopsis + +Lists all performances classes available. + +``` +stackit beta sfs performance-class list [flags] +``` + +### Examples + +``` + List all performances classes + $ stackit beta sfs performance-class list +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs performance-class list" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs performance-class](./stackit_beta_sfs_performance-class.md) - Provides functionality for SFS performance classes + diff --git a/docs/stackit_beta_sfs_resource-pool.md b/docs/stackit_beta_sfs_resource-pool.md new file mode 100644 index 000000000..d719f18e2 --- /dev/null +++ b/docs/stackit_beta_sfs_resource-pool.md @@ -0,0 +1,38 @@ +## stackit beta sfs resource-pool + +Provides functionality for SFS resource pools + +### Synopsis + +Provides functionality for SFS resource pools. + +``` +stackit beta sfs resource-pool [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs resource-pool" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) +* [stackit beta sfs resource-pool create](./stackit_beta_sfs_resource-pool_create.md) - Creates a SFS resource pool +* [stackit beta sfs resource-pool delete](./stackit_beta_sfs_resource-pool_delete.md) - Deletes a SFS resource pool +* [stackit beta sfs resource-pool describe](./stackit_beta_sfs_resource-pool_describe.md) - Shows details of a SFS resource pool +* [stackit beta sfs resource-pool list](./stackit_beta_sfs_resource-pool_list.md) - Lists all SFS resource pools +* [stackit beta sfs resource-pool update](./stackit_beta_sfs_resource-pool_update.md) - Updates a SFS resource pool + diff --git a/docs/stackit_beta_sfs_resource-pool_create.md b/docs/stackit_beta_sfs_resource-pool_create.md new file mode 100644 index 000000000..334864945 --- /dev/null +++ b/docs/stackit_beta_sfs_resource-pool_create.md @@ -0,0 +1,58 @@ +## stackit beta sfs resource-pool create + +Creates a SFS resource pool + +### Synopsis + +Creates a SFS resource pool. + +The available performance class values can be obtained by running: + $ stackit beta sfs performance-class list + +``` +stackit beta sfs resource-pool create [flags] +``` + +### Examples + +``` + Create a SFS resource pool + $ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl 10.88.135.144/28 --performance-class Standard --size 500 --name resource-pool-01 + + Create a SFS resource pool, allow only a single IP which can mount the resource pool + $ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl 250.81.87.224/32 --performance-class Standard --size 500 --name resource-pool-01 + + Create a SFS resource pool, allow multiple IP ACL which can mount the resource pool + $ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl "10.88.135.144/28,250.81.87.224/32" --performance-class Standard --size 500 --name resource-pool-01 + + Create a SFS resource pool with visible snapshots + $ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl 10.88.135.144/28 --performance-class Standard --size 500 --name resource-pool-01 --snapshots-visible +``` + +### Options + +``` + --availability-zone string Availability zone + -h, --help Help for "stackit beta sfs resource-pool create" + --ip-acl strings List of network addresses in the form
, e.g. 192.168.10.0/24 that can mount the resource pool readonly (default []) + --name string Name + --performance-class string Performance class + --size int Size of the pool in Gigabytes + --snapshots-visible Set snapshots visible and accessible to users +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs resource-pool](./stackit_beta_sfs_resource-pool.md) - Provides functionality for SFS resource pools + diff --git a/docs/stackit_beta_sfs_resource-pool_delete.md b/docs/stackit_beta_sfs_resource-pool_delete.md new file mode 100644 index 000000000..97c52a8ae --- /dev/null +++ b/docs/stackit_beta_sfs_resource-pool_delete.md @@ -0,0 +1,40 @@ +## stackit beta sfs resource-pool delete + +Deletes a SFS resource pool + +### Synopsis + +Deletes a SFS resource pool. + +``` +stackit beta sfs resource-pool delete [flags] +``` + +### Examples + +``` + Delete the SFS resource pool with ID "xxx" + $ stackit beta sfs resource-pool delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs resource-pool delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs resource-pool](./stackit_beta_sfs_resource-pool.md) - Provides functionality for SFS resource pools + diff --git a/docs/stackit_beta_sfs_resource-pool_describe.md b/docs/stackit_beta_sfs_resource-pool_describe.md new file mode 100644 index 000000000..9b04e42bb --- /dev/null +++ b/docs/stackit_beta_sfs_resource-pool_describe.md @@ -0,0 +1,40 @@ +## stackit beta sfs resource-pool describe + +Shows details of a SFS resource pool + +### Synopsis + +Shows details of a SFS resource pool. + +``` +stackit beta sfs resource-pool describe [flags] +``` + +### Examples + +``` + Describe the SFS resource pool with ID "xxx" + $ stackit beta sfs resource-pool describe xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs resource-pool describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs resource-pool](./stackit_beta_sfs_resource-pool.md) - Provides functionality for SFS resource pools + diff --git a/docs/stackit_beta_sfs_resource-pool_list.md b/docs/stackit_beta_sfs_resource-pool_list.md new file mode 100644 index 000000000..103d9cc47 --- /dev/null +++ b/docs/stackit_beta_sfs_resource-pool_list.md @@ -0,0 +1,47 @@ +## stackit beta sfs resource-pool list + +Lists all SFS resource pools + +### Synopsis + +Lists all SFS resource pools. + +``` +stackit beta sfs resource-pool list [flags] +``` + +### Examples + +``` + List all SFS resource pools + $ stackit beta sfs resource-pool list + + List all SFS resource pools for another region than the default one + $ stackit beta sfs resource-pool list --region eu01 + + List up to 10 SFS resource pools + $ stackit beta sfs resource-pool list --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs resource-pool list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs resource-pool](./stackit_beta_sfs_resource-pool.md) - Provides functionality for SFS resource pools + diff --git a/docs/stackit_beta_sfs_resource-pool_update.md b/docs/stackit_beta_sfs_resource-pool_update.md new file mode 100644 index 000000000..fbdc85e99 --- /dev/null +++ b/docs/stackit_beta_sfs_resource-pool_update.md @@ -0,0 +1,56 @@ +## stackit beta sfs resource-pool update + +Updates a SFS resource pool + +### Synopsis + +Updates a SFS resource pool. + +The available performance class values can be obtained by running: + $ stackit beta sfs performance-class list + +``` +stackit beta sfs resource-pool update [flags] +``` + +### Examples + +``` + Update the SFS resource pool with ID "xxx" + $ stackit beta sfs resource-pool update xxx --ip-acl 10.88.135.144/28 --performance-class Standard --size 5 + + Update the SFS resource pool with ID "xxx", allow only a single IP which can mount the resource pool + $ stackit beta sfs resource-pool update xxx --ip-acl 250.81.87.224/32 --performance-class Standard --size 5 + + Update the SFS resource pool with ID "xxx", allow multiple IP ACL which can mount the resource pool + $ stackit beta sfs resource-pool update xxx --ip-acl "10.88.135.144/28,250.81.87.224/32" --performance-class Standard --size 5 + + Update the SFS resource pool with ID "xxx", set snapshots visible to false + $ stackit beta sfs resource-pool update xxx --snapshots-visible=false +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs resource-pool update" + --ip-acl strings List of network addresses in the form
, e.g. 192.168.10.0/24 that can mount the resource pool readonly (default []) + --performance-class string Performance class + --size int Size of the pool in Gigabytes + --snapshots-visible Set snapshots visible and accessible to users +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs resource-pool](./stackit_beta_sfs_resource-pool.md) - Provides functionality for SFS resource pools + diff --git a/docs/stackit_beta_sfs_share.md b/docs/stackit_beta_sfs_share.md new file mode 100644 index 000000000..f7e75203e --- /dev/null +++ b/docs/stackit_beta_sfs_share.md @@ -0,0 +1,38 @@ +## stackit beta sfs share + +Provides functionality for SFS shares + +### Synopsis + +Provides functionality for SFS shares. + +``` +stackit beta sfs share [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs share" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) +* [stackit beta sfs share create](./stackit_beta_sfs_share_create.md) - Creates a share +* [stackit beta sfs share delete](./stackit_beta_sfs_share_delete.md) - Deletes a share +* [stackit beta sfs share describe](./stackit_beta_sfs_share_describe.md) - Shows details of a shares +* [stackit beta sfs share list](./stackit_beta_sfs_share_list.md) - Lists all shares of a resource pool +* [stackit beta sfs share update](./stackit_beta_sfs_share_update.md) - Updates a share + diff --git a/docs/stackit_beta_sfs_share_create.md b/docs/stackit_beta_sfs_share_create.md new file mode 100644 index 000000000..15abc66d8 --- /dev/null +++ b/docs/stackit_beta_sfs_share_create.md @@ -0,0 +1,47 @@ +## stackit beta sfs share create + +Creates a share + +### Synopsis + +Creates a share. + +``` +stackit beta sfs share create [flags] +``` + +### Examples + +``` + Create a share in a resource pool with ID "xxx", name "yyy" and no space hard limit + $ stackit beta sfs share create --resource-pool-id xxx --name yyy --hard-limit 0 + + Create a share in a resource pool with ID "xxx", name "yyy" and export policy with name "zzz" + $ stackit beta sfs share create --resource-pool-id xxx --name yyy --export-policy-name zzz --hard-limit 0 +``` + +### Options + +``` + --export-policy-name string The export policy the share is assigned to + --hard-limit int The space hard limit for the share + -h, --help Help for "stackit beta sfs share create" + --name string Share name + --resource-pool-id string The resource pool the share is assigned to +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs share](./stackit_beta_sfs_share.md) - Provides functionality for SFS shares + diff --git a/docs/stackit_beta_sfs_share_delete.md b/docs/stackit_beta_sfs_share_delete.md new file mode 100644 index 000000000..f669a175e --- /dev/null +++ b/docs/stackit_beta_sfs_share_delete.md @@ -0,0 +1,41 @@ +## stackit beta sfs share delete + +Deletes a share + +### Synopsis + +Deletes a share. + +``` +stackit beta sfs share delete SHARE_ID [flags] +``` + +### Examples + +``` + Delete a share with ID "xxx" from a resource pool with ID "yyy" + $ stackit beta sfs share delete xxx --resource-pool-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs share delete" + --resource-pool-id string The resource pool the share is assigned to +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs share](./stackit_beta_sfs_share.md) - Provides functionality for SFS shares + diff --git a/docs/stackit_beta_sfs_share_describe.md b/docs/stackit_beta_sfs_share_describe.md new file mode 100644 index 000000000..7a881501f --- /dev/null +++ b/docs/stackit_beta_sfs_share_describe.md @@ -0,0 +1,41 @@ +## stackit beta sfs share describe + +Shows details of a shares + +### Synopsis + +Shows details of a shares. + +``` +stackit beta sfs share describe SHARE_ID [flags] +``` + +### Examples + +``` + Describe a shares with ID "xxx" from resource pool with ID "yyy" + $ stackit beta sfs export-policy describe xxx --resource-pool-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs share describe" + --resource-pool-id string The resource pool the share is assigned to +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs share](./stackit_beta_sfs_share.md) - Provides functionality for SFS shares + diff --git a/docs/stackit_beta_sfs_share_list.md b/docs/stackit_beta_sfs_share_list.md new file mode 100644 index 000000000..2b3d73461 --- /dev/null +++ b/docs/stackit_beta_sfs_share_list.md @@ -0,0 +1,45 @@ +## stackit beta sfs share list + +Lists all shares of a resource pool + +### Synopsis + +Lists all shares of a resource pool. + +``` +stackit beta sfs share list [flags] +``` + +### Examples + +``` + List all shares from resource pool with ID "xxx" + $ stackit beta sfs export-policy list --resource-pool-id xxx + + List up to 10 shares from resource pool with ID "xxx" + $ stackit beta sfs export-policy list --resource-pool-id xxx --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs share list" + --limit int Maximum number of entries to list + --resource-pool-id string The resource pool the share is assigned to +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs share](./stackit_beta_sfs_share.md) - Provides functionality for SFS shares + diff --git a/docs/stackit_beta_sfs_share_update.md b/docs/stackit_beta_sfs_share_update.md new file mode 100644 index 000000000..0a0c1f8b8 --- /dev/null +++ b/docs/stackit_beta_sfs_share_update.md @@ -0,0 +1,46 @@ +## stackit beta sfs share update + +Updates a share + +### Synopsis + +Updates a share. + +``` +stackit beta sfs share update SHARE_ID [flags] +``` + +### Examples + +``` + Update share with ID "xxx" with new export-policy-name "yyy" in resource-pool "zzz" + $ stackit beta sfs share update xxx --export-policy-name yyy --resource-pool-id zzz + + Update share with ID "xxx" with new space hard limit "50" in resource-pool "yyy" + $ stackit beta sfs share update xxx --hard-limit 50 --resource-pool-id yyy +``` + +### Options + +``` + --export-policy-name string The export policy the share is assigned to + --hard-limit int The space hard limit for the share + -h, --help Help for "stackit beta sfs share update" + --resource-pool-id string The resource pool the share is assigned to +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs share](./stackit_beta_sfs_share.md) - Provides functionality for SFS shares + diff --git a/docs/stackit_beta_sfs_snapshot.md b/docs/stackit_beta_sfs_snapshot.md new file mode 100644 index 000000000..2c1a31664 --- /dev/null +++ b/docs/stackit_beta_sfs_snapshot.md @@ -0,0 +1,37 @@ +## stackit beta sfs snapshot + +Provides functionality for SFS snapshots + +### Synopsis + +Provides functionality for SFS snapshots. + +``` +stackit beta sfs snapshot [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs snapshot" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) +* [stackit beta sfs snapshot create](./stackit_beta_sfs_snapshot_create.md) - Creates a new snapshot of a resource pool +* [stackit beta sfs snapshot delete](./stackit_beta_sfs_snapshot_delete.md) - Deletes a snapshot +* [stackit beta sfs snapshot describe](./stackit_beta_sfs_snapshot_describe.md) - Shows details of a snapshot +* [stackit beta sfs snapshot list](./stackit_beta_sfs_snapshot_list.md) - Lists all snapshots of a resource pool + diff --git a/docs/stackit_beta_sfs_snapshot_create.md b/docs/stackit_beta_sfs_snapshot_create.md new file mode 100644 index 000000000..ac7a1988b --- /dev/null +++ b/docs/stackit_beta_sfs_snapshot_create.md @@ -0,0 +1,46 @@ +## stackit beta sfs snapshot create + +Creates a new snapshot of a resource pool + +### Synopsis + +Creates a new snapshot of a resource pool. + +``` +stackit beta sfs snapshot create [flags] +``` + +### Examples + +``` + Create a new snapshot with name "snapshot-name" of a resource pool with ID "xxx" + $ stackit beta sfs snapshot create --name snapshot-name --resource-pool-id xxx + + Create a new snapshot with name "snapshot-name" and comment "snapshot-comment" of a resource pool with ID "xxx" + $ stackit beta sfs snapshot create --name snapshot-name --resource-pool-id xxx --comment "snapshot-comment" +``` + +### Options + +``` + --comment string A comment to add more information to the snapshot + -h, --help Help for "stackit beta sfs snapshot create" + --name string Snapshot name + --resource-pool-id string The resource pool from which the snapshot should be created +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs snapshot](./stackit_beta_sfs_snapshot.md) - Provides functionality for SFS snapshots + diff --git a/docs/stackit_beta_sfs_snapshot_delete.md b/docs/stackit_beta_sfs_snapshot_delete.md new file mode 100644 index 000000000..286d98e28 --- /dev/null +++ b/docs/stackit_beta_sfs_snapshot_delete.md @@ -0,0 +1,41 @@ +## stackit beta sfs snapshot delete + +Deletes a snapshot + +### Synopsis + +Deletes a snapshot. + +``` +stackit beta sfs snapshot delete SNAPSHOT_NAME [flags] +``` + +### Examples + +``` + Delete a snapshot with "SNAPSHOT_NAME" from resource pool with ID "yyy" + $ stackit beta sfs snapshot delete SNAPSHOT_NAME --resource-pool-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs snapshot delete" + --resource-pool-id string The resource pool from which the snapshot should be created +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs snapshot](./stackit_beta_sfs_snapshot.md) - Provides functionality for SFS snapshots + diff --git a/docs/stackit_beta_sfs_snapshot_describe.md b/docs/stackit_beta_sfs_snapshot_describe.md new file mode 100644 index 000000000..a12e42dd7 --- /dev/null +++ b/docs/stackit_beta_sfs_snapshot_describe.md @@ -0,0 +1,41 @@ +## stackit beta sfs snapshot describe + +Shows details of a snapshot + +### Synopsis + +Shows details of a snapshot. + +``` +stackit beta sfs snapshot describe SNAPSHOT_NAME [flags] +``` + +### Examples + +``` + Describe a snapshot with "SNAPSHOT_NAME" from resource pool with ID "yyy" + stackit beta sfs snapshot describe SNAPSHOT_NAME --resource-pool-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs snapshot describe" + --resource-pool-id string The resource pool from which the snapshot should be created +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs snapshot](./stackit_beta_sfs_snapshot.md) - Provides functionality for SFS snapshots + diff --git a/docs/stackit_beta_sfs_snapshot_list.md b/docs/stackit_beta_sfs_snapshot_list.md new file mode 100644 index 000000000..4c8b0c986 --- /dev/null +++ b/docs/stackit_beta_sfs_snapshot_list.md @@ -0,0 +1,42 @@ +## stackit beta sfs snapshot list + +Lists all snapshots of a resource pool + +### Synopsis + +Lists all snapshots of a resource pool. + +``` +stackit beta sfs snapshot list [flags] +``` + +### Examples + +``` + List all snapshots of a resource pool with ID "xxx" + $ stackit beta sfs snapshot list --resource-pool-id xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta sfs snapshot list" + --limit int Number of snapshots to list + --resource-pool-id string The resource pool from which the snapshot should be created +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta sfs snapshot](./stackit_beta_sfs_snapshot.md) - Provides functionality for SFS snapshots + diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index 13050384f..b9a4e81a1 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -56,6 +56,7 @@ stackit config set [flags] --service-account-custom-endpoint string Service Account API base URL, used in calls to this API --service-enablement-custom-endpoint string Service Enablement API base URL, used in calls to this API --session-time-limit string Maximum time before authentication is required again. After this time, you will be prompted to login again to execute commands that require authentication. Can't be larger than 24h. Requires authentication after being set to take effect. Examples: 3h, 5h30m40s + --sfs-custom-endpoint string SFS API base URL, used in calls to this API --ske-custom-endpoint string SKE API base URL, used in calls to this API --sqlserverflex-custom-endpoint string SQLServer Flex API base URL, used in calls to this API --token-custom-endpoint string Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication. diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 88b5b3bd8..9e005607b 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -57,6 +57,7 @@ stackit config unset [flags] --service-account-custom-endpoint Service Account API base URL. If unset, uses the default base URL --service-enablement-custom-endpoint Service Enablement API base URL. If unset, uses the default base URL --session-time-limit Maximum time before authentication is required again. If unset, defaults to 12h + --sfs-custom-endpoint SFS API base URL. If unset, uses the default base URL --ske-custom-endpoint SKE API base URL. If unset, uses the default base URL --sqlserverflex-custom-endpoint SQLServer Flex API base URL. If unset, uses the default base URL --token-custom-endpoint Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication. diff --git a/go.mod b/go.mod index 249261c95..79cf8ba04 100644 --- a/go.mod +++ b/go.mod @@ -269,6 +269,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 + github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.39.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index ae0c06e51..d87994781 100644 --- a/go.sum +++ b/go.sum @@ -648,6 +648,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 h1:XV3pPX github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3/go.mod h1:YNJJ1jwBWjEdLH6vECuzoslJY9jQThIvDvTa30J3D0U= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aSfJPMBBcXrG/BZiLLZRvvGJesRdll4bLP7jetuKA= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= +github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 h1:DRp1p0Gb1YZSnFXgkiKTHQD9bFfqn6OC3PcsDjqGJiw= +github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0/go.mod h1:XHOtGgBwwCqPSoQt2ojIRb/BeOd4kICwb9RuMXXFGt8= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 h1:HVlBylGwXVR3qDUGwUMqofAcLEawRaWSgeYXbyAcN1E= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 h1:IUhMJH9fQ+CaMas+5bbnrH7m1Hadf1vWoUtu9KeAEFM= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index de4e2f48f..935791cb9 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -40,6 +41,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(sqlserverflex.NewCmd(params)) + cmd.AddCommand(sfs.NewCmd(params)) cmd.AddCommand(alb.NewCmd(params)) cmd.AddCommand(intake.NewCmd(params)) cmd.AddCommand(kms.NewCmd(params)) diff --git a/internal/cmd/beta/sfs/export-policy/create/create.go b/internal/cmd/beta/sfs/export-policy/create/create.go new file mode 100644 index 000000000..3f3ecf864 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/create/create.go @@ -0,0 +1,151 @@ +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + nameFlag = "name" + rulesFlag = "rules" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Name string + Rules *[]sfs.CreateShareExportPolicyRequestRule +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a export policy", + Long: "Creates a export policy.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a new export policy with name "EXPORT_POLICY_NAME"`, + "$ stackit beta sfs export-policy create --name EXPORT_POLICY_NAME", + ), + examples.NewExample( + `Create a new export policy with name "EXPORT_POLICY_NAME" and rules from file "./rules.json"`, + "$ stackit beta sfs export-policy create --name EXPORT_POLICY_NAME --rules @./rules.json", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create a export policy for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create export policy: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(nameFlag, "", "Export policy name") + cmd.Flags().Var(flags.ReadFromFileFlag(), rulesFlag, "Rules of the export policy (format: json)") + + err := flags.MarkFlagsRequired(cmd, nameFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + rulesString := flags.FlagToStringPointer(p, cmd, rulesFlag) + var rules *[]sfs.CreateShareExportPolicyRequestRule + if rulesString != nil && *rulesString != "" { + var r []sfs.CreateShareExportPolicyRequestRule + err := json.Unmarshal([]byte(*rulesString), &r) + if err != nil { + return nil, fmt.Errorf("could not parse rules: %w", err) + } + rules = &r + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Name: flags.FlagToStringValue(p, cmd, nameFlag), + Rules: rules, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiCreateShareExportPolicyRequest { + req := apiClient.CreateShareExportPolicy(ctx, model.ProjectId, model.Region) + req = req.CreateShareExportPolicyPayload( + sfs.CreateShareExportPolicyPayload{ + Name: utils.Ptr(model.Name), + Rules: model.Rules, + }, + ) + return req +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, item *sfs.CreateShareExportPolicyResponse) error { + return p.OutputResult(outputFormat, item, func() error { + if item == nil || item.ShareExportPolicy == nil { + return fmt.Errorf("no export policy found") + } + p.Outputf( + "Created export policy %q for project %q.\nExport policy ID: %s\n", + utils.PtrString(item.ShareExportPolicy.Name), + projectLabel, + utils.PtrString(item.ShareExportPolicy.Id), + ) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/export-policy/create/create_test.go b/internal/cmd/beta/sfs/export-policy/create/create_test.go new file mode 100644 index 000000000..f94074b1a --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/create/create_test.go @@ -0,0 +1,212 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" +var testName = "test-name" +var testRulesString = "[]" +var testRules = &[]sfs.CreateShareExportPolicyRequestRule{} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + nameFlag: testName, + rulesFlag: testRulesString, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Name: testName, + Rules: testRules, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiCreateShareExportPolicyRequest)) sfs.ApiCreateShareExportPolicyRequest { + request := testClient.CreateShareExportPolicy(testCtx, testProjectId, testRegion) + request = request.CreateShareExportPolicyPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *sfs.CreateShareExportPolicyPayload)) sfs.CreateShareExportPolicyPayload { + payload := sfs.CreateShareExportPolicyPayload{ + Name: utils.Ptr(testName), + Rules: testRules, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "required only", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, rulesFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Rules = nil + }), + }, + { + description: "required read rules from file", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[rulesFlag] = "@../test-files/rules-example.json" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Rules = &[]sfs.CreateShareExportPolicyRequestRule{ + { + Description: sfs.NewNullableString( + utils.Ptr("first rule"), + ), + IpAcl: utils.Ptr([]string{"192.168.2.0/24"}), + Order: utils.Ptr(int64(1)), + SetUuid: utils.Ptr(true), + SuperUser: utils.Ptr(false), + }, + { + IpAcl: utils.Ptr([]string{"192.168.2.0/24", "127.0.0.1/32"}), + Order: utils.Ptr(int64(2)), + ReadOnly: utils.Ptr(true), + }, + } + }), + }, + } + opts := []testutils.TestingOption{ + testutils.WithCmpOptions(cmp.AllowUnexported(sfs.NullableString{})), + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInputWithOptions(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, nil, tt.isValid, opts) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiCreateShareExportPolicyRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + exportPolicy *sfs.CreateShareExportPolicyResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "set empty export policy", + args: args{ + exportPolicy: &sfs.CreateShareExportPolicyResponse{}, + }, + wantErr: true, + }, + { + name: "set empty export policy", + args: args{ + exportPolicy: &sfs.CreateShareExportPolicyResponse{ + ShareExportPolicy: &sfs.CreateShareExportPolicyResponseShareExportPolicy{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.exportPolicy); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/export-policy/delete/delete.go b/internal/cmd/beta/sfs/export-policy/delete/delete.go new file mode 100644 index 000000000..b93807b5c --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/delete/delete.go @@ -0,0 +1,100 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const exportPolicyIdArg = "EXPORT_POLICY_ID" + +type inputModel struct { + *globalflags.GlobalFlagModel + ExportPolicyId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", exportPolicyIdArg), + Short: "Deletes a export policy", + Long: "Deletes a export policy.", + Args: args.SingleArg(exportPolicyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a export policy with ID "xxx"`, + "$ stackit beta sfs export-policy delete xxx", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + exportPolicyLabel, err := sfsUtils.GetExportPolicyName(ctx, apiClient, model.ProjectId, model.Region, model.ExportPolicyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get export policy name: %v", err) + exportPolicyLabel = model.ExportPolicyId + } else if exportPolicyLabel == "" { + exportPolicyLabel = model.ExportPolicyId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete export policy %q? (This cannot be undone)", exportPolicyLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("delete export policy: %w", err) + } + + params.Printer.Outputf("Deleted export policy %q\n", exportPolicyLabel) + return nil + }, + } + return cmd +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiDeleteShareExportPolicyRequest { + return apiClient.DeleteShareExportPolicy(ctx, model.ProjectId, model.Region, model.ExportPolicyId) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + exportPolicyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ExportPolicyId: exportPolicyId, + } + + p.DebugInputModel(model) + return &model, nil +} diff --git a/internal/cmd/beta/sfs/export-policy/delete/delete_test.go b/internal/cmd/beta/sfs/export-policy/delete/delete_test.go new file mode 100644 index 000000000..c38c47ae6 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/delete/delete_test.go @@ -0,0 +1,174 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" +var testExportPolicyId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testExportPolicyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ExportPolicyId: testExportPolicyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiDeleteShareExportPolicyRequest)) sfs.ApiDeleteShareExportPolicyRequest { + request := testClient.DeleteShareExportPolicy(testCtx, testProjectId, testRegion, testExportPolicyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "export policy id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "export policy id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiDeleteShareExportPolicyRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/export-policy/describe/describe.go b/internal/cmd/beta/sfs/export-policy/describe/describe.go new file mode 100644 index 000000000..a9bc7b9b3 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/describe/describe.go @@ -0,0 +1,151 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const exportPolicyIdArg = "EXPORT_POLICY_ID" + +type inputModel struct { + *globalflags.GlobalFlagModel + ExportPolicyId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", exportPolicyIdArg), + Short: "Shows details of a export policy", + Long: "Shows details of a export policy.", + Args: args.SingleArg(exportPolicyIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a export policy with ID "xxx"`, + "$ stackit beta sfs export-policy describe xxx", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("read export policy: %w", err) + } + + // Get projectLabel + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + return outputResult(params.Printer, model.OutputFormat, model.ExportPolicyId, projectLabel, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + exportPolicyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ExportPolicyId: exportPolicyId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiGetShareExportPolicyRequest { + return apiClient.GetShareExportPolicy(ctx, model.ProjectId, model.Region, model.ExportPolicyId) +} + +func outputResult(p *print.Printer, outputFormat, exportPolicyId, projectLabel string, exportPolicy *sfs.GetShareExportPolicyResponse) error { + return p.OutputResult(outputFormat, exportPolicy, func() error { + if exportPolicy == nil || exportPolicy.ShareExportPolicy == nil { + p.Outputf("Export policy %q not found in project %q", exportPolicyId, projectLabel) + return nil + } + + var content []tables.Table + + table := tables.NewTable() + table.SetTitle("Export Policy") + policy := exportPolicy.ShareExportPolicy + + table.AddRow("ID", utils.PtrString(policy.Id)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(policy.Name)) + table.AddSeparator() + table.AddRow("SHARES USING EXPORT POLICY", utils.PtrString(policy.SharesUsingExportPolicy)) + table.AddSeparator() + table.AddRow("CREATED AT", utils.ConvertTimePToDateTimeString(policy.CreatedAt)) + + content = append(content, table) + + if policy.Rules != nil && len(*policy.Rules) > 0 { + rulesTable := tables.NewTable() + rulesTable.SetTitle("Rules") + + rulesTable.SetHeader("ID", "ORDER", "DESCRIPTION", "IP ACL", "READ ONLY", "SET UUID", "SUPER USER", "CREATED AT") + + for _, rule := range *policy.Rules { + var description string + if rule.Description != nil { + description = utils.PtrString(rule.Description.Get()) + } + rulesTable.AddRow( + utils.PtrString(rule.Id), + utils.PtrString(rule.Order), + description, + utils.JoinStringPtr(rule.IpAcl, ", "), + utils.PtrString(rule.ReadOnly), + utils.PtrString(rule.SetUuid), + utils.PtrString(rule.SuperUser), + utils.ConvertTimePToDateTimeString(rule.CreatedAt), + ) + rulesTable.AddSeparator() + } + + content = append(content, rulesTable) + } + + if err := tables.DisplayTables(p, content); err != nil { + return fmt.Errorf("render tables: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/sfs/export-policy/describe/describe_test.go b/internal/cmd/beta/sfs/export-policy/describe/describe_test.go new file mode 100644 index 000000000..73e711879 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/describe/describe_test.go @@ -0,0 +1,221 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" +var testExportPolicyId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testExportPolicyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ExportPolicyId: testExportPolicyId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiGetShareExportPolicyRequest)) sfs.ApiGetShareExportPolicyRequest { + request := testClient.GetShareExportPolicy(testCtx, testProjectId, testRegion, testExportPolicyId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "export policy id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "export policy id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiGetShareExportPolicyRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + exportPolicyId string + projectLabel string + exportPolicy *sfs.GetShareExportPolicyResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty export policy", + args: args{ + exportPolicy: &sfs.GetShareExportPolicyResponse{}, + }, + wantErr: false, + }, + { + name: "set empty export policy", + args: args{ + exportPolicy: &sfs.GetShareExportPolicyResponse{ + ShareExportPolicy: &sfs.GetShareExportPolicyResponseShareExportPolicy{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.exportPolicyId, tt.args.projectLabel, tt.args.exportPolicy); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/export-policy/export-policy.go b/internal/cmd/beta/sfs/export-policy/export-policy.go new file mode 100644 index 000000000..221b4f1f3 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/export-policy.go @@ -0,0 +1,33 @@ +package exportpolicy + +import ( + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/export-policy/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/export-policy/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/export-policy/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/export-policy/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/export-policy/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "export-policy", + Short: "Provides functionality for SFS export policies", + Long: "Provides functionality for SFS export policies.", + Args: cobra.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) +} diff --git a/internal/cmd/beta/sfs/export-policy/list/list.go b/internal/cmd/beta/sfs/export-policy/list/list.go new file mode 100644 index 000000000..7620dfc33 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/list/list.go @@ -0,0 +1,147 @@ +package list + +import ( + "context" + "fmt" + "strconv" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + limitFlag = "limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all export policies of a project", + Long: "Lists all export policies of a project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all export policies`, + "$ stackit beta sfs export-policy list", + ), + examples.NewExample( + `List up to 10 export policies`, + "$ stackit beta sfs export-policy list --limit 10", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list export policies: %w", err) + } + + // Get projectLabel + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + // Truncate output + items := utils.GetSliceFromPointer(resp.ShareExportPolicies) + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, items) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiListShareExportPoliciesRequest { + return apiClient.ListShareExportPolicies(ctx, model.ProjectId, model.Region) +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, exportPolicies []sfs.ShareExportPolicy) error { + return p.OutputResult(outputFormat, exportPolicies, func() error { + if len(exportPolicies) == 0 { + p.Outputf("No export policies found for project %q\n", projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "AMOUNT RULES", "SHARES USING THIS EXPORT POLICY", "CREATED AT") + + for _, exportPolicy := range exportPolicies { + amountRules := "-" + if exportPolicy.Rules != nil { + amountRules = strconv.Itoa(len(*exportPolicy.Rules)) + } + table.AddRow( + utils.PtrString(exportPolicy.Id), + utils.PtrString(exportPolicy.Name), + amountRules, + utils.PtrString(exportPolicy.SharesUsingExportPolicy), + utils.ConvertTimePToDateTimeString(exportPolicy.CreatedAt), + ) + } + p.Outputln(table.Render()) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/export-policy/list/list_test.go b/internal/cmd/beta/sfs/export-policy/list/list_test.go new file mode 100644 index 000000000..e2a73ace0 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/list/list_test.go @@ -0,0 +1,176 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + limitFlag: strconv.Itoa(10), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Limit: utils.Ptr(int64(10)), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiListShareExportPoliciesRequest)) sfs.ApiListShareExportPoliciesRequest { + request := testClient.ListShareExportPolicies(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiListShareExportPoliciesRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + exportPolicies []sfs.ShareExportPolicy + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty export policy", + args: args{ + exportPolicies: []sfs.ShareExportPolicy{ + {}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.exportPolicies); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/export-policy/test-files/rules-example.json b/internal/cmd/beta/sfs/export-policy/test-files/rules-example.json new file mode 100644 index 000000000..57b2cbcb1 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/test-files/rules-example.json @@ -0,0 +1,14 @@ +[ + { + "description": "first rule", + "ipAcl": ["192.168.2.0/24"], + "order": 1, + "superUser": false, + "setUuid": true + }, + { + "ipAcl": ["192.168.2.0/24", "127.0.0.1/32"], + "order": 2, + "readonly": true + } +] \ No newline at end of file diff --git a/internal/cmd/beta/sfs/export-policy/update/update.go b/internal/cmd/beta/sfs/export-policy/update/update.go new file mode 100644 index 000000000..cbe394459 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/update/update.go @@ -0,0 +1,172 @@ +package update + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + exportPolicyArg = "EXPORT_POLICY_ID" + + rulesFlag = "rules" + removeRulesFlag = "remove-rules" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ExportPolicyId string + Rules *[]sfs.UpdateShareExportPolicyBodyRule +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", exportPolicyArg), + Short: "Updates a export policy", + Long: "Updates a export policy.", + Args: args.SingleArg(exportPolicyArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update a export policy with ID "xxx" and with rules from file "./rules.json"`, + "$ stackit beta sfs export-policy update xxx --rules @./rules.json", + ), + examples.NewExample( + `Update a export policy with ID "xxx" and remove the rules`, + "$ stackit beta sfs export-policy update XXX --remove-rules", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + exportPolicyLabel, err := sfsUtils.GetExportPolicyName(ctx, apiClient, model.ProjectId, model.Region, model.ExportPolicyId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get export policy name: %v", err) + exportPolicyLabel = model.ExportPolicyId + } else if exportPolicyLabel == "" { + exportPolicyLabel = model.ExportPolicyId + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update export policy %q for project %q?", exportPolicyLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update export policy: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, exportPolicyLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.ReadFromFileFlag(), rulesFlag, "Rules of the export policy") + cmd.Flags().Bool(removeRulesFlag, false, "Remove the export policy rules") + + rulesFlags := []string{rulesFlag, removeRulesFlag} + cmd.MarkFlagsMutuallyExclusive(rulesFlags...) + cmd.MarkFlagsOneRequired(rulesFlags...) // Because the update endpoint supports only rules at the moment, one of the flags must be required +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiUpdateShareExportPolicyRequest { + req := apiClient.UpdateShareExportPolicy(ctx, model.ProjectId, model.Region, model.ExportPolicyId) + + payload := sfs.UpdateShareExportPolicyPayload{ + Rules: model.Rules, + } + return req.UpdateShareExportPolicyPayload(payload) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + exportPolicyId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + var rules *[]sfs.UpdateShareExportPolicyBodyRule + noRulesErr := fmt.Errorf("no rules specified") + if rulesString := flags.FlagToStringPointer(p, cmd, rulesFlag); rulesString != nil { + var r []sfs.UpdateShareExportPolicyBodyRule + err := json.Unmarshal([]byte(*rulesString), &r) + if err != nil { + return nil, fmt.Errorf("could not parse rules: %w", err) + } + if r == nil { + return nil, noRulesErr + } + rules = &r + } + + if removeRules := flags.FlagToBoolPointer(p, cmd, removeRulesFlag); removeRules != nil { + // Create an empty slice for the patch request + rules = &[]sfs.UpdateShareExportPolicyBodyRule{} + } + + // Because the update endpoint supports only rules at the moment, this should not be empty + if rules == nil { + return nil, noRulesErr + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ExportPolicyId: exportPolicyId, + Rules: rules, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, projectLabel, exportPolicyLabel string, resp *sfs.UpdateShareExportPolicyResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil { + p.Outputln("Empty export policy response") + return nil + } + p.Outputf("Updated export policy %q for project %q\n", exportPolicyLabel, projectLabel) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/export-policy/update/update_test.go b/internal/cmd/beta/sfs/export-policy/update/update_test.go new file mode 100644 index 000000000..0ca322850 --- /dev/null +++ b/internal/cmd/beta/sfs/export-policy/update/update_test.go @@ -0,0 +1,251 @@ +package update + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() + +const ( + testRegion = "eu01" + testRulesString = `[ + { + "ipAcl": ["172.16.0.0/24"], + "readOnly": true, + "order": 1 + } +]` +) + +var testRules = &[]sfs.UpdateShareExportPolicyBodyRule{ + { + IpAcl: utils.Ptr([]string{"172.16.0.0/24"}), + ReadOnly: utils.Ptr(true), + Order: utils.Ptr(int64(1)), + }, +} +var testExportPolicyId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + rulesFlag: testRulesString, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testExportPolicyId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ExportPolicyId: testExportPolicyId, + Rules: testRules, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiUpdateShareExportPolicyRequest)) sfs.ApiUpdateShareExportPolicyRequest { + request := testClient.UpdateShareExportPolicy(testCtx, testProjectId, testRegion, testExportPolicyId) + request = request.UpdateShareExportPolicyPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *sfs.UpdateShareExportPolicyPayload)) sfs.UpdateShareExportPolicyPayload { + payload := sfs.UpdateShareExportPolicyPayload{ + Rules: testRules, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no rules specified", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, rulesFlag) + }), + isValid: false, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Rules = nil + }), + }, + { + description: "conflict rules and remove rules", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[rulesFlag] = testRulesString + flagValues[removeRulesFlag] = "true" + }), + isValid: false, + }, + { + description: "--remove-rules flag set", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[removeRulesFlag] = "true" + delete(flagValues, rulesFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Rules = &[]sfs.UpdateShareExportPolicyBodyRule{} + }), + }, + { + description: "required read rules from file", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[rulesFlag] = "@../test-files/rules-example.json" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Rules = &[]sfs.UpdateShareExportPolicyBodyRule{ + { + Description: sfs.NewNullableString( + utils.Ptr("first rule"), + ), + IpAcl: utils.Ptr([]string{"192.168.2.0/24"}), + Order: utils.Ptr(int64(1)), + SetUuid: utils.Ptr(true), + SuperUser: utils.Ptr(false), + }, + { + IpAcl: utils.Ptr([]string{"192.168.2.0/24", "127.0.0.1/32"}), + Order: utils.Ptr(int64(2)), + ReadOnly: utils.Ptr(true), + }, + } + }), + }, + } + opts := []testutils.TestingOption{ + testutils.WithCmpOptions(cmp.AllowUnexported(sfs.NullableString{})), + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInputWithOptions(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, nil, tt.isValid, opts) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiUpdateShareExportPolicyRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + exportPolicyLabel string + resp *sfs.UpdateShareExportPolicyResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty resp", + args: args{ + resp: &sfs.UpdateShareExportPolicyResponse{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.exportPolicyLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/performance-class/list/list.go b/internal/cmd/beta/sfs/performance-class/list/list.go new file mode 100644 index 000000000..0ca22c392 --- /dev/null +++ b/internal/cmd/beta/sfs/performance-class/list/list.go @@ -0,0 +1,110 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type inputModel struct { + *globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all performances classes available", + Long: "Lists all performances classes available.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all performances classes`, + "$ stackit beta sfs performance-class list", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + resp, err := buildRequest(ctx, apiClient).Execute() + if err != nil { + return fmt.Errorf("list performance-class: %w", err) + } + + // Get projectLabel + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + performanceClasses := utils.GetSliceFromPointer(resp.PerformanceClasses) + + return outputResult(params.Printer, model.OutputFormat, projectLabel, performanceClasses) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *sfs.APIClient) sfs.ApiListPerformanceClassesRequest { + return apiClient.ListPerformanceClasses(ctx) +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, performanceClasses []sfs.PerformanceClass) error { + return p.OutputResult(outputFormat, performanceClasses, func() error { + if len(performanceClasses) == 0 { + p.Outputf("No performance classes found for project %q\n", projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("NAME", "IOPS", "THROUGHPUT") + for _, performanceClass := range performanceClasses { + table.AddRow( + utils.PtrString(performanceClass.Name), + utils.PtrString(performanceClass.Iops), + utils.PtrString(performanceClass.Throughput), + ) + } + p.Outputln(table.Render()) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/performance-class/list/list_test.go b/internal/cmd/beta/sfs/performance-class/list/list_test.go new file mode 100644 index 000000000..655159342 --- /dev/null +++ b/internal/cmd/beta/sfs/performance-class/list/list_test.go @@ -0,0 +1,170 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiListPerformanceClassesRequest)) sfs.ApiListPerformanceClassesRequest { + request := testClient.ListPerformanceClasses(testCtx) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + expectedRequest sfs.ApiListPerformanceClassesRequest + }{ + { + description: "base", + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + performanceClasses []sfs.PerformanceClass + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty performance class", + args: args{ + performanceClasses: []sfs.PerformanceClass{ + {}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.performanceClasses); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/performance-class/performance_class.go b/internal/cmd/beta/sfs/performance-class/performance_class.go new file mode 100644 index 000000000..f033ee5d3 --- /dev/null +++ b/internal/cmd/beta/sfs/performance-class/performance_class.go @@ -0,0 +1,26 @@ +package performanceclass + +import ( + "github.com/spf13/cobra" + + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/performance-class/list" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "performance-class", + Short: "Provides functionality for SFS performance classes", + Long: "Provides functionality for SFS performance classes.", + Args: cobra.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) +} diff --git a/internal/cmd/beta/sfs/resource-pool/create/create.go b/internal/cmd/beta/sfs/resource-pool/create/create.go new file mode 100644 index 000000000..69093d471 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/create/create.go @@ -0,0 +1,184 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" +) + +const ( + performanceClassFlag = "performance-class" + sizeFlag = "size" + ipAclFlag = "ip-acl" + availabilityZoneFlag = "availability-zone" + nameFlag = "name" + snapshotsVisibleFlag = "snapshots-visible" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + SizeInGB int64 + PerformanceClass string + IpAcl []string + Name string + AvailabilityZone string + SnapshotsVisible bool +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a SFS resource pool", + Long: `Creates a SFS resource pool. + +The available performance class values can be obtained by running: + $ stackit beta sfs performance-class list`, + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a SFS resource pool`, + "$ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl 10.88.135.144/28 --performance-class Standard --size 500 --name resource-pool-01"), + examples.NewExample( + `Create a SFS resource pool, allow only a single IP which can mount the resource pool`, + "$ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl 250.81.87.224/32 --performance-class Standard --size 500 --name resource-pool-01"), + examples.NewExample( + `Create a SFS resource pool, allow multiple IP ACL which can mount the resource pool`, + "$ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl \"10.88.135.144/28,250.81.87.224/32\" --performance-class Standard --size 500 --name resource-pool-01"), + examples.NewExample( + `Create a SFS resource pool with visible snapshots`, + "$ stackit beta sfs resource-pool create --availability-zone eu01-m --ip-acl 10.88.135.144/28 --performance-class Standard --size 500 --name resource-pool-01 --snapshots-visible"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create a resource-pool for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + resp, err := buildRequest(ctx, model, apiClient).Execute() + if err != nil { + return fmt.Errorf("create SFS resource pool: %w", err) + } + var resourcePoolId string + if resp != nil && resp.HasResourcePool() && resp.ResourcePool.HasId() { + resourcePoolId = *resp.ResourcePool.Id + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Create resource pool") + _, err = wait.CreateResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resourcePoolId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for resource pool creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(sizeFlag, 0, "Size of the pool in Gigabytes") + cmd.Flags().String(performanceClassFlag, "", "Performance class") + cmd.Flags().Var(flags.CIDRSliceFlag(), ipAclFlag, "List of network addresses in the form
, e.g. 192.168.10.0/24 that can mount the resource pool readonly") + cmd.Flags().String(availabilityZoneFlag, "", "Availability zone") + cmd.Flags().String(nameFlag, "", "Name") + cmd.Flags().Bool(snapshotsVisibleFlag, false, "Set snapshots visible and accessible to users") + + for _, flag := range []string{sizeFlag, performanceClassFlag, ipAclFlag, availabilityZoneFlag, nameFlag} { + err := flags.MarkFlagsRequired(cmd, flag) + cobra.CheckErr(err) + } +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiCreateResourcePoolRequest { + req := apiClient.CreateResourcePool(ctx, model.ProjectId, model.Region) + req = req.CreateResourcePoolPayload(sfs.CreateResourcePoolPayload{ + AvailabilityZone: &model.AvailabilityZone, + IpAcl: &model.IpAcl, + Name: &model.Name, + PerformanceClass: &model.PerformanceClass, + SizeGigabytes: &model.SizeInGB, + SnapshotsAreVisible: &model.SnapshotsVisible, + }) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + performanceClass := flags.FlagToStringValue(p, cmd, performanceClassFlag) + size := flags.FlagWithDefaultToInt64Value(p, cmd, sizeFlag) + availabilityZone := flags.FlagToStringValue(p, cmd, availabilityZoneFlag) + ipAcls := flags.FlagToStringSlicePointer(p, cmd, ipAclFlag) + name := flags.FlagToStringValue(p, cmd, nameFlag) + snapshotsVisible := flags.FlagToBoolValue(p, cmd, snapshotsVisibleFlag) + + model := inputModel{ + GlobalFlagModel: globalFlags, + SizeInGB: size, + IpAcl: *ipAcls, + PerformanceClass: performanceClass, + AvailabilityZone: availabilityZone, + Name: name, + SnapshotsVisible: snapshotsVisible, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, resp *sfs.CreateResourcePoolResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil || resp.ResourcePool == nil { + p.Outputln("Resource pool response is empty") + return nil + } + p.Outputf("Created resource pool for project %q. Resource pool ID: %s\n", projectLabel, utils.PtrString(resp.ResourcePool.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/resource-pool/create/create_test.go b/internal/cmd/beta/sfs/resource-pool/create/create_test.go new file mode 100644 index 000000000..5dd65f643 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/create/create_test.go @@ -0,0 +1,295 @@ +package create + +import ( + "context" + "strconv" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var ( + testProjectId = uuid.NewString() + testRegion = "eu02" + testResourcePoolPerformanceClass = "Standard" + testResourcePoolSizeInGB int64 = 50 + testResourcePoolAvailabilityZone = "eu02-m" + testResourcePoolName = "sfs-resource-pool-01" + testResourcePoolIpAcl = []string{"10.88.135.144/28", "250.81.87.224/32"} + testSnapshotsVisible = true +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + performanceClassFlag: testResourcePoolPerformanceClass, + sizeFlag: strconv.FormatInt(testResourcePoolSizeInGB, 10), + ipAclFlag: strings.Join(testResourcePoolIpAcl, ","), + availabilityZoneFlag: testResourcePoolAvailabilityZone, + nameFlag: testResourcePoolName, + snapshotsVisibleFlag: strconv.FormatBool(testSnapshotsVisible), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + PerformanceClass: testResourcePoolPerformanceClass, + AvailabilityZone: testResourcePoolAvailabilityZone, + Name: testResourcePoolName, + SizeInGB: testResourcePoolSizeInGB, + IpAcl: testResourcePoolIpAcl, + SnapshotsVisible: testSnapshotsVisible, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiCreateResourcePoolRequest)) sfs.ApiCreateResourcePoolRequest { + request := testClient.CreateResourcePool(testCtx, testProjectId, testRegion) + request = request.CreateResourcePoolPayload(sfs.CreateResourcePoolPayload{ + Name: &testResourcePoolName, + PerformanceClass: &testResourcePoolPerformanceClass, + AvailabilityZone: &testResourcePoolAvailabilityZone, + IpAcl: &testResourcePoolIpAcl, + SizeGigabytes: &testResourcePoolSizeInGB, + SnapshotsAreVisible: &testSnapshotsVisible, + }) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + ipAclValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "ip acl missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipAclFlag) + }), + isValid: false, + }, + { + description: "name missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + }), + isValid: false, + }, + { + description: "performance class missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, performanceClassFlag) + }), + isValid: false, + }, + { + description: "size missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, sizeFlag) + }), + isValid: false, + }, + { + description: "availability zone missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, availabilityZoneFlag) + }), + isValid: false, + }, + { + description: "missing snapshot visible - fallback to false", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, snapshotsVisibleFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.SnapshotsVisible = false + }), + isValid: true, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "repeated ip acl flags", + flagValues: fixtureFlagValues(), + ipAclValues: []string{"198.51.100.14/24", "198.51.100.14/32"}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IpAcl = append(model.IpAcl, "198.51.100.14/24", "198.51.100.14/32") + }), + }, + { + description: "repeated ip acl flags with list value", + flagValues: fixtureFlagValues(), + ipAclValues: []string{"198.51.100.14/24,198.51.100.14/32"}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IpAcl = append(model.IpAcl, "198.51.100.14/24", "198.51.100.14/32") + }), + }, + { + description: "invalid ip acl 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipAclFlag] = "foo-bar" + }), + isValid: false, + }, + { + description: "invalid ip acl 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipAclFlag] = "192.168.178.256/32" + }), + isValid: false, + }, + { + description: "invalid ip acl 3", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipAclFlag] = "192.168.178.255/32," + }), + isValid: false, + }, + { + description: "invalid ip acl 4", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[ipAclFlag] = "192.168.178.255/32," + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + ipAclFlag: tt.ipAclValues, + }, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiCreateResourcePoolRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + resp *sfs.CreateResourcePoolResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + resp: &sfs.CreateResourcePoolResponse{}, + }, + wantErr: false, + }, + { + name: "set response", + args: args{ + resp: &sfs.CreateResourcePoolResponse{ + ResourcePool: &sfs.CreateResourcePoolResponseResourcePool{}, + }, + }, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete.go b/internal/cmd/beta/sfs/resource-pool/delete/delete.go new file mode 100644 index 000000000..acd38ae4d --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete.go @@ -0,0 +1,120 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" +) + +const ( + resourcePoolIdArg = "RESOURCE_POOL_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete", + Short: "Deletes a SFS resource pool", + Long: "Deletes a SFS resource pool.", + Args: args.SingleArg(resourcePoolIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete the SFS resource pool with ID "xxx"`, + "$ stackit beta sfs resource-pool delete xxx"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + resourcePoolName, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolName = model.ResourcePoolId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete resource pool %q? (This cannot be undone)", resourcePoolName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + resp, err := buildRequest(ctx, model, apiClient).Execute() + if err != nil { + return fmt.Errorf("delete SFS resource pool: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Delete resource pool") + _, err = wait.DeleteResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for resource pool deletion: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, resourcePoolName, resp) + }, + } + return cmd +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiDeleteResourcePoolRequest { + req := apiClient.DeleteResourcePool(ctx, model.ProjectId, model.Region, model.ResourcePoolId) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + resourcePoolId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ResourcePoolId: resourcePoolId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, resourcePoolName string, response map[string]interface{}) error { + return p.OutputResult(outputFormat, response, func() error { + p.Outputf("Deleted resource pool %q\n", resourcePoolName) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go b/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go new file mode 100644 index 000000000..b41ed2626 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go @@ -0,0 +1,209 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} +var testProjectId = uuid.NewString() +var testResourcePoolId = uuid.NewString() +var testRegion = "eu02" + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testResourcePoolId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ResourcePoolId: testResourcePoolId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiDeleteResourcePoolRequest)) sfs.ApiDeleteResourcePoolRequest { + request := testClient.DeleteResourcePool(testCtx, testProjectId, testRegion, testResourcePoolId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "resource pool id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "resource pool id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiDeleteResourcePoolRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resourcePoolName string + response map[string]interface{} + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty - output json", + args: args{ + outputFormat: print.JSONOutputFormat, + }, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resourcePoolName, tt.args.response); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/resource-pool/describe/describe.go b/internal/cmd/beta/sfs/resource-pool/describe/describe.go new file mode 100644 index 000000000..0567b950e --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/describe/describe.go @@ -0,0 +1,152 @@ +package describe + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + resourcePoolIdArg = "RESOURCE_POOL_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "describe", + Short: "Shows details of a SFS resource pool", + Long: "Shows details of a SFS resource pool.", + Args: args.SingleArg(resourcePoolIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe the SFS resource pool with ID "xxx"`, + "$ stackit beta sfs resource-pool describe xxx"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + resp, err := buildRequest(ctx, model, apiClient).Execute() + if err != nil { + return fmt.Errorf("describe SFS resource pool: %w", err) + } + + // Get projectLabel + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + return outputResult(params.Printer, model.OutputFormat, model.ResourcePoolId, projectLabel, resp.ResourcePool) + }, + } + return cmd +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiGetResourcePoolRequest { + req := apiClient.GetResourcePool(ctx, model.ProjectId, model.Region, model.ResourcePoolId) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + resourcePoolId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ResourcePoolId: resourcePoolId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, resourcePoolId, projectLabel string, resourcePool *sfs.GetResourcePoolResponseResourcePool) error { + return p.OutputResult(outputFormat, resourcePool, func() error { + if resourcePool == nil { + p.Outputf("Resource pool %q not found in project %q\n", resourcePoolId, projectLabel) + return nil + } + table := tables.NewTable() + + // convert the string slice to a comma separated list + var ipAclStr string + if resourcePool.IpAcl != nil { + ipAclStr = strings.Join(*resourcePool.IpAcl, ", ") + } + + table.AddRow("ID", utils.PtrString(resourcePool.Id)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(resourcePool.Name)) + table.AddSeparator() + table.AddRow("AVAILABILITY ZONE", utils.PtrString(resourcePool.AvailabilityZone)) + table.AddSeparator() + table.AddRow("NUMBER OF SHARES", utils.PtrString(resourcePool.CountShares)) + table.AddSeparator() + table.AddRow("IP ACL", ipAclStr) + table.AddSeparator() + table.AddRow("MOUNT PATH", utils.PtrString(resourcePool.MountPath)) + table.AddSeparator() + if resourcePool.PerformanceClass != nil { + table.AddRow("PERFORMANCE CLASS", utils.PtrString(resourcePool.PerformanceClass.Name)) + table.AddSeparator() + } + table.AddRow("SNAPSHOTS ARE VISIBLE", utils.PtrString(resourcePool.SnapshotsAreVisible)) + table.AddSeparator() + table.AddRow("NEXT PERFORMANCE CLASS DOWNGRADE TIME", utils.PtrString(resourcePool.PerformanceClassDowngradableAt)) + table.AddSeparator() + table.AddRow("NEXT SIZE REDUCTION TIME", utils.PtrString(resourcePool.SizeReducibleAt)) + table.AddSeparator() + if resourcePool.HasSpace() { + table.AddRow("TOTAL SIZE (GB)", utils.PtrString(resourcePool.Space.SizeGigabytes)) + table.AddSeparator() + table.AddRow("AVAILABLE SIZE (GB)", utils.PtrString(resourcePool.Space.AvailableGigabytes)) + table.AddSeparator() + table.AddRow("USED SIZE (GB)", utils.PtrString(resourcePool.Space.UsedGigabytes)) + table.AddSeparator() + } + table.AddRow("STATE", utils.PtrString(resourcePool.State)) + table.AddSeparator() + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go b/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go new file mode 100644 index 000000000..8fddcd529 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go @@ -0,0 +1,211 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testResourcePoolId = uuid.NewString() +var testRegion = "eu02" + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testResourcePoolId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ResourcePoolId: testResourcePoolId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiGetResourcePoolRequest)) sfs.ApiGetResourcePoolRequest { + request := testClient.GetResourcePool(testCtx, testProjectId, testRegion, testResourcePoolId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "resource pool id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "resource pool id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiGetResourcePoolRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resourcePoolId string + projectLabel string + resp *sfs.GetResourcePoolResponseResourcePool + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + resp: &sfs.GetResourcePoolResponseResourcePool{}, + }, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resourcePoolId, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/resource-pool/list/list.go b/internal/cmd/beta/sfs/resource-pool/list/list.go new file mode 100644 index 000000000..d62dbd7b6 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/list/list.go @@ -0,0 +1,153 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + limitFlag = "limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all SFS resource pools", + Long: "Lists all SFS resource pools.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all SFS resource pools`, + "$ stackit beta sfs resource-pool list"), + examples.NewExample( + `List all SFS resource pools for another region than the default one`, + "$ stackit beta sfs resource-pool list --region eu01"), + examples.NewExample( + `List up to 10 SFS resource pools`, + "$ stackit beta sfs resource-pool list --limit 10"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + resp, err := buildRequest(ctx, model, apiClient).Execute() + if err != nil { + return fmt.Errorf("list SFS resource pools: %w", err) + } + + resourcePools := utils.GetSliceFromPointer(resp.ResourcePools) + + // Truncate output + if model.Limit != nil && len(resourcePools) > int(*model.Limit) { + resourcePools = resourcePools[:*model.Limit] + } + + // Get projectLabel + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resourcePools) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiListResourcePoolsRequest { + req := apiClient.ListResourcePools(ctx, model.ProjectId, model.Region) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &cliErr.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} +func outputResult(p *print.Printer, outputFormat, projectLabel string, resourcePools []sfs.ResourcePool) error { + return p.OutputResult(outputFormat, resourcePools, func() error { + if len(resourcePools) == 0 { + p.Outputf("No resource pools found for project %q\n", projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "AVAILABILITY ZONE", "STATE", "TOTAL SIZE (GB)", "USED SIZE (GB)") + for _, resourcePool := range resourcePools { + totalSizeGigabytes, usedSizeGigabytes := "", "" + if resourcePool.HasSpace() { + totalSizeGigabytes = utils.PtrString(resourcePool.Space.SizeGigabytes) + usedSizeGigabytes = utils.PtrString(resourcePool.Space.UsedGigabytes) + } + table.AddRow( + utils.PtrString(resourcePool.Id), + utils.PtrString(resourcePool.Name), + utils.PtrString(resourcePool.AvailabilityZone), + utils.PtrString(resourcePool.State), + totalSizeGigabytes, + usedSizeGigabytes, + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/beta/sfs/resource-pool/list/list_test.go b/internal/cmd/beta/sfs/resource-pool/list/list_test.go new file mode 100644 index 000000000..4670a7856 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/list/list_test.go @@ -0,0 +1,199 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} +var testProjectId = uuid.NewString() +var testRegion = "eu02" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Limit: utils.Ptr(int64(10)), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiListResourcePoolsRequest)) sfs.ApiListResourcePoolsRequest { + request := testClient.ListResourcePools(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "limit invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "limit invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + { + description: "limit invalid 3", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-5" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiListResourcePoolsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resourcePools []sfs.ResourcePool + projectLabel string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty resource pools slice", + args: args{ + resourcePools: []sfs.ResourcePool{}, + }, + wantErr: false, + }, + { + name: "set empty resource pool in resource pools slice", + args: args{ + resourcePools: []sfs.ResourcePool{{}}, + }, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.resourcePools); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/resource-pool/resource_pool.go b/internal/cmd/beta/sfs/resource-pool/resource_pool.go new file mode 100644 index 000000000..3198741b4 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/resource_pool.go @@ -0,0 +1,34 @@ +package resourcepool + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/resource-pool/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/resource-pool/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/resource-pool/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/resource-pool/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/resource-pool/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "resource-pool", + Short: "Provides functionality for SFS resource pools", + Long: "Provides functionality for SFS resource pools.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) +} diff --git a/internal/cmd/beta/sfs/resource-pool/update/update.go b/internal/cmd/beta/sfs/resource-pool/update/update.go new file mode 100644 index 000000000..267f68939 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/update/update.go @@ -0,0 +1,179 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" +) + +const ( + resourcePoolIdArg = "RESOURCE_POOL_ID" + performanceClassFlag = "performance-class" + sizeFlag = "size" + ipAclFlag = "ip-acl" + snapshotsVisibleFlag = "snapshots-visible" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + SizeGigabytes *int64 + PerformanceClass *string + IpAcl *[]string + ResourcePoolId string + SnapshotsVisible *bool +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "update", + Short: "Updates a SFS resource pool", + Long: `Updates a SFS resource pool. + +The available performance class values can be obtained by running: + $ stackit beta sfs performance-class list`, + Args: args.SingleArg(resourcePoolIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update the SFS resource pool with ID "xxx"`, + "$ stackit beta sfs resource-pool update xxx --ip-acl 10.88.135.144/28 --performance-class Standard --size 5"), + examples.NewExample( + `Update the SFS resource pool with ID "xxx", allow only a single IP which can mount the resource pool`, + "$ stackit beta sfs resource-pool update xxx --ip-acl 250.81.87.224/32 --performance-class Standard --size 5"), + examples.NewExample( + `Update the SFS resource pool with ID "xxx", allow multiple IP ACL which can mount the resource pool`, + "$ stackit beta sfs resource-pool update xxx --ip-acl \"10.88.135.144/28,250.81.87.224/32\" --performance-class Standard --size 5"), + examples.NewExample( + `Update the SFS resource pool with ID "xxx", set snapshots visible to false`, + "$ stackit beta sfs resource-pool update xxx --snapshots-visible=false"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + resourcePoolName, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolName = model.ResourcePoolId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update resource-pool %q for project %q?", resourcePoolName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + resp, err := buildRequest(ctx, model, apiClient).Execute() + if err != nil { + return fmt.Errorf("update SFS resource pool: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Update resource pool") + _, err = wait.UpdateResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for resource pool update: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(sizeFlag, 0, "Size of the pool in Gigabytes") + cmd.Flags().String(performanceClassFlag, "", "Performance class") + cmd.Flags().Var(flags.CIDRSliceFlag(), ipAclFlag, "List of network addresses in the form
, e.g. 192.168.10.0/24 that can mount the resource pool readonly") + cmd.Flags().Bool(snapshotsVisibleFlag, false, "Set snapshots visible and accessible to users") +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiUpdateResourcePoolRequest { + req := apiClient.UpdateResourcePool(ctx, model.ProjectId, model.Region, model.ResourcePoolId) + req = req.UpdateResourcePoolPayload(sfs.UpdateResourcePoolPayload{ + IpAcl: model.IpAcl, + PerformanceClass: model.PerformanceClass, + SizeGigabytes: model.SizeGigabytes, + SnapshotsAreVisible: model.SnapshotsVisible, + }) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + resourcePoolId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + performanceClass := flags.FlagToStringPointer(p, cmd, performanceClassFlag) + size := flags.FlagToInt64Pointer(p, cmd, sizeFlag) + ipAcls := flags.FlagToStringSlicePointer(p, cmd, ipAclFlag) + snapshotsVisible := flags.FlagToBoolPointer(p, cmd, snapshotsVisibleFlag) + + if performanceClass == nil && size == nil && ipAcls == nil && snapshotsVisible == nil { + return nil, &cliErr.EmptyUpdateError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SizeGigabytes: size, + IpAcl: ipAcls, + PerformanceClass: performanceClass, + ResourcePoolId: resourcePoolId, + SnapshotsVisible: snapshotsVisible, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, resp *sfs.UpdateResourcePoolResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil || resp.ResourcePool == nil { + p.Outputln("Resource pool response is empty") + return nil + } + p.Outputf("Updated resource pool %s\n", utils.PtrString(resp.ResourcePool.Name)) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/resource-pool/update/update_test.go b/internal/cmd/beta/sfs/resource-pool/update/update_test.go new file mode 100644 index 000000000..c94b79b92 --- /dev/null +++ b/internal/cmd/beta/sfs/resource-pool/update/update_test.go @@ -0,0 +1,361 @@ +package update + +import ( + "context" + "slices" + "strconv" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu02" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &sfs.APIClient{} + + testProjectId = uuid.NewString() + testResourcePoolId = uuid.NewString() + testResourcePoolIpAcl = []string{"10.88.135.144/28", "250.81.87.224/32"} + testResourcePoolPerformanceClass = "Standard" + testResourcePoolSizeInGB int64 = 50 + testSnapshotsVisible = true +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testResourcePoolId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + performanceClassFlag: testResourcePoolPerformanceClass, + sizeFlag: strconv.FormatInt(testResourcePoolSizeInGB, 10), + ipAclFlag: strings.Join(testResourcePoolIpAcl, ","), + snapshotsVisibleFlag: strconv.FormatBool(testSnapshotsVisible), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + ipAclClone := slices.Clone(testResourcePoolIpAcl) + + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + ResourcePoolId: testResourcePoolId, + SizeGigabytes: &testResourcePoolSizeInGB, + PerformanceClass: &testResourcePoolPerformanceClass, + IpAcl: &ipAclClone, + SnapshotsVisible: &testSnapshotsVisible, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiUpdateResourcePoolRequest)) sfs.ApiUpdateResourcePoolRequest { + request := testClient.UpdateResourcePool(testCtx, testProjectId, testRegion, testResourcePoolId) + request = request.UpdateResourcePoolPayload(sfs.UpdateResourcePoolPayload{ + IpAcl: &testResourcePoolIpAcl, + PerformanceClass: &testResourcePoolPerformanceClass, + SizeGigabytes: &testResourcePoolSizeInGB, + SnapshotsAreVisible: &testSnapshotsVisible, + }) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + ipAclValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no values to update", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, sizeFlag) + delete(flagValues, ipAclFlag) + delete(flagValues, performanceClassFlag) + delete(flagValues, snapshotsVisibleFlag) + }), + isValid: false, + }, + { + description: "update only size", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipAclFlag) + delete(flagValues, performanceClassFlag) + delete(flagValues, snapshotsVisibleFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IpAcl = nil + model.PerformanceClass = nil + model.SnapshotsVisible = nil + }), + isValid: true, + }, + { + description: "update only snapshots visibility", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipAclFlag) + delete(flagValues, performanceClassFlag) + delete(flagValues, sizeFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IpAcl = nil + model.PerformanceClass = nil + model.SizeGigabytes = nil + }), + isValid: true, + }, + { + description: "update only performance class", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, ipAclFlag) + delete(flagValues, snapshotsVisibleFlag) + delete(flagValues, sizeFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IpAcl = nil + model.SnapshotsVisible = nil + model.SizeGigabytes = nil + }), + isValid: true, + }, + { + description: "update only ipAcl", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, performanceClassFlag) + delete(flagValues, snapshotsVisibleFlag) + delete(flagValues, sizeFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.PerformanceClass = nil + model.SnapshotsVisible = nil + model.SizeGigabytes = nil + }), + isValid: true, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + flagValues[sizeFlag] = "50" + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + flagValues[sizeFlag] = "50" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + flagValues[sizeFlag] = "50" + }), + isValid: false, + }, + { + description: "resource pool id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "resource pool id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "repeated acl flags", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + ipAclValues: []string{"198.51.100.14/24", "198.51.100.14/32"}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + if model.IpAcl == nil { + model.IpAcl = &[]string{} + } + *model.IpAcl = append(*model.IpAcl, "198.51.100.14/24", "198.51.100.14/32") + }), + }, + { + description: "repeated ip acl flag with list value", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + ipAclValues: []string{"198.51.100.14/24,198.51.100.14/32"}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + if model.IpAcl == nil { + model.IpAcl = &[]string{} + } + *model.IpAcl = append(*model.IpAcl, "198.51.100.14/24", "198.51.100.14/32") + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + ipAclFlag: tt.ipAclValues, + }, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiUpdateResourcePoolRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resp *sfs.UpdateResourcePoolResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty response", + args: args{ + resp: &sfs.UpdateResourcePoolResponse{}, + }, + wantErr: false, + }, + { + name: "valid response with empty resource pool", + args: args{ + resp: &sfs.UpdateResourcePoolResponse{ + ResourcePool: &sfs.UpdateResourcePoolResponseResourcePool{}, + }, + }, + wantErr: false, + }, + { + name: "valid response with name", + args: args{ + resp: &sfs.UpdateResourcePoolResponse{ + ResourcePool: &sfs.UpdateResourcePoolResponseResourcePool{ + Name: utils.Ptr("example name"), + }, + }, + }, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/sfs.go b/internal/cmd/beta/sfs/sfs.go new file mode 100644 index 000000000..2477e4843 --- /dev/null +++ b/internal/cmd/beta/sfs/sfs.go @@ -0,0 +1,34 @@ +package sfs + +import ( + exportpolicy "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/export-policy" + performanceclass "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/performance-class" + resourcepool "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/resource-pool" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/share" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "sfs", + Short: "Provides functionality for SFS (stackit file storage)", + Long: "Provides functionality for SFS (stackit file storage).", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(resourcepool.NewCmd(params)) + cmd.AddCommand(share.NewCmd(params)) + cmd.AddCommand(exportpolicy.NewCmd(params)) + cmd.AddCommand(snapshot.NewCmd(params)) + cmd.AddCommand(performanceclass.NewCmd(params)) +} diff --git a/internal/cmd/beta/sfs/share/create/create.go b/internal/cmd/beta/sfs/share/create/create.go new file mode 100644 index 000000000..8fc5312bf --- /dev/null +++ b/internal/cmd/beta/sfs/share/create/create.go @@ -0,0 +1,181 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" +) + +const ( + nameFlag = "name" + resourcePoolIdFlag = "resource-pool-id" + exportPolicyNameFlag = "export-policy-name" + hardLimitFlag = "hard-limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Name string + ExportPolicyName *string + ResourcePoolId string + HardLimit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a share", + Long: "Creates a share.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a share in a resource pool with ID "xxx", name "yyy" and no space hard limit`, + "$ stackit beta sfs share create --resource-pool-id xxx --name yyy --hard-limit 0", + ), + examples.NewExample( + `Create a share in a resource pool with ID "xxx", name "yyy" and export policy with name "zzz"`, + "$ stackit beta sfs share create --resource-pool-id xxx --name yyy --export-policy-name zzz --hard-limit 0", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolLabel = model.ResourcePoolId + } else if resourcePoolLabel == "" { + resourcePoolLabel = model.ResourcePoolId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create a SFS share for resource pool %q?", resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create SFS share: %w", err) + } + var shareId string + if resp != nil && resp.HasShare() && resp.Share.HasId() { + shareId = *resp.Share.Id + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating share") + _, err = wait.CreateShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, shareId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("waiting for share creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, model.Async, resourcePoolLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(nameFlag, "", "Share name") + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool the share is assigned to") + cmd.Flags().String(exportPolicyNameFlag, "", "The export policy the share is assigned to") + cmd.Flags().Int64(hardLimitFlag, 0, "The space hard limit for the share") + + err := flags.MarkFlagsRequired(cmd, nameFlag, resourcePoolIdFlag, hardLimitFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + hardLimit := flags.FlagToInt64Pointer(p, cmd, hardLimitFlag) + if hardLimit != nil { + if *hardLimit < 0 { + return nil, &errors.FlagValidationError{ + Flag: hardLimitFlag, + Details: "must be a positive integer", + } + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Name: flags.FlagToStringValue(p, cmd, nameFlag), + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + ExportPolicyName: flags.FlagToStringPointer(p, cmd, exportPolicyNameFlag), + HardLimit: hardLimit, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiCreateShareRequest { + req := apiClient.CreateShare(ctx, model.ProjectId, model.Region, model.ResourcePoolId) + req = req.CreateSharePayload( + sfs.CreateSharePayload{ + Name: utils.Ptr(model.Name), + ExportPolicyName: sfs.NewNullableString(model.ExportPolicyName), + SpaceHardLimitGigabytes: model.HardLimit, + }, + ) + return req +} + +func outputResult(p *print.Printer, outputFormat string, async bool, resourcePoolLabel string, item *sfs.CreateShareResponse) error { + return p.OutputResult(outputFormat, item, func() error { + if item == nil || item.Share == nil { + p.Outputln("SFS share response is empty") + return nil + } + operation := "Created" + if async { + operation = "Triggered creation of" + } + p.Outputf( + "%s SFS Share %q in resource pool %q.\nShare ID: %s\n", + operation, + utils.PtrString(item.Share.Name), + resourcePoolLabel, + utils.PtrString(item.Share.Id), + ) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/share/create/create_test.go b/internal/cmd/beta/sfs/share/create/create_test.go new file mode 100644 index 000000000..f535093e3 --- /dev/null +++ b/internal/cmd/beta/sfs/share/create/create_test.go @@ -0,0 +1,207 @@ +package create + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testName = "test-name" +var testResourcePoolId = uuid.NewString() +var testExportPolicyName = "test-export-policy" +var testHardLimit int64 = 10 + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + nameFlag: testName, + resourcePoolIdFlag: testResourcePoolId, + exportPolicyNameFlag: testExportPolicyName, + hardLimitFlag: strconv.Itoa(int(testHardLimit)), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Name: testName, + ResourcePoolId: testResourcePoolId, + ExportPolicyName: utils.Ptr(testExportPolicyName), + HardLimit: utils.Ptr(testHardLimit), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiCreateShareRequest)) sfs.ApiCreateShareRequest { + request := testClient.CreateShare(testCtx, testProjectId, testRegion, testResourcePoolId) + request = request.CreateSharePayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(request *sfs.CreateSharePayload)) sfs.CreateSharePayload { + payload := sfs.CreateSharePayload{ + Name: utils.Ptr(testName), + ExportPolicyName: sfs.NewNullableString(utils.Ptr(testExportPolicyName)), + SpaceHardLimitGigabytes: utils.Ptr(testHardLimit), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "required only", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, exportPolicyNameFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.ExportPolicyName = nil + }), + }, + { + description: "missing required name", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + }), + isValid: false, + }, + { + description: "missing required resourcePoolId", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, resourcePoolIdFlag) + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiCreateShareRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(sfs.NullableString{}), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + async bool + resourcePoolLabel string + item *sfs.CreateShareResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + item: &sfs.CreateShareResponse{}, + }, + wantErr: false, + }, + { + name: "set empty response share", + args: args{ + item: &sfs.CreateShareResponse{ + Share: &sfs.CreateShareResponseShare{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.resourcePoolLabel, tt.args.item); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/share/delete/delete.go b/internal/cmd/beta/sfs/share/delete/delete.go new file mode 100644 index 000000000..7d5221cf7 --- /dev/null +++ b/internal/cmd/beta/sfs/share/delete/delete.go @@ -0,0 +1,134 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" +) + +const ( + shareIdArg = "SHARE_ID" + + resourcePoolIdFlag = "resource-pool-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + ShareId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", shareIdArg), + Short: "Deletes a share", + Long: "Deletes a share.", + Args: args.SingleArg(shareIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a share with ID "xxx" from a resource pool with ID "yyy"`, + "$ stackit beta sfs share delete xxx --resource-pool-id yyy", + ), + ), + RunE: func(cmd *cobra.Command, inputArgs []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, inputArgs) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + shareLabel, err := sfsUtils.GetShareName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get share name: %v", err) + shareLabel = model.ShareId + } else if shareLabel == "" { + shareLabel = model.ShareId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete SFS share %q? (This cannot be undone)", shareLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("delete SFS share: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Deleting share") + _, err = wait.DeleteShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("waiting for share deletion: %w", err) + } + s.Stop() + } + + operation := "Deleted" + if model.Async { + operation = "Triggered deletion of" + } + + params.Printer.Outputf("%s share %q\n", operation, shareLabel) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool the share is assigned to") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + shareId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ShareId: shareId, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiDeleteShareRequest { + return apiClient.DeleteShare(ctx, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId) +} diff --git a/internal/cmd/beta/sfs/share/delete/delete_test.go b/internal/cmd/beta/sfs/share/delete/delete_test.go new file mode 100644 index 000000000..60040fc44 --- /dev/null +++ b/internal/cmd/beta/sfs/share/delete/delete_test.go @@ -0,0 +1,186 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() +var testShareId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testShareId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + ShareId: testShareId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiDeleteShareRequest)) sfs.ApiDeleteShareRequest { + request := testClient.DeleteShare(testCtx, testProjectId, testRegion, testResourcePoolId, testShareId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "share id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "share id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing required resourcePoolId", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, resourcePoolIdFlag) + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiDeleteShareRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/share/describe/describe.go b/internal/cmd/beta/sfs/share/describe/describe.go new file mode 100644 index 000000000..f593f9122 --- /dev/null +++ b/internal/cmd/beta/sfs/share/describe/describe.go @@ -0,0 +1,191 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + shareIdArg = "SHARE_ID" + + resourcePoolIdFlag = "resource-pool-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + ShareId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", shareIdArg), + Short: "Shows details of a shares", + Long: "Shows details of a shares.", + Args: args.SingleArg(shareIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a shares with ID "xxx" from resource pool with ID "yyy"`, + "$ stackit beta sfs export-policy describe xxx --resource-pool-id yyy", + ), + ), + RunE: func(cmd *cobra.Command, inputArgs []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, inputArgs) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("describe SFS share: %w", err) + } + + resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolLabel = model.ResourcePoolId + } else if resourcePoolLabel == "" { + resourcePoolLabel = model.ResourcePoolId + } + + return outputResult(params.Printer, model.OutputFormat, resourcePoolLabel, model.ShareId, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool the share is assigned to") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + shareId := inputArgs[0] + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + ShareId: shareId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiGetShareRequest { + return apiClient.GetShare(ctx, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId) +} + +func outputResult(p *print.Printer, outputFormat, resourcePoolLabel, shareId string, share *sfs.GetShareResponse) error { + return p.OutputResult(outputFormat, share, func() error { + if share == nil || share.Share == nil { + p.Outputf("Share %q not found in resource pool %q\n", shareId, resourcePoolLabel) + return nil + } + + var content []tables.Table + + table := tables.NewTable() + table.SetTitle("Share") + item := *share.Share + + table.AddRow("ID", utils.PtrString(item.Id)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(item.Name)) + table.AddSeparator() + table.AddRow("STATE", utils.PtrString(item.State)) + table.AddSeparator() + table.AddRow("MOUNT PATH", utils.PtrString(item.MountPath)) + table.AddSeparator() + table.AddRow("HARD LIMIT (GB)", utils.PtrString(item.SpaceHardLimitGigabytes)) + table.AddSeparator() + table.AddRow("CREATED AT", utils.ConvertTimePToDateTimeString(item.CreatedAt)) + + content = append(content, table) + + if item.HasExportPolicy() { + policyTable := tables.NewTable() + policyTable.SetTitle("Export Policy") + + policyTable.SetHeader( + "ID", + "NAME", + "SHARES USING EXPORT POLICY", + "CREATED AT", + ) + + policy := item.ExportPolicy.Get() + + policyTable.AddRow( + utils.PtrString(policy.Id), + utils.PtrString(policy.Name), + utils.PtrString(policy.SharesUsingExportPolicy), + utils.ConvertTimePToDateTimeString(policy.CreatedAt), + ) + + content = append(content, policyTable) + + if policy.Rules != nil && len(*policy.Rules) > 0 { + ruleTable := tables.NewTable() + ruleTable.SetTitle("Export Policy - Rules") + + ruleTable.SetHeader("ID", "ORDER", "DESCRIPTION", "IP ACL", "READ ONLY", "SET UUID", "SUPER USER", "CREATED AT") + + for _, rule := range *policy.Rules { + var description string + if rule.Description != nil { + description = utils.PtrString(rule.Description.Get()) + } + ruleTable.AddRow( + utils.PtrString(rule.Id), + utils.PtrString(rule.Order), + description, + utils.JoinStringPtr(rule.IpAcl, ", "), + utils.PtrString(rule.ReadOnly), + utils.PtrString(rule.SetUuid), + utils.PtrString(rule.SuperUser), + utils.ConvertTimePToDateTimeString(rule.CreatedAt), + ) + ruleTable.AddSeparator() + } + + content = append(content, ruleTable) + } + } + + if err := tables.DisplayTables(p, content); err != nil { + return fmt.Errorf("render tables: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/sfs/share/describe/describe_test.go b/internal/cmd/beta/sfs/share/describe/describe_test.go new file mode 100644 index 000000000..889117485 --- /dev/null +++ b/internal/cmd/beta/sfs/share/describe/describe_test.go @@ -0,0 +1,233 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() +var testShareId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testShareId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + ShareId: testShareId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiGetShareRequest)) sfs.ApiGetShareRequest { + request := testClient.GetShare(testCtx, testProjectId, testRegion, testResourcePoolId, testShareId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "share id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "share id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing required resourcePoolId", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, resourcePoolIdFlag) + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiGetShareRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + shareId string + resourcePoolLabel string + share *sfs.GetShareResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + share: &sfs.GetShareResponse{}, + }, + wantErr: false, + }, + { + name: "set empty share", + args: args{ + share: &sfs.GetShareResponse{ + Share: &sfs.GetShareResponseShare{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resourcePoolLabel, tt.args.shareId, tt.args.share); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/share/list/list.go b/internal/cmd/beta/sfs/share/list/list.go new file mode 100644 index 000000000..e8945cd04 --- /dev/null +++ b/internal/cmd/beta/sfs/share/list/list.go @@ -0,0 +1,158 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + resourcePoolIdFlag = "resource-pool-id" + limitFlag = "limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + Limit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all shares of a resource pool", + Long: "Lists all shares of a resource pool.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all shares from resource pool with ID "xxx"`, + "$ stackit beta sfs export-policy list --resource-pool-id xxx", + ), + examples.NewExample( + `List up to 10 shares from resource pool with ID "xxx"`, + "$ stackit beta sfs export-policy list --resource-pool-id xxx --limit 10", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list SFS share: %w", err) + } + + resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolLabel = model.ResourcePoolId + } else if resourcePoolLabel == "" { + resourcePoolLabel = model.ResourcePoolId + } + + // Truncate output + items := utils.GetSliceFromPointer(resp.Shares) + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, resourcePoolLabel, items) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool the share is assigned to") + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be grater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiListSharesRequest { + return apiClient.ListShares(ctx, model.ProjectId, model.Region, model.ResourcePoolId) +} + +func outputResult(p *print.Printer, outputFormat, resourcePoolLabel string, shares []sfs.Share) error { + return p.OutputResult(outputFormat, shares, func() error { + if len(shares) == 0 { + p.Info("No shares found for resource pool %q\n", resourcePoolLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "STATE", "EXPORT POLICY", "MOUNT PATH", "HARD LIMIT (GB)", "CREATED AT") + + for _, share := range shares { + var policy string + if share.ExportPolicy != nil { + if name, ok := share.ExportPolicy.Get().GetNameOk(); ok { + policy = name + } else if id, ok := share.ExportPolicy.Get().GetIdOk(); ok { + policy = id + } + } + table.AddRow( + utils.PtrString(share.Id), + utils.PtrString(share.Name), + utils.PtrString(share.State), + policy, + utils.PtrString(share.MountPath), + utils.PtrString(share.SpaceHardLimitGigabytes), + utils.ConvertTimePToDateTimeString(share.CreatedAt), + ) + } + p.Outputln(table.Render()) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/share/list/list_test.go b/internal/cmd/beta/sfs/share/list/list_test.go new file mode 100644 index 000000000..7cff82a0d --- /dev/null +++ b/internal/cmd/beta/sfs/share/list/list_test.go @@ -0,0 +1,207 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() +var testLimit int64 = 10 + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + limitFlag: strconv.FormatInt(testLimit, 10), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + Limit: utils.Ptr(testLimit), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiListSharesRequest)) sfs.ApiListSharesRequest { + request := testClient.ListShares(testCtx, testProjectId, testRegion, testResourcePoolId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no flag values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing required resourcePoolId", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, resourcePoolIdFlag) + }), + isValid: false, + }, + { + description: "invalid limit 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + { + description: "invalid limit 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-1" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiListSharesRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resourcePoolLabel string + shares []sfs.Share + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty share in shares", + args: args{ + shares: []sfs.Share{{}}, + }, + wantErr: false, + }, + { + name: "set empty shares", + args: args{ + shares: []sfs.Share{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resourcePoolLabel, tt.args.shares); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/share/share.go b/internal/cmd/beta/sfs/share/share.go new file mode 100644 index 000000000..1ea180fd2 --- /dev/null +++ b/internal/cmd/beta/sfs/share/share.go @@ -0,0 +1,34 @@ +package share + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/share/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/share/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/share/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/share/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/share/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "share", + Short: "Provides functionality for SFS shares", + Long: "Provides functionality for SFS shares.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) +} diff --git a/internal/cmd/beta/sfs/share/update/update.go b/internal/cmd/beta/sfs/share/update/update.go new file mode 100644 index 000000000..f6178e96a --- /dev/null +++ b/internal/cmd/beta/sfs/share/update/update.go @@ -0,0 +1,181 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" +) + +const ( + shareIdArg = "SHARE_ID" + + resourcePoolIdFlag = "resource-pool-id" + exportPolicyNameFlag = "export-policy-name" + hardLimitFlag = "hard-limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ShareId string + ResourcePoolId string + ExportPolicyName *string + HardLimit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", shareIdArg), + Short: "Updates a share", + Long: "Updates a share.", + Args: args.SingleArg(shareIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update share with ID "xxx" with new export-policy-name "yyy" in resource-pool "zzz"`, + "$ stackit beta sfs share update xxx --export-policy-name yyy --resource-pool-id zzz", + ), + examples.NewExample( + `Update share with ID "xxx" with new space hard limit "50" in resource-pool "yyy"`, + "$ stackit beta sfs share update xxx --hard-limit 50 --resource-pool-id yyy", + ), + ), + RunE: func(cmd *cobra.Command, inputArgs []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, inputArgs) + if err != nil { + return fmt.Errorf("unable to parse input: %w", err) + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + shareLabel, err := sfsUtils.GetShareName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get share name: %v", err) + shareLabel = model.ShareId + } else if shareLabel == "" { + shareLabel = model.ShareId + } + + resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolLabel = model.ResourcePoolId + } else if resourcePoolLabel == "" { + resourcePoolLabel = model.ResourcePoolId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update SFS share %q for resource pool %q?", shareLabel, resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update SFS share: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Updating share") + _, err = wait.UpdateShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("waiting for share update: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model.OutputFormat, model.Async, resourcePoolLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool the share is assigned to") + cmd.Flags().String(exportPolicyNameFlag, "", "The export policy the share is assigned to") + cmd.Flags().Int64(hardLimitFlag, 0, "The space hard limit for the share") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + shareId := inputArgs[0] + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + hardLimit := flags.FlagToInt64Pointer(p, cmd, hardLimitFlag) + if hardLimit != nil && *hardLimit < 0 { + return nil, &errors.FlagValidationError{ + Flag: hardLimitFlag, + Details: "must be a positive integer", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + ExportPolicyName: flags.FlagToStringPointer(p, cmd, exportPolicyNameFlag), + HardLimit: hardLimit, + ShareId: shareId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiUpdateShareRequest { + req := apiClient.UpdateShare(ctx, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId) + req = req.UpdateSharePayload(sfs.UpdateSharePayload{ + ExportPolicyName: sfs.NewNullableString(model.ExportPolicyName), + SpaceHardLimitGigabytes: model.HardLimit, + }) + return req +} + +func outputResult(p *print.Printer, outputFormat string, async bool, resourcePoolLabel string, item *sfs.UpdateShareResponse) error { + return p.OutputResult(outputFormat, item, func() error { + if item == nil || item.Share == nil { + p.Outputln("SFS share response is empty") + return nil + } + + operation := "Updated" + if async { + operation = "Triggered update of" + } + p.Outputf( + "%s SFS share %q in resource pool %q.\n", + operation, + utils.PtrString(item.Share.Name), + resourcePoolLabel, + ) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/share/update/update_test.go b/internal/cmd/beta/sfs/share/update/update_test.go new file mode 100644 index 000000000..99494e905 --- /dev/null +++ b/internal/cmd/beta/sfs/share/update/update_test.go @@ -0,0 +1,266 @@ +package update + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() +var testShareId = uuid.NewString() +var testHardLimit int64 = 10 +var testExportPolicy = "test-export-policy" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + hardLimitFlag: strconv.FormatInt(testHardLimit, 10), + exportPolicyNameFlag: testExportPolicy, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testShareId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + ShareId: testShareId, + HardLimit: utils.Ptr(testHardLimit), + ExportPolicyName: utils.Ptr(testExportPolicy), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiUpdateShareRequest)) sfs.ApiUpdateShareRequest { + request := testClient.UpdateShare(testCtx, testProjectId, testRegion, testResourcePoolId, testShareId) + request = request.UpdateSharePayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *sfs.UpdateSharePayload)) sfs.UpdateSharePayload { + payload := sfs.UpdateSharePayload{ + ExportPolicyName: sfs.NewNullableString(utils.Ptr(testExportPolicy)), + SpaceHardLimitGigabytes: utils.Ptr(testHardLimit), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "only required flags", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, exportPolicyNameFlag) + delete(flagValues, hardLimitFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.ExportPolicyName = nil + model.HardLimit = nil + }), + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "share id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "share id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing required resourcePoolId", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, resourcePoolIdFlag) + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiUpdateShareRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest, sfs.NullableString{}), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + async bool + resourcePoolLabel string + item *sfs.UpdateShareResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + item: &sfs.UpdateShareResponse{}, + }, + wantErr: false, + }, + { + name: "set empty share", + args: args{ + item: &sfs.UpdateShareResponse{ + Share: &sfs.UpdateShareResponseShare{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.resourcePoolLabel, tt.args.item); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/snapshot/create/create.go b/internal/cmd/beta/sfs/snapshot/create/create.go new file mode 100644 index 000000000..e55d902e9 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/create/create.go @@ -0,0 +1,142 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + resourcePoolIdFlag = "resource-pool-id" + nameFlag = "name" + commentFlag = "comment" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + Name string + Comment *string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a new snapshot of a resource pool", + Long: "Creates a new snapshot of a resource pool.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a new snapshot with name "snapshot-name" of a resource pool with ID "xxx"`, + "$ stackit beta sfs snapshot create --name snapshot-name --resource-pool-id xxx", + ), + examples.NewExample( + `Create a new snapshot with name "snapshot-name" and comment "snapshot-comment" of a resource pool with ID "xxx"`, + `$ stackit beta sfs snapshot create --name snapshot-name --resource-pool-id xxx --comment "snapshot-comment"`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolLabel = model.ResourcePoolId + } else if resourcePoolLabel == "" { + resourcePoolLabel = model.ResourcePoolId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create a snapshot for resource pool %q?", resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create snapshot: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, model.Name, resourcePoolLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(nameFlag, "", "Snapshot name") + cmd.Flags().String(commentFlag, "", "A comment to add more information to the snapshot") + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool from which the snapshot should be created") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag, nameFlag) + cobra.CheckErr(err) +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiCreateResourcePoolSnapshotRequest { + req := apiClient.CreateResourcePoolSnapshot(ctx, model.ProjectId, model.Region, model.ResourcePoolId) + req = req.CreateResourcePoolSnapshotPayload(sfs.CreateResourcePoolSnapshotPayload{ + Name: utils.Ptr(model.Name), + Comment: sfs.NewNullableString(model.Comment), + }) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Name: flags.FlagToStringValue(p, cmd, nameFlag), + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + Comment: flags.FlagToStringPointer(p, cmd, commentFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, snapshotLabel, resourcePoolLabel string, resp *sfs.CreateResourcePoolSnapshotResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil || resp.ResourcePoolSnapshot == nil { + p.Outputln("SFS snapshot response is empty") + return nil + } + + p.Outputf( + "Created snapshot %q for resource pool %q.\n", + snapshotLabel, + resourcePoolLabel, + ) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/snapshot/create/create_test.go b/internal/cmd/beta/sfs/snapshot/create/create_test.go new file mode 100644 index 000000000..9ac34a9a8 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/create/create_test.go @@ -0,0 +1,218 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testName = "test-name" +var testComment = "test-comment" +var testResourcePoolId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + nameFlag: testName, + resourcePoolIdFlag: testResourcePoolId, + commentFlag: testComment, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Name: testName, + ResourcePoolId: testResourcePoolId, + Comment: utils.Ptr(testComment), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiCreateResourcePoolSnapshotRequest)) sfs.ApiCreateResourcePoolSnapshotRequest { + request := testClient.CreateResourcePoolSnapshot(testCtx, testProjectId, testRegion, testResourcePoolId) + request = request.CreateResourcePoolSnapshotPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(request *sfs.CreateResourcePoolSnapshotPayload)) sfs.CreateResourcePoolSnapshotPayload { + payload := sfs.CreateResourcePoolSnapshotPayload{ + Name: utils.Ptr(testName), + Comment: sfs.NewNullableString( + utils.Ptr(testComment), + ), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "required only", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commentFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Comment = nil + }), + }, + { + description: "missing required name", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + }), + isValid: false, + }, + { + description: "missing required resourcePoolId", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, resourcePoolIdFlag) + }), + isValid: false, + }, + { + description: "invalid resource pool id 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid resource pool id 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "invalid-resource-pool-id" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiCreateResourcePoolSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + cmp.AllowUnexported(sfs.NullableString{}), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + snapshotLabel string + resourcePoolLabel string + resp *sfs.CreateResourcePoolSnapshotResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + resp: &sfs.CreateResourcePoolSnapshotResponse{}, + }, + wantErr: false, + }, + { + name: "set empty snapshot", + args: args{ + resp: &sfs.CreateResourcePoolSnapshotResponse{ + ResourcePoolSnapshot: &sfs.CreateResourcePoolSnapshotResponseResourcePoolSnapshot{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.snapshotLabel, tt.args.resourcePoolLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/snapshot/delete/delete.go b/internal/cmd/beta/sfs/snapshot/delete/delete.go new file mode 100644 index 000000000..6ddfc4435 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/delete/delete.go @@ -0,0 +1,114 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + snapshotNameArg = "SNAPSHOT_NAME" + + resourcePoolIdFlag = "resource-pool-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + SnapshotName string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", snapshotNameArg), + Short: "Deletes a snapshot", + Long: "Deletes a snapshot.", + Args: args.SingleArg(snapshotNameArg, nil), + Example: examples.Build( + examples.NewExample( + `Delete a snapshot with "SNAPSHOT_NAME" from resource pool with ID "yyy"`, + "$ stackit beta sfs snapshot delete SNAPSHOT_NAME --resource-pool-id yyy"), + ), + RunE: func(cmd *cobra.Command, inputArgs []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, inputArgs) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + resourcePoolLabel, err := sfsUtils.GetResourcePoolName(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get resource pool name: %v", err) + resourcePoolLabel = model.ResourcePoolId + } else if resourcePoolLabel == "" { + resourcePoolLabel = model.ResourcePoolId + } + + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete snapshot %q for resource pool %q?", model.SnapshotName, resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("delete snapshot: %w", err) + } + + params.Printer.Outputf("Deleted snapshot %q from resource pool %q.\n", model.SnapshotName, resourcePoolLabel) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool from which the snapshot should be created") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiDeleteResourcePoolSnapshotRequest { + return apiClient.DeleteResourcePoolSnapshot(ctx, model.ProjectId, model.Region, model.ResourcePoolId, model.SnapshotName) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + snapshotName := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SnapshotName: snapshotName, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} diff --git a/internal/cmd/beta/sfs/snapshot/delete/delete_test.go b/internal/cmd/beta/sfs/snapshot/delete/delete_test.go new file mode 100644 index 000000000..3a3048b64 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/delete/delete_test.go @@ -0,0 +1,188 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() +var testSnapshotName = "testSnapshot" + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testSnapshotName, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + SnapshotName: testSnapshotName, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiDeleteResourcePoolSnapshotRequest)) sfs.ApiDeleteResourcePoolSnapshotRequest { + request := testClient.DeleteResourcePoolSnapshot(testCtx, testProjectId, testRegion, testResourcePoolId, testSnapshotName) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "share id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "resource pool invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "" + }), + isValid: false, + }, + { + description: "resource pool invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiDeleteResourcePoolSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/snapshot/describe/describe.go b/internal/cmd/beta/sfs/snapshot/describe/describe.go new file mode 100644 index 000000000..4d45233fd --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/describe/describe.go @@ -0,0 +1,129 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + snapshotNameArg = "SNAPSHOT_NAME" + + resourcePoolIdFlag = "resource-pool-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + SnapshotName string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", snapshotNameArg), + Short: "Shows details of a snapshot", + Long: "Shows details of a snapshot.", + Args: args.SingleArg(snapshotNameArg, nil), + Example: examples.Build( + examples.NewExample( + `Describe a snapshot with "SNAPSHOT_NAME" from resource pool with ID "yyy"`, + "stackit beta sfs snapshot describe SNAPSHOT_NAME --resource-pool-id yyy", + ), + ), + RunE: func(cmd *cobra.Command, inputArgs []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, inputArgs) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create snapshot: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool from which the snapshot should be created") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiGetResourcePoolSnapshotRequest { + return apiClient.GetResourcePoolSnapshot(ctx, model.ProjectId, model.Region, model.ResourcePoolId, model.SnapshotName) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + snapshotName := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SnapshotName: snapshotName, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, resp *sfs.GetResourcePoolSnapshotResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil || resp.ResourcePoolSnapshot == nil { + p.Outputln("Resource pool snapshot response is empty") + return nil + } + + table := tables.NewTable() + + snap := *resp.ResourcePoolSnapshot + table.AddRow("NAME", utils.PtrString(snap.SnapshotName)) + table.AddSeparator() + if snap.Comment != nil { + table.AddRow("COMMENT", utils.PtrString(snap.Comment.Get())) + table.AddSeparator() + } + table.AddRow("RESOURCE POOL ID", utils.PtrString(snap.ResourcePoolId)) + table.AddSeparator() + table.AddRow("SIZE (GB)", utils.PtrString(snap.SizeGigabytes)) + table.AddSeparator() + table.AddRow("LOGICAL SIZE (GB)", utils.PtrString(snap.LogicalSizeGigabytes)) + table.AddSeparator() + table.AddRow("CREATED AT", utils.ConvertTimePToDateTimeString(snap.CreatedAt)) + table.AddSeparator() + + p.Outputln(table.Render()) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/snapshot/describe/describe_test.go b/internal/cmd/beta/sfs/snapshot/describe/describe_test.go new file mode 100644 index 000000000..f307c1f19 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/describe/describe_test.go @@ -0,0 +1,233 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() +var testSnapshotName = "testSnapshotName" + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testSnapshotName, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + SnapshotName: testSnapshotName, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiGetResourcePoolSnapshotRequest)) sfs.ApiGetResourcePoolSnapshotRequest { + request := testClient.GetResourcePoolSnapshot(testCtx, testProjectId, testRegion, testResourcePoolId, testSnapshotName) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, projectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[projectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "share id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "resource pool invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "" + }), + isValid: false, + }, + { + description: "resource pool invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiGetResourcePoolSnapshotRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resp *sfs.GetResourcePoolSnapshotResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + resp: &sfs.GetResourcePoolSnapshotResponse{}, + }, + wantErr: false, + }, + { + name: " set empty snapshot", + args: args{ + resp: &sfs.GetResourcePoolSnapshotResponse{ + ResourcePoolSnapshot: &sfs.GetResourcePoolSnapshotResponseResourcePoolSnapshot{}, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/snapshot/list/list.go b/internal/cmd/beta/sfs/snapshot/list/list.go new file mode 100644 index 000000000..d2caf7b58 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/list/list.go @@ -0,0 +1,148 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + resourcePoolIdFlag = "resource-pool-id" + limitFlag = "limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ResourcePoolId string + Limit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all snapshots of a resource pool", + Long: "Lists all snapshots of a resource pool.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all snapshots of a resource pool with ID "xxx"`, + "$ stackit beta sfs snapshot list --resource-pool-id xxx", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list snapshot: %w", err) + } + + // Truncate output + items := utils.GetSliceFromPointer(resp.ResourcePoolSnapshots) + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, items) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), resourcePoolIdFlag, "The resource pool from which the snapshot should be created") + cmd.Flags().Int64(limitFlag, 0, "Number of snapshots to list") + + err := flags.MarkFlagsRequired(cmd, resourcePoolIdFlag) + cobra.CheckErr(err) +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *sfs.APIClient) sfs.ApiListResourcePoolSnapshotsRequest { + req := apiClient.ListResourcePoolSnapshots(ctx, model.ProjectId, model.Region, model.ResourcePoolId) + return req +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ResourcePoolId: flags.FlagToStringValue(p, cmd, resourcePoolIdFlag), + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, resp []sfs.ResourcePoolSnapshot) error { + return p.OutputResult(outputFormat, resp, func() error { + if len(resp) == 0 { + p.Outputln("No snapshots found") + return nil + } + table := tables.NewTable() + table.SetHeader( + "NAME", + "COMMENT", + "RESOURCE POOL ID", + "SIZE (GB)", + "LOGICAL SIZE (GB)", + "CREATED AT", + ) + + for _, snap := range resp { + var comment string + if snap.Comment != nil { + comment = utils.PtrString(snap.Comment.Get()) + } + table.AddRow( + utils.PtrString(snap.SnapshotName), + comment, + utils.PtrString(snap.ResourcePoolId), + utils.PtrString(snap.SizeGigabytes), + utils.PtrString(snap.LogicalSizeGigabytes), + utils.ConvertTimePToDateTimeString(snap.CreatedAt), + ) + } + + p.Outputln(table.Render()) + return nil + }) +} diff --git a/internal/cmd/beta/sfs/snapshot/list/list_test.go b/internal/cmd/beta/sfs/snapshot/list/list_test.go new file mode 100644 index 000000000..3c63ed05c --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/list/list_test.go @@ -0,0 +1,173 @@ +package list + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +var projectIdFlag = globalflags.ProjectIdFlag +var regionFlag = globalflags.RegionFlag + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &sfs.APIClient{} + +var testProjectId = uuid.NewString() +var testRegion = "eu01" + +var testResourcePoolId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + projectIdFlag: testProjectId, + regionFlag: testRegion, + + resourcePoolIdFlag: testResourcePoolId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + ResourcePoolId: testResourcePoolId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *sfs.ApiListResourcePoolSnapshotsRequest)) sfs.ApiListResourcePoolSnapshotsRequest { + request := testClient.ListResourcePoolSnapshots(testCtx, testProjectId, testRegion, testResourcePoolId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no flags", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "invalid resource pool id 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid resource pool id 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[resourcePoolIdFlag] = "invalid-resource-pool-id" + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest sfs.ApiListResourcePoolSnapshotsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + resp []sfs.ResourcePoolSnapshot + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "set empty response", + args: args{ + resp: []sfs.ResourcePoolSnapshot{}, + }, + wantErr: false, + }, + { + name: "set empty snapshot", + args: args{ + resp: []sfs.ResourcePoolSnapshot{{}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/sfs/snapshot/snapshot.go b/internal/cmd/beta/sfs/snapshot/snapshot.go new file mode 100644 index 000000000..aab304c52 --- /dev/null +++ b/internal/cmd/beta/sfs/snapshot/snapshot.go @@ -0,0 +1,32 @@ +package snapshot + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs/snapshot/list" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "snapshot", + Short: "Provides functionality for SFS snapshots", + Long: "Provides functionality for SFS snapshots.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) +} diff --git a/internal/cmd/config/profile/import/template/profile.json b/internal/cmd/config/profile/import/template/profile.json index dbc0bad02..fd14150d7 100644 --- a/internal/cmd/config/profile/import/template/profile.json +++ b/internal/cmd/config/profile/import/template/profile.json @@ -26,6 +26,7 @@ "service_account_custom_endpoint": "", "service_enablement_custom_endpoint": "", "session_time_limit": "12h", + "sfs_custom_endpoint": "", "ske_custom_endpoint": "", "sqlserverflex_custom_endpoint": "", "token_custom_endpoint": "", diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index b23fbba9b..cf81c4906 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -49,6 +49,7 @@ const ( iaasCustomEndpointFlag = "iaas-custom-endpoint" tokenCustomEndpointFlag = "token-custom-endpoint" intakeCustomEndpointFlag = "intake-custom-endpoint" + sfsCustomEndpointFlag = "sfs-custom-endpoint" ) type inputModel struct { @@ -164,6 +165,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(iaasCustomEndpointFlag, "", "IaaS API base URL, used in calls to this API") cmd.Flags().String(tokenCustomEndpointFlag, "", "Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication.") cmd.Flags().String(intakeCustomEndpointFlag, "", "Intake API base URL, used in calls to this API") + cmd.Flags().String(sfsCustomEndpointFlag, "", "SFS API base URL, used in calls to this API") err := viper.BindPFlag(config.SessionTimeLimitKey, cmd.Flags().Lookup(sessionTimeLimitFlag)) cobra.CheckErr(err) @@ -224,6 +226,8 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) err = viper.BindPFlag(config.IntakeCustomEndpointKey, cmd.Flags().Lookup(intakeCustomEndpointFlag)) cobra.CheckErr(err) + err = viper.BindPFlag(config.SfsCustomEndpointKey, cmd.Flags().Lookup(sfsCustomEndpointFlag)) + cobra.CheckErr(err) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index a269e867b..a3ce21e73 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -48,6 +48,7 @@ const ( serverBackupCustomEndpointFlag = "serverbackup-custom-endpoint" serverOsUpdateCustomEndpointFlag = "server-osupdate-custom-endpoint" runCommandCustomEndpointFlag = "runcommand-custom-endpoint" + sfsCustomEndpointFlag = "sfs-custom-endpoint" skeCustomEndpointFlag = "ske-custom-endpoint" sqlServerFlexCustomEndpointFlag = "sqlserverflex-custom-endpoint" iaasCustomEndpointFlag = "iaas-custom-endpoint" @@ -87,6 +88,7 @@ type inputModel struct { RunCommandCustomEndpoint bool ServiceAccountCustomEndpoint bool ServiceEnablementCustomEndpoint bool + SfsCustomEndpoint bool SKECustomEndpoint bool SQLServerFlexCustomEndpoint bool IaaSCustomEndpoint bool @@ -218,6 +220,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.IntakeCustomEndpoint { viper.Set(config.IntakeCustomEndpointKey, "") } + if model.SfsCustomEndpoint { + viper.Set(config.SfsCustomEndpointKey, "") + } err := config.Write() if err != nil { @@ -267,6 +272,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(iaasCustomEndpointFlag, false, "IaaS API base URL. If unset, uses the default base URL") cmd.Flags().Bool(tokenCustomEndpointFlag, false, "Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication.") cmd.Flags().Bool(intakeCustomEndpointFlag, false, "Intake API base URL. If unset, uses the default base URL") + cmd.Flags().Bool(sfsCustomEndpointFlag, false, "SFS API base URL. If unset, uses the default base URL") } func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { @@ -303,6 +309,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { ServerOsUpdateCustomEndpoint: flags.FlagToBoolValue(p, cmd, serverOsUpdateCustomEndpointFlag), RunCommandCustomEndpoint: flags.FlagToBoolValue(p, cmd, runCommandCustomEndpointFlag), SKECustomEndpoint: flags.FlagToBoolValue(p, cmd, skeCustomEndpointFlag), + SfsCustomEndpoint: flags.FlagToBoolValue(p, cmd, sfsCustomEndpointFlag), SQLServerFlexCustomEndpoint: flags.FlagToBoolValue(p, cmd, sqlServerFlexCustomEndpointFlag), IaaSCustomEndpoint: flags.FlagToBoolValue(p, cmd, iaasCustomEndpointFlag), TokenCustomEndpoint: flags.FlagToBoolValue(p, cmd, tokenCustomEndpointFlag), diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index c356af35b..4ebb6cde7 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -40,6 +40,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool serverBackupCustomEndpointFlag: true, serverOsUpdateCustomEndpointFlag: true, runCommandCustomEndpointFlag: true, + sfsCustomEndpointFlag: true, skeCustomEndpointFlag: true, sqlServerFlexCustomEndpointFlag: true, iaasCustomEndpointFlag: true, @@ -81,6 +82,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { ServerBackupCustomEndpoint: true, ServerOsUpdateCustomEndpoint: true, RunCommandCustomEndpoint: true, + SfsCustomEndpoint: true, SKECustomEndpoint: true, SQLServerFlexCustomEndpoint: true, IaaSCustomEndpoint: true, @@ -138,6 +140,7 @@ func TestParseInput(t *testing.T) { model.ServerBackupCustomEndpoint = false model.ServerOsUpdateCustomEndpoint = false model.RunCommandCustomEndpoint = false + model.SfsCustomEndpoint = false model.SKECustomEndpoint = false model.SQLServerFlexCustomEndpoint = false model.IaaSCustomEndpoint = false @@ -245,6 +248,16 @@ func TestParseInput(t *testing.T) { model.ServiceAccountCustomEndpoint = false }), }, + { + description: "sfs custom endpoint empty", + flagValues: fixtureFlagValues(func(flagValues map[string]bool) { + flagValues[sfsCustomEndpointFlag] = false + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.SfsCustomEndpoint = false + }), + }, { description: "ske custom endpoint empty", flagValues: fixtureFlagValues(func(flagValues map[string]bool) { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 68ca2ee8c..03170f650 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -43,6 +43,7 @@ const ( ServerBackupCustomEndpointKey = "serverbackup_custom_endpoint" ServerOsUpdateCustomEndpointKey = "serverosupdate_custom_endpoint" RunCommandCustomEndpointKey = "runcommand_custom_endpoint" + SfsCustomEndpointKey = "sfs_custom_endpoint" SKECustomEndpointKey = "ske_custom_endpoint" SQLServerFlexCustomEndpointKey = "sqlserverflex_custom_endpoint" IaaSCustomEndpointKey = "iaas_custom_endpoint" diff --git a/internal/pkg/config/template/test_profile.json b/internal/pkg/config/template/test_profile.json index dbc0bad02..fd14150d7 100644 --- a/internal/pkg/config/template/test_profile.json +++ b/internal/pkg/config/template/test_profile.json @@ -26,6 +26,7 @@ "service_account_custom_endpoint": "", "service_enablement_custom_endpoint": "", "session_time_limit": "12h", + "sfs_custom_endpoint": "", "ske_custom_endpoint": "", "sqlserverflex_custom_endpoint": "", "token_custom_endpoint": "", diff --git a/internal/pkg/services/sfs/client/client.go b/internal/pkg/services/sfs/client/client.go new file mode 100644 index 000000000..3dc2ef801 --- /dev/null +++ b/internal/pkg/services/sfs/client/client.go @@ -0,0 +1,14 @@ +package client + +import ( + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + + "github.com/spf13/viper" +) + +func ConfigureClient(p *print.Printer, cliVersion string) (*sfs.APIClient, error) { + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.SfsCustomEndpointKey), false, genericclient.CreateApiClient[*sfs.APIClient](sfs.NewAPIClient)) +} diff --git a/internal/pkg/services/sfs/utils/utils.go b/internal/pkg/services/sfs/utils/utils.go new file mode 100644 index 000000000..2507a512e --- /dev/null +++ b/internal/pkg/services/sfs/utils/utils.go @@ -0,0 +1,47 @@ +package utils + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +type SfsClient interface { + GetShareExportPolicyExecute(ctx context.Context, projectId string, region string, policyId string) (*sfs.GetShareExportPolicyResponse, error) + GetShareExecute(ctx context.Context, projectId, region, resourcePoolId, shareId string) (*sfs.GetShareResponse, error) + GetResourcePoolExecute(ctx context.Context, projectId, region, resourcePoolId string) (*sfs.GetResourcePoolResponse, error) +} + +func GetShareName(ctx context.Context, client SfsClient, projectId, region, resourcePoolId, shareId string) (string, error) { + resp, err := client.GetShareExecute(ctx, projectId, region, resourcePoolId, shareId) + if err != nil { + return "", fmt.Errorf("get share: %w", err) + } + if resp != nil && resp.Share != nil && resp.Share.Name != nil { + return *resp.Share.Name, nil + } + return "", nil +} + +func GetExportPolicyName(ctx context.Context, apiClient SfsClient, projectId, region, policyId string) (string, error) { + resp, err := apiClient.GetShareExportPolicyExecute(ctx, projectId, region, policyId) + if err != nil { + return "", fmt.Errorf("get share export policy: %w", err) + } + if resp != nil && resp.ShareExportPolicy != nil && resp.ShareExportPolicy.Name != nil { + return *resp.ShareExportPolicy.Name, nil + } + return "", nil +} + +func GetResourcePoolName(ctx context.Context, client SfsClient, projectId, region, resourcePoolId string) (string, error) { + resp, err := client.GetResourcePoolExecute(ctx, projectId, region, resourcePoolId) + if err != nil { + return "", fmt.Errorf("get resource pool: %w", err) + } + if resp != nil && resp.ResourcePool != nil && resp.ResourcePool.Name != nil { + return *resp.ResourcePool.Name, nil + } + return "", nil +} diff --git a/internal/pkg/services/sfs/utils/utils_test.go b/internal/pkg/services/sfs/utils/utils_test.go new file mode 100644 index 000000000..de4dbe11f --- /dev/null +++ b/internal/pkg/services/sfs/utils/utils_test.go @@ -0,0 +1,206 @@ +package utils + +import ( + "context" + "fmt" + "testing" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" +) + +const ( + testShareName = "share-name" + testResourcePoolName = "resource-pool-name" + testExportPolicyName = "export-policy-name" + testSnapshotName = "snapshot-name" + testRegion = "eu01" +) + +var ( + testPolicyId = uuid.NewString() + testProjectId = uuid.NewString() +) + +type sfsClientMocked struct { + getShareFails bool + getShareResp *sfs.GetShareResponse + getResourcePoolFails bool + getResourcePoolResp *sfs.GetResourcePoolResponse + getExportPolicyFails bool + getExportPolicyResp *sfs.GetShareExportPolicyResponse +} + +func (s *sfsClientMocked) GetShareExecute(_ context.Context, _, _, _, _ string) (*sfs.GetShareResponse, error) { + if s.getShareFails { + return nil, fmt.Errorf("could not get share") + } + return s.getShareResp, nil +} + +func (s *sfsClientMocked) GetResourcePoolExecute(_ context.Context, _, _, _ string) (*sfs.GetResourcePoolResponse, error) { + if s.getResourcePoolFails { + return nil, fmt.Errorf("could not get resource pool") + } + return s.getResourcePoolResp, nil +} + +func (s *sfsClientMocked) GetShareExportPolicyExecute(_ context.Context, _, _, _ string) (*sfs.GetShareExportPolicyResponse, error) { + if s.getExportPolicyFails { + return nil, fmt.Errorf("could not get export policy") + } + return s.getExportPolicyResp, nil +} + +func TestGetExportPolicyName(t *testing.T) { + tests := []struct { + description string + getExportPolicyResp *sfs.GetShareExportPolicyResponse + getExportPolicyFails bool + isValid bool + expectedOutput string + }{ + { + description: "base", + getExportPolicyResp: &sfs.GetShareExportPolicyResponse{ + ShareExportPolicy: &sfs.GetShareExportPolicyResponseShareExportPolicy{ + Name: utils.Ptr(testExportPolicyName), + }, + }, + isValid: true, + expectedOutput: testExportPolicyName, + }, + { + description: "get export policy fails", + getExportPolicyFails: true, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &sfsClientMocked{ + getExportPolicyFails: tt.getExportPolicyFails, + getExportPolicyResp: tt.getExportPolicyResp, + } + + output, err := GetExportPolicyName(context.Background(), client, testProjectId, testRegion, testPolicyId) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input") + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %s, got %s", tt.expectedOutput, output) + } + }) + } +} + +func TestGetShareName(t *testing.T) { + tests := []struct { + description string + getShareResp *sfs.GetShareResponse + getShareFails bool + isValid bool + expectedOutput string + }{ + { + description: "base", + getShareResp: &sfs.GetShareResponse{ + Share: &sfs.GetShareResponseShare{ + Name: utils.Ptr(testShareName), + }, + }, + isValid: true, + expectedOutput: testShareName, + }, + { + description: "get share fails", + getShareFails: true, + isValid: false, + expectedOutput: "", + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &sfsClientMocked{ + getShareFails: tt.getShareFails, + getShareResp: tt.getShareResp, + } + + output, err := GetShareName(context.Background(), client, testProjectId, testRegion, "", "") + + if tt.isValid && err != nil { + t.Errorf("failed on valid input") + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %s, got %s", tt.expectedOutput, output) + } + }) + } +} + +func TestGetResourcePoolName(t *testing.T) { + tests := []struct { + description string + getResourcePoolResp *sfs.GetResourcePoolResponse + getResourcePoolFails bool + isValid bool + expectedOutput string + }{ + { + description: "base", + getResourcePoolResp: &sfs.GetResourcePoolResponse{ + ResourcePool: &sfs.GetResourcePoolResponseResourcePool{ + Name: utils.Ptr(testResourcePoolName), + }, + }, + isValid: true, + expectedOutput: testResourcePoolName, + }, + { + description: "get resource pool fails", + getResourcePoolFails: true, + isValid: false, + expectedOutput: "", + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &sfsClientMocked{ + getResourcePoolResp: tt.getResourcePoolResp, + getResourcePoolFails: tt.getResourcePoolFails, + } + + output, err := GetResourcePoolName(context.Background(), client, testProjectId, testRegion, "") + + if tt.isValid && err != nil { + t.Errorf("failed on valid input") + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %s, got %s", tt.expectedOutput, output) + } + }) + } +} diff --git a/internal/pkg/testutils/options.go b/internal/pkg/testutils/options.go new file mode 100644 index 000000000..03d6dab2a --- /dev/null +++ b/internal/pkg/testutils/options.go @@ -0,0 +1,16 @@ +package testutils + +import "github.com/google/go-cmp/cmp" + +type Option struct { + cmpOptions []cmp.Option +} + +type TestingOption func(options *Option) error + +func WithCmpOptions(cmpOptions ...cmp.Option) TestingOption { + return func(options *Option) error { + options.cmpOptions = append(options.cmpOptions, cmpOptions...) + return nil + } +} diff --git a/internal/pkg/testutils/testutils.go b/internal/pkg/testutils/testutils.go index f9ac93524..1a045cfbf 100644 --- a/internal/pkg/testutils/testutils.go +++ b/internal/pkg/testutils/testutils.go @@ -19,6 +19,19 @@ func TestParseInput[T any](t *testing.T, cmdFactory func(*types.CmdParams) *cobr // TestParseInputWithAdditionalFlags centralizes the logic to test a combination of inputs (arguments, flags) for a cobra command. // It allows to pass multiple instances of a single flag to the cobra command using the `additionalFlagValues` parameter. func TestParseInputWithAdditionalFlags[T any](t *testing.T, cmdFactory func(*types.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, additionalFlagValues map[string][]string, isValid bool) { + TestParseInputWithOptions(t, cmdFactory, parseInputFunc, expectedModel, argValues, flagValues, additionalFlagValues, isValid, nil) +} + +func TestParseInputWithOptions[T any](t *testing.T, cmdFactory func(*types.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, additionalFlagValues map[string][]string, isValid bool, testingOptions []TestingOption) { + opts := Option{} + for _, option := range testingOptions { + err := option(&opts) + if err != nil { + t.Errorf("Configuring testing options: %v", err) + return + } + } + p := print.NewPrinter() cmd := cmdFactory(&types.CmdParams{Printer: p}) err := globalflags.Configure(cmd.Flags()) @@ -85,7 +98,7 @@ func TestParseInputWithAdditionalFlags[T any](t *testing.T, cmdFactory func(*typ if !isValid { t.Fatalf("did not fail on invalid input") } - diff := cmp.Diff(model, expectedModel) + diff := cmp.Diff(model, expectedModel, opts.cmpOptions...) if diff != "" { t.Fatalf("Data does not match: %s", diff) } From 0e1ade048cdf0c18ebd4ceed75a9ba1a15b2e726 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:37:03 +0100 Subject: [PATCH 295/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#1198) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 79cf8ba04..1735cb211 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 diff --git a/go.sum b/go.sum index d87994781..92e6796ff 100644 --- a/go.sum +++ b/go.sum @@ -620,8 +620,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+Ft github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4 h1:4LA0Mw7Y8swLRQBvQ/JRv1fUSlnrIHilWklX4v3SZ0A= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.4/go.mod h1:G/UD3tzPzzu79MiFWUYqogxdLMB+YArNHR6Yqz7Cqr0= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5 h1:tPISli81nuvLc5DPqgpvYPSjTySV0wXtMtkfdNXG4CU= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5/go.mod h1:G/UD3tzPzzu79MiFWUYqogxdLMB+YArNHR6Yqz7Cqr0= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 h1:nsC6oA1whA4ibxEuD+0Osngmnpz8dLdV6bv+9jYP4Eo= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2/go.mod h1:WA6QlAAQ8aaw81W0VSVoDrxOfchGkdtmn2jQL/ub/50= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= From c7dada1356cdf675d1384e4f0cc945b3505ae59e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:46:13 +0000 Subject: [PATCH 296/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex (#1200) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1735cb211..ae7b1e7d3 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.31.0 golang.org/x/oauth2 v0.34.0 diff --git a/go.sum b/go.sum index 92e6796ff..e968f4abe 100644 --- a/go.sum +++ b/go.sum @@ -652,8 +652,8 @@ github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 h1:DRp1p0Gb1YZSnFXgki github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0/go.mod h1:XHOtGgBwwCqPSoQt2ojIRb/BeOd4kICwb9RuMXXFGt8= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 h1:HVlBylGwXVR3qDUGwUMqofAcLEawRaWSgeYXbyAcN1E= github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4 h1:IUhMJH9fQ+CaMas+5bbnrH7m1Hadf1vWoUtu9KeAEFM= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.3.4/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 h1:KgIRTw4gpxx8qoiaLGLbXPVDcBgCxPl60gigw+tizYc= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From 68b9c01b55bef7a5f52956fed66b81d0f614ad90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 08:05:12 +0100 Subject: [PATCH 297/422] chore(deps): bump github.com/jedib0t/go-pretty/v6 from 6.7.7 to 6.7.8 (#1206) Bumps [github.com/jedib0t/go-pretty/v6](https://github.com/jedib0t/go-pretty) from 6.7.7 to 6.7.8. - [Release notes](https://github.com/jedib0t/go-pretty/releases) - [Commits](https://github.com/jedib0t/go-pretty/compare/v6.7.7...v6.7.8) --- updated-dependencies: - dependency-name: github.com/jedib0t/go-pretty/v6 dependency-version: 6.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ae7b1e7d3..b85766caa 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf - github.com/jedib0t/go-pretty/v6 v6.7.7 + github.com/jedib0t/go-pretty/v6 v6.7.8 github.com/lmittmann/tint v1.1.2 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.2 diff --git a/go.sum b/go.sum index e968f4abe..1b883da1c 100644 --- a/go.sum +++ b/go.sum @@ -371,8 +371,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s= github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4= -github.com/jedib0t/go-pretty/v6 v6.7.7 h1:Y1Id3lJ3k4UB8uwWWy3l8EVFnUlx5chR5+VbsofPNX0= -github.com/jedib0t/go-pretty/v6 v6.7.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.8 h1:BVYrDy5DPBA3Qn9ICT+PokP9cvCv1KaHv2i+Hc8sr5o= +github.com/jedib0t/go-pretty/v6 v6.7.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4= github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako= github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= From c1f2d3b504cac03864d561de0e63997d1d3e252d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jan 2026 07:14:11 +0000 Subject: [PATCH 298/422] chore(deps): bump renovatebot/github-action from 44.2.0 to 44.2.3 (#1209) Bumps [renovatebot/github-action](https://github.com/renovatebot/github-action) from 44.2.0 to 44.2.3. - [Release notes](https://github.com/renovatebot/github-action/releases) - [Changelog](https://github.com/renovatebot/github-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/renovatebot/github-action/compare/v44.2.0...v44.2.3) --- updated-dependencies: - dependency-name: renovatebot/github-action dependency-version: 44.2.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index d0c4954cf..4716838ca 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.2.0 + uses: renovatebot/github-action@v44.2.3 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From 42aa2c641af73e26ea4f2c19c16a45cc1b79626c Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 7 Jan 2026 09:19:22 +0100 Subject: [PATCH 299/422] fix(deps): update stackit sdk modules (#1208) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b85766caa..a5d9ac196 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 @@ -261,7 +261,7 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2 + github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 diff --git a/go.sum b/go.sum index 1b883da1c..4f2a3b049 100644 --- a/go.sum +++ b/go.sum @@ -602,8 +602,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98e github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 h1:DqRtyuIb34/x9C3/sT7Uz5xrD0TQOL3ERnDOS1gst4E= github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1 h1:Z7K6CfjbWSAzFbAXFzxefRBap/dujpK2TZgJqBUZ8NQ= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.10.1/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= @@ -612,8 +612,8 @@ 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/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u+YU3brMhQwYZYxu809o3uW5SH4HA= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2 h1:YsgqwU+qc+AL5yOaXIb/Va3ANAjXDnSJtIflZ6EeM0w= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.1.2/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1R+fL5aX5nEoxL6ODVJl3emzho= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2 h1:DwwRMzvnKWTbfmLvq2xe+mYhv5fA1AwWdQGznI05sGc= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= From f0446b49dcedfd8ac05406685c191013875cd9e7 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:24:25 +0100 Subject: [PATCH 300/422] fix(deps): update module github.com/goccy/go-yaml to v1.19.2 (#1210) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a5d9ac196..abbfb6be5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.24.0 require ( github.com/fatih/color v1.18.0 - github.com/goccy/go-yaml v1.19.1 + github.com/goccy/go-yaml v1.19.2 github.com/golang-jwt/jwt/v5 v5.3.0 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index 4f2a3b049..868cf2f9f 100644 --- a/go.sum +++ b/go.sum @@ -239,8 +239,8 @@ github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUW github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/goccy/go-yaml v1.19.1 h1:3rG3+v8pkhRqoQ/88NYNMHYVGYztCOCIZ7UQhu7H+NE= -github.com/goccy/go-yaml v1.19.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= +github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godoc-lint/godoc-lint v0.10.2 h1:dksNgK+zebnVlj4Fx83CRnCmPO0qRat/9xfFsir1nfg= From 28776d6baf091856224d9f002390fefe7a67dbe4 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Thu, 8 Jan 2026 07:30:48 +0100 Subject: [PATCH 301/422] chore(deps): update module github.com/golangci/golangci-lint/v2 to v2.8.0 (#1211) Co-authored-by: Renovate Bot --- go.mod | 25 +++++++++++++------------ go.sum | 54 ++++++++++++++++++++++++++++-------------------------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/go.mod b/go.mod index abbfb6be5..f0f6cd79e 100644 --- a/go.mod +++ b/go.mod @@ -54,6 +54,7 @@ require ( 4d63.com/gochecknoglobals v0.2.2 // indirect al.essio.dev/pkg/shellescape v1.5.1 // indirect codeberg.org/chavacava/garif v0.2.0 // indirect + codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect dev.gaijin.team/go/golib v0.6.0 // indirect github.com/4meepo/tagalign v1.4.3 // indirect @@ -63,15 +64,15 @@ require ( github.com/Antonboom/errname v1.1.1 // indirect github.com/Antonboom/nilnil v1.1.1 // indirect github.com/Antonboom/testifylint v1.6.4 // indirect - github.com/BurntSushi/toml v1.5.0 // indirect + github.com/BurntSushi/toml v1.6.0 // indirect github.com/Djarvur/go-err113 v0.1.1 // indirect github.com/Masterminds/semver/v3 v3.4.0 // indirect - github.com/MirrexOne/unqueryvet v1.3.0 // indirect + github.com/MirrexOne/unqueryvet v1.4.0 // indirect github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect - github.com/alecthomas/chroma/v2 v2.20.0 // indirect + github.com/alecthomas/chroma/v2 v2.21.1 // indirect github.com/alecthomas/go-check-sumtype v0.3.1 // indirect github.com/alexkohler/nakedret/v2 v2.0.6 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alexkohler/prealloc v1.0.1 // indirect github.com/alfatraining/structtag v1.0.0 // indirect github.com/alingse/asasalint v0.0.11 // indirect github.com/alingse/nilnesserr v0.2.0 // indirect @@ -107,8 +108,8 @@ require ( github.com/firefart/nonamedreturns v1.0.6 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghostiam/protogetter v0.3.17 // indirect - github.com/go-critic/go-critic v0.14.2 // indirect + github.com/ghostiam/protogetter v0.3.18 // indirect + github.com/go-critic/go-critic v0.14.3 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.2.0 // indirect @@ -119,15 +120,15 @@ require ( github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/godoc-lint/godoc-lint v0.10.2 // indirect + github.com/godoc-lint/godoc-lint v0.11.1 // indirect github.com/gofrs/flock v0.13.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect github.com/golangci/go-printf-func-name v0.1.1 // indirect github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect - github.com/golangci/golangci-lint/v2 v2.7.2 // indirect - github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect + github.com/golangci/golangci-lint/v2 v2.8.0 // indirect + github.com/golangci/golines v0.14.0 // indirect github.com/golangci/misspell v0.7.0 // indirect github.com/golangci/plugin-module-register v0.1.2 // indirect github.com/golangci/revgrep v0.8.0 // indirect @@ -153,8 +154,9 @@ require ( github.com/kunwardeep/paralleltest v1.0.15 // indirect github.com/lasiar/canonicalheader v1.1.2 // indirect github.com/ldez/exptostd v0.4.5 // indirect - github.com/ldez/gomoddirectives v0.7.1 // indirect + github.com/ldez/gomoddirectives v0.8.0 // indirect github.com/ldez/grignotin v0.10.1 // indirect + github.com/ldez/structtags v0.6.1 // indirect github.com/ldez/tagliatelle v0.7.2 // indirect github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect @@ -177,7 +179,6 @@ require ( github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.21.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/polyfloyd/go-errorlint v1.8.0 // indirect github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.32.1 // indirect @@ -195,7 +196,7 @@ require ( github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect - github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7 // indirect + github.com/securego/gosec/v2 v2.22.11 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/sonatard/noctx v0.4.0 // indirect diff --git a/go.sum b/go.sum index 868cf2f9f..107ac4d61 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY= codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ= +codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI= +codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8= dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo= @@ -58,25 +60,25 @@ github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ= github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= -github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g= github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/MirrexOne/unqueryvet v1.3.0 h1:5slWSomgqpYU4zFuZ3NNOfOUxVPlXFDBPAVasZOGlAY= -github.com/MirrexOne/unqueryvet v1.3.0/go.mod h1:IWwCwMQlSWjAIteW0t+28Q5vouyktfujzYznSIWiuOg= +github.com/MirrexOne/unqueryvet v1.4.0 h1:6KAkqqW2KUnkl9Z0VuTphC3IXRPoFqEkJEtyxxHj5eQ= +github.com/MirrexOne/unqueryvet v1.4.0/go.mod h1:IWwCwMQlSWjAIteW0t+28Q5vouyktfujzYznSIWiuOg= github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/chroma/v2 v2.20.0 h1:sfIHpxPyR07/Oylvmcai3X/exDlE8+FA820NTz+9sGw= -github.com/alecthomas/chroma/v2 v2.20.0/go.mod h1:e7tViK0xh/Nf4BYHl00ycY6rV7b8iXBksI9E359yNmA= +github.com/alecthomas/chroma/v2 v2.21.1 h1:FaSDrp6N+3pphkNKU6HPCiYLgm8dbe5UXIXcoBhZSWA= +github.com/alecthomas/chroma/v2 v2.21.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o= github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= -github.com/alecthomas/repr v0.5.1 h1:E3G4t2QbHTSNpPKBgMTln5KLkZHLOcU7r37J4pXBuIg= -github.com/alecthomas/repr v0.5.1/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs= +github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -84,8 +86,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alexkohler/prealloc v1.0.1 h1:A9P1haqowqUxWvU9nk6tQ7YktXIHf+LQM9wPRhuteEE= +github.com/alexkohler/prealloc v1.0.1/go.mod h1:fT39Jge3bQrfA7nPMDngUfvUbQGQeJyGQnR+913SCig= github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc= github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= @@ -188,10 +190,10 @@ github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sa github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghostiam/protogetter v0.3.17 h1:sjGPErP9o7i2Ym+z3LsQzBdLCNaqbYy2iJQPxGXg04Q= -github.com/ghostiam/protogetter v0.3.17/go.mod h1:AivIX1eKA/TcUmzZdzbl+Tb8tjIe8FcyG6JFyemQAH4= -github.com/go-critic/go-critic v0.14.2 h1:PMvP5f+LdR8p6B29npvChUXbD1vrNlKDf60NJtgMBOo= -github.com/go-critic/go-critic v0.14.2/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= +github.com/ghostiam/protogetter v0.3.18 h1:yEpghRGtP9PjKvVXtEzGpYfQj1Wl/ZehAfU6fr62Lfo= +github.com/ghostiam/protogetter v0.3.18/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI= +github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog= +github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -243,8 +245,8 @@ github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godoc-lint/godoc-lint v0.10.2 h1:dksNgK+zebnVlj4Fx83CRnCmPO0qRat/9xfFsir1nfg= -github.com/godoc-lint/godoc-lint v0.10.2/go.mod h1:KleLcHu/CGSvkjUH2RvZyoK1MBC7pDQg4NxMYLcBBsw= +github.com/godoc-lint/godoc-lint v0.11.1 h1:z9as8Qjiy6miRIa3VRymTa+Gt2RLnGICVikcvlUVOaA= +github.com/godoc-lint/godoc-lint v0.11.1/go.mod h1:BAqayheFSuZrEAqCRxgw9MyvsM+S/hZwJbU1s/ejRj8= github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -289,10 +291,10 @@ github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarog github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= -github.com/golangci/golangci-lint/v2 v2.7.2 h1:AhBC+YeEueec4AGlIbvPym5C70Thx0JykIqXbdIXWx0= -github.com/golangci/golangci-lint/v2 v2.7.2/go.mod h1:pDijleoBu7e8sejMqyZ3L5n6geqe+cVvOAz2QImqqVc= -github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8= -github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ= +github.com/golangci/golangci-lint/v2 v2.8.0 h1:wJnr3hJWY3eVzOUcfwbDc2qbi2RDEpvLmQeNFaPSNYA= +github.com/golangci/golangci-lint/v2 v2.8.0/go.mod h1:xl+HafQ9xoP8rzw0z5AwnO5kynxtb80e8u02Ej/47RI= +github.com/golangci/golines v0.14.0 h1:xt9d3RKBjhasA3qpoXs99J2xN2t6eBlpLHt0TrgyyXc= +github.com/golangci/golines v0.14.0/go.mod h1:gf555vPG2Ia7mmy2mzmhVQbVjuK8Orw0maR1G4vVAAQ= github.com/golangci/misspell v0.7.0 h1:4GOHr/T1lTW0hhR4tgaaV1WS/lJ+ncvYCoFKmqJsj0c= github.com/golangci/misspell v0.7.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg= github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg= @@ -419,10 +421,12 @@ github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0 github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= -github.com/ldez/gomoddirectives v0.7.1 h1:FaULkvUIG36hj6chpwa+FdCNGZBsD7/fO+p7CCsM6pE= -github.com/ldez/gomoddirectives v0.7.1/go.mod h1:auDNtakWJR1rC+YX7ar+HmveqXATBAyEK1KYpsIRW/8= +github.com/ldez/gomoddirectives v0.8.0 h1:JqIuTtgvFC2RdH1s357vrE23WJF2cpDCPFgA/TWDGpk= +github.com/ldez/gomoddirectives v0.8.0/go.mod h1:jutzamvZR4XYJLr0d5Honycp4Gy6GEg2mS9+2YX3F1Q= github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o= github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas= +github.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk= +github.com/ldez/structtags v0.6.1/go.mod h1:YDxVSgDy/MON6ariaxLF2X09bh19qL7MtGBN5MrvbdY= github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk= github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI= github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc= @@ -505,8 +509,6 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= -github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -565,8 +567,8 @@ github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tM github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= -github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7 h1:rZg6IGn0ySYZwCX8LHwZoYm03JhG/cVAJJ3O+u3Vclo= -github.com/securego/gosec/v2 v2.22.11-0.20251204091113-daccba6b93d7/go.mod h1:9sr22NZO5Kfh7unW/xZxkGYTmj2484/fCiE54gw7UTY= +github.com/securego/gosec/v2 v2.22.11 h1:tW+weM/hCM/GX3iaCV91d5I6hqaRT2TPsFM1+USPXwg= +github.com/securego/gosec/v2 v2.22.11/go.mod h1:KE4MW/eH0GLWztkbt4/7XpyH0zJBBnu7sYB4l6Wn7Mw= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= From 62b8c64e27d28705b8e66f1817c57c1fb0266a1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jan 2026 18:28:19 +0100 Subject: [PATCH 302/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1215) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f0f6cd79e..782ee892f 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 diff --git a/go.sum b/go.sum index 107ac4d61..95d3df2a9 100644 --- a/go.sum +++ b/go.sum @@ -602,8 +602,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3 h1:DqRtyuIb34/x9C3/sT7Uz5xrD0TQOL3ERnDOS1gst4E= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.7.3/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 h1:RJBgbgZ4w7/e++n7pPTiCwFivll9RHovb4BfR/9CzlA= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= From 6ea5c939c4d0d0d7870a2b38df5cd109f666b1d7 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 12 Jan 2026 07:25:54 +0100 Subject: [PATCH 303/422] fix(deps): update module golang.org/x/mod to v0.32.0 (#1218) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 782ee892f..8a1b31b54 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.31.0 + golang.org/x/mod v0.32.0 golang.org/x/oauth2 v0.34.0 golang.org/x/term v0.38.0 golang.org/x/text v0.32.0 diff --git a/go.sum b/go.sum index 95d3df2a9..14c31a3cc 100644 --- a/go.sum +++ b/go.sum @@ -794,8 +794,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -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.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 4a30332e961b4afd274a3e7f2f6099f16f54659b Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 12 Jan 2026 07:31:49 +0100 Subject: [PATCH 304/422] fix(deps): update module golang.org/x/term to v0.39.0 (#1219) Co-authored-by: Renovate Bot --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 8a1b31b54..40dd1810c 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.32.0 golang.org/x/oauth2 v0.34.0 - golang.org/x/term v0.38.0 + golang.org/x/term v0.39.0 golang.org/x/text v0.32.0 k8s.io/apimachinery v0.34.2 k8s.io/client-go v0.34.2 @@ -272,7 +272,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 github.com/subosito/gotenv v1.6.0 // indirect - golang.org/x/sys v0.39.0 // indirect + golang.org/x/sys v0.40.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index 14c31a3cc..aecacbe58 100644 --- a/go.sum +++ b/go.sum @@ -911,8 +911,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -921,8 +921,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -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/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 8d9cdc46c6d9048afea4718f03cd021b0a513844 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Mon, 12 Jan 2026 08:48:19 +0100 Subject: [PATCH 305/422] fix(deps): update module golang.org/x/text to v0.33.0 (#1220) Co-authored-by: Renovate Bot --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 40dd1810c..617c54c23 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( golang.org/x/mod v0.32.0 golang.org/x/oauth2 v0.34.0 golang.org/x/term v0.39.0 - golang.org/x/text v0.32.0 + golang.org/x/text v0.33.0 k8s.io/apimachinery v0.34.2 k8s.io/client-go v0.34.2 ) diff --git a/go.sum b/go.sum index aecacbe58..e3a7f587a 100644 --- a/go.sum +++ b/go.sum @@ -933,8 +933,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -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/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From db45e4b3afa802b185e8dbe609db575b04526c44 Mon Sep 17 00:00:00 2001 From: Kai Kummerer <70690427+Kumm-Kai@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:39:01 +0100 Subject: [PATCH 306/422] fix(ske): add profile email to cacheKey on login (#1080) --- internal/cmd/ske/kubeconfig/login/login.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index 68775aed3..711ad56bd 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -19,6 +19,7 @@ import ( "k8s.io/client-go/rest" "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" @@ -150,20 +151,25 @@ func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, e if execCredential == nil || execCredential.Spec.Cluster == nil { return nil, fmt.Errorf("ExecCredential contains not all needed fields") } - config := &clusterConfig{} - err = json.Unmarshal(execCredential.Spec.Cluster.Config.Raw, config) + clusterConfig := &clusterConfig{} + err = json.Unmarshal(execCredential.Spec.Cluster.Config.Raw, clusterConfig) if err != nil { return nil, fmt.Errorf("unmarshal: %w", err) } - config.cacheKey = fmt.Sprintf("ske-login-%x", sha256.Sum256([]byte(execCredential.Spec.Cluster.Server))) + authEmail, err := auth.GetAuthEmail() + if err != nil { + return nil, fmt.Errorf("error getting auth email: %w", err) + } + + clusterConfig.cacheKey = fmt.Sprintf("ske-login-%x", sha256.Sum256([]byte(execCredential.Spec.Cluster.Server+"\x00"+authEmail))) // NOTE: Fallback if region is not set in the kubeconfig (this was the case in the past) - if config.Region == "" { - config.Region = globalflags.Parse(p, cmd).Region + if clusterConfig.Region == "" { + clusterConfig.Region = globalflags.Parse(p, cmd).Region } - return config, nil + return clusterConfig, nil } func getCachedKubeConfig(key string) *rest.Config { From 1b5b0c6893c5e5f7b5335964f45e38f5265b69cb Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Mon, 12 Jan 2026 18:31:02 +0100 Subject: [PATCH 307/422] refactor(printer): move AssumeYes logic into printer itself (#1217) relates to STACKITCLI-286 --- internal/cmd/affinity-groups/create/create.go | 10 +++---- internal/cmd/affinity-groups/delete/delete.go | 10 +++---- internal/cmd/beta/alb/create/create.go | 10 +++---- internal/cmd/beta/alb/delete/delete.go | 10 +++---- .../alb/observability-credentials/add/add.go | 10 +++---- .../delete/delete.go | 10 +++---- .../update/update.go | 10 +++---- internal/cmd/beta/alb/pool/update/update.go | 10 +++---- internal/cmd/beta/alb/update/update.go | 10 +++---- .../cmd/beta/intake/runner/create/create.go | 10 +++---- .../cmd/beta/intake/runner/delete/delete.go | 10 +++---- internal/cmd/beta/kms/key/create/create.go | 8 +++--- internal/cmd/beta/kms/key/delete/delete.go | 10 +++---- .../cmd/beta/kms/key/importKey/importKey.go | 10 +++---- internal/cmd/beta/kms/key/restore/restore.go | 10 +++---- internal/cmd/beta/kms/key/rotate/rotate.go | 10 +++---- .../cmd/beta/kms/keyring/create/create.go | 8 +++--- .../cmd/beta/kms/keyring/delete/delete.go | 10 +++---- .../cmd/beta/kms/wrappingkey/create/create.go | 8 +++--- .../cmd/beta/kms/wrappingkey/delete/delete.go | 10 +++---- .../beta/sfs/export-policy/create/create.go | 10 +++---- .../beta/sfs/export-policy/delete/delete.go | 10 +++---- .../beta/sfs/export-policy/update/update.go | 10 +++---- .../beta/sfs/resource-pool/create/create.go | 10 +++---- .../beta/sfs/resource-pool/delete/delete.go | 10 +++---- .../beta/sfs/resource-pool/update/update.go | 10 +++---- internal/cmd/beta/sfs/share/create/create.go | 10 +++---- internal/cmd/beta/sfs/share/delete/delete.go | 10 +++---- internal/cmd/beta/sfs/share/update/update.go | 10 +++---- .../cmd/beta/sfs/snapshot/create/create.go | 10 +++---- .../cmd/beta/sfs/snapshot/delete/delete.go | 10 +++---- .../sqlserverflex/database/create/create.go | 10 +++---- .../sqlserverflex/database/delete/delete.go | 10 +++---- .../sqlserverflex/instance/create/create.go | 10 +++---- .../sqlserverflex/instance/delete/delete.go | 10 +++---- .../sqlserverflex/instance/update/update.go | 10 +++---- .../beta/sqlserverflex/user/create/create.go | 10 +++---- .../beta/sqlserverflex/user/delete/delete.go | 10 +++---- .../user/reset-password/reset_password.go | 10 +++---- internal/cmd/config/profile/delete/delete.go | 10 +++---- internal/cmd/dns/record-set/create/create.go | 10 +++---- internal/cmd/dns/record-set/delete/delete.go | 10 +++---- internal/cmd/dns/record-set/update/update.go | 10 +++---- internal/cmd/dns/zone/clone/clone.go | 10 +++---- internal/cmd/dns/zone/create/create.go | 10 +++---- internal/cmd/dns/zone/delete/delete.go | 10 +++---- internal/cmd/dns/zone/update/update.go | 10 +++---- internal/cmd/git/instance/create/create.go | 10 +++---- internal/cmd/git/instance/delete/delete.go | 10 +++---- internal/cmd/image/create/create.go | 10 +++---- internal/cmd/image/delete/delete.go | 10 +++---- internal/cmd/image/update/update.go | 10 +++---- internal/cmd/key-pair/create/create.go | 10 +++---- internal/cmd/key-pair/delete/delete.go | 10 +++---- internal/cmd/key-pair/update/update.go | 10 +++---- internal/cmd/load-balancer/create/create.go | 10 +++---- internal/cmd/load-balancer/delete/delete.go | 10 +++---- .../observability-credentials/add/add.go | 10 +++---- .../cleanup/cleanup.go | 26 +++++++++---------- .../delete/delete.go | 10 +++---- .../update/update.go | 10 +++---- .../target-pool/add-target/add_target.go | 10 +++---- .../remove-target/remove_target.go | 10 +++---- internal/cmd/load-balancer/update/update.go | 10 +++---- .../cmd/logme/credentials/create/create.go | 10 +++---- .../cmd/logme/credentials/delete/delete.go | 10 +++---- internal/cmd/logme/instance/create/create.go | 10 +++---- internal/cmd/logme/instance/delete/delete.go | 10 +++---- internal/cmd/logme/instance/update/update.go | 10 +++---- .../cmd/mariadb/credentials/create/create.go | 10 +++---- .../cmd/mariadb/credentials/delete/delete.go | 10 +++---- .../cmd/mariadb/instance/create/create.go | 10 +++---- .../cmd/mariadb/instance/delete/delete.go | 10 +++---- .../cmd/mariadb/instance/update/update.go | 10 +++---- .../cmd/mongodbflex/backup/restore/restore.go | 10 +++---- .../backup/update-schedule/update_schedule.go | 10 +++---- .../cmd/mongodbflex/instance/create/create.go | 10 +++---- .../cmd/mongodbflex/instance/delete/delete.go | 10 +++---- .../cmd/mongodbflex/instance/update/update.go | 10 +++---- .../cmd/mongodbflex/user/create/create.go | 10 +++---- .../cmd/mongodbflex/user/delete/delete.go | 10 +++---- .../user/reset-password/reset_password.go | 10 +++---- .../cmd/mongodbflex/user/update/update.go | 10 +++---- internal/cmd/network-area/create/create.go | 12 ++++----- internal/cmd/network-area/delete/delete.go | 10 +++---- .../network-range/create/create.go | 10 +++---- .../network-range/delete/delete.go | 10 +++---- .../cmd/network-area/region/create/create.go | 10 +++---- .../cmd/network-area/region/delete/delete.go | 10 +++---- .../cmd/network-area/region/update/update.go | 10 +++---- .../cmd/network-area/route/create/create.go | 10 +++---- .../cmd/network-area/route/delete/delete.go | 10 +++---- internal/cmd/network-area/update/update.go | 10 +++---- .../cmd/network-interface/create/create.go | 10 +++---- .../cmd/network-interface/delete/delete.go | 10 +++---- .../cmd/network-interface/update/update.go | 10 +++---- internal/cmd/network/create/create.go | 10 +++---- internal/cmd/network/delete/delete.go | 10 +++---- internal/cmd/network/update/update.go | 10 +++---- .../object-storage/bucket/create/create.go | 10 +++---- .../object-storage/bucket/delete/delete.go | 10 +++---- .../credentials-group/create/create.go | 10 +++---- .../credentials-group/delete/delete.go | 10 +++---- .../credentials/create/create.go | 10 +++---- .../credentials/delete/delete.go | 10 +++---- .../cmd/object-storage/disable/disable.go | 10 +++---- internal/cmd/object-storage/enable/enable.go | 10 +++---- .../credentials/create/create.go | 10 +++---- .../credentials/delete/delete.go | 10 +++---- .../public-read-access/disable/disable.go | 10 +++---- .../public-read-access/enable/enable.go | 10 +++---- .../grafana/single-sign-on/disable/disable.go | 10 +++---- .../grafana/single-sign-on/enable/enable.go | 10 +++---- .../observability/instance/create/create.go | 10 +++---- .../observability/instance/delete/delete.go | 10 +++---- .../observability/instance/update/update.go | 10 +++---- .../scrape-config/create/create.go | 10 +++---- .../scrape-config/delete/delete.go | 10 +++---- .../scrape-config/update/update.go | 10 +++---- .../opensearch/credentials/create/create.go | 10 +++---- .../opensearch/credentials/delete/delete.go | 10 +++---- .../cmd/opensearch/instance/create/create.go | 10 +++---- .../cmd/opensearch/instance/delete/delete.go | 10 +++---- .../cmd/opensearch/instance/update/update.go | 10 +++---- internal/cmd/organization/member/add/add.go | 10 +++---- .../cmd/organization/member/remove/remove.go | 16 +++++------- .../backup/update-schedule/update_schedule.go | 10 +++---- .../cmd/postgresflex/instance/clone/clone.go | 10 +++---- .../postgresflex/instance/create/create.go | 10 +++---- .../postgresflex/instance/delete/delete.go | 10 +++---- .../postgresflex/instance/update/update.go | 10 +++---- .../cmd/postgresflex/user/create/create.go | 10 +++---- .../cmd/postgresflex/user/delete/delete.go | 10 +++---- .../user/reset-password/reset_password.go | 10 +++---- .../cmd/postgresflex/user/update/update.go | 10 +++---- internal/cmd/project/create/create.go | 10 +++---- internal/cmd/project/delete/delete.go | 10 +++---- internal/cmd/project/member/add/add.go | 10 +++---- internal/cmd/project/member/remove/remove.go | 16 +++++------- internal/cmd/project/update/update.go | 10 +++---- internal/cmd/public-ip/associate/associate.go | 10 +++---- internal/cmd/public-ip/create/create.go | 10 +++---- internal/cmd/public-ip/delete/delete.go | 10 +++---- .../public-ip/disassociate/disassociate.go | 10 +++---- internal/cmd/public-ip/update/update.go | 10 +++---- .../cmd/rabbitmq/credentials/create/create.go | 10 +++---- .../cmd/rabbitmq/credentials/delete/delete.go | 10 +++---- .../cmd/rabbitmq/instance/create/create.go | 10 +++---- .../cmd/rabbitmq/instance/delete/delete.go | 10 +++---- .../cmd/rabbitmq/instance/update/update.go | 10 +++---- .../cmd/redis/credentials/create/create.go | 10 +++---- .../cmd/redis/credentials/delete/delete.go | 10 +++---- internal/cmd/redis/instance/create/create.go | 10 +++---- internal/cmd/redis/instance/delete/delete.go | 10 +++---- internal/cmd/redis/instance/update/update.go | 10 +++---- internal/cmd/root.go | 5 +++- .../secrets-manager/instance/create/create.go | 10 +++---- .../secrets-manager/instance/delete/delete.go | 10 +++---- .../secrets-manager/instance/update/update.go | 10 +++---- .../cmd/secrets-manager/user/create/create.go | 10 +++---- .../cmd/secrets-manager/user/delete/delete.go | 10 +++---- .../cmd/secrets-manager/user/update/update.go | 10 +++---- internal/cmd/security-group/create/create.go | 10 +++---- internal/cmd/security-group/delete/delete.go | 10 +++---- .../cmd/security-group/rule/create/create.go | 10 +++---- .../cmd/security-group/rule/delete/delete.go | 10 +++---- internal/cmd/security-group/update/update.go | 10 +++---- internal/cmd/server/backup/create/create.go | 10 +++---- internal/cmd/server/backup/delete/delete.go | 10 +++---- internal/cmd/server/backup/disable/disable.go | 10 +++---- internal/cmd/server/backup/enable/enable.go | 10 +++---- internal/cmd/server/backup/restore/restore.go | 10 +++---- .../server/backup/schedule/create/create.go | 10 +++---- .../server/backup/schedule/delete/delete.go | 10 +++---- .../server/backup/schedule/update/update.go | 10 +++---- .../backup/volume-backup/delete/delete.go | 10 +++---- .../backup/volume-backup/restore/restore.go | 10 +++---- internal/cmd/server/command/create/create.go | 10 +++---- internal/cmd/server/create/create.go | 10 +++---- internal/cmd/server/deallocate/deallocate.go | 10 +++---- internal/cmd/server/delete/delete.go | 10 +++---- .../server/network-interface/attach/attach.go | 22 +++++++--------- .../server/network-interface/detach/detach.go | 22 +++++++--------- .../cmd/server/os-update/create/create.go | 10 +++---- .../cmd/server/os-update/disable/disable.go | 10 +++---- .../cmd/server/os-update/enable/enable.go | 10 +++---- .../os-update/schedule/create/create.go | 10 +++---- .../os-update/schedule/delete/delete.go | 10 +++---- .../os-update/schedule/update/update.go | 10 +++---- .../cmd/server/public-ip/attach/attach.go | 10 +++---- .../cmd/server/public-ip/detach/detach.go | 10 +++---- internal/cmd/server/reboot/reboot.go | 10 +++---- internal/cmd/server/rescue/rescue.go | 10 +++---- internal/cmd/server/resize/resize.go | 10 +++---- .../server/service-account/attach/attach.go | 10 +++---- .../server/service-account/detach/detach.go | 10 +++---- internal/cmd/server/stop/stop.go | 10 +++---- internal/cmd/server/unrescue/unrescue.go | 10 +++---- internal/cmd/server/update/update.go | 10 +++---- internal/cmd/server/volume/attach/attach.go | 10 +++---- internal/cmd/server/volume/detach/detach.go | 10 +++---- internal/cmd/server/volume/update/update.go | 10 +++---- internal/cmd/service-account/create/create.go | 10 +++---- internal/cmd/service-account/delete/delete.go | 10 +++---- .../cmd/service-account/key/create/create.go | 18 ++++++------- .../cmd/service-account/key/delete/delete.go | 10 +++---- .../cmd/service-account/key/update/update.go | 10 +++---- .../service-account/token/create/create.go | 10 +++---- .../service-account/token/revoke/revoke.go | 10 +++---- internal/cmd/ske/cluster/create/create.go | 10 +++---- internal/cmd/ske/cluster/delete/delete.go | 10 +++---- .../cmd/ske/cluster/hibernate/hibernate.go | 10 +++---- .../ske/cluster/maintenance/maintenance.go | 10 +++---- internal/cmd/ske/cluster/update/update.go | 10 +++---- .../complete-rotation/complete_rotation.go | 10 +++---- .../start-rotation/start_rotation.go | 10 +++---- internal/cmd/ske/disable/disable.go | 10 +++---- internal/cmd/ske/enable/enable.go | 10 +++---- internal/cmd/ske/kubeconfig/create/create.go | 2 +- internal/cmd/volume/backup/create/create.go | 10 +++---- internal/cmd/volume/backup/delete/delete.go | 10 +++---- internal/cmd/volume/backup/restore/restore.go | 10 +++---- internal/cmd/volume/backup/update/update.go | 10 +++---- internal/cmd/volume/create/create.go | 10 +++---- internal/cmd/volume/delete/delete.go | 10 +++---- internal/cmd/volume/resize/resize.go | 10 +++---- internal/cmd/volume/snapshot/create/create.go | 10 +++---- internal/cmd/volume/snapshot/delete/delete.go | 10 +++---- internal/cmd/volume/snapshot/update/update.go | 10 +++---- internal/cmd/volume/update/update.go | 10 +++---- internal/pkg/print/print.go | 9 +++++++ internal/pkg/print/print_test.go | 9 +++++++ 232 files changed, 963 insertions(+), 1398 deletions(-) diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index ca5332eb8..d8b0d5a1b 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -54,12 +54,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create the affinity group %q?", model.Name) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create the affinity group %q?", model.Name) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index 31df4cb18..ba3f83efc 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { affinityGroupLabel = model.AffinityGroupId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete affinity group %q?", affinityGroupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete affinity group %q?", affinityGroupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index cf8429d10..2232d7aad 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create an application loadbalancer for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create an application loadbalancer for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/alb/delete/delete.go b/internal/cmd/beta/alb/delete/delete.go index 5d0c23ec5..94b8163ee 100644 --- a/internal/cmd/beta/alb/delete/delete.go +++ b/internal/cmd/beta/alb/delete/delete.go @@ -57,12 +57,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the application loadbalancer %q for project %q?", model.Name, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the application loadbalancer %q for project %q?", model.Name, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/alb/observability-credentials/add/add.go b/internal/cmd/beta/alb/observability-credentials/add/add.go index 039a76ebe..69d21973b 100644 --- a/internal/cmd/beta/alb/observability-credentials/add/add.go +++ b/internal/cmd/beta/alb/observability-credentials/add/add.go @@ -55,12 +55,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := "Are your sure you want to add credentials?" - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := "Are your sure you want to add credentials?" + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete.go b/internal/cmd/beta/alb/observability-credentials/delete/delete.go index d27de6d3e..274f977f2 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete.go @@ -50,12 +50,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %q?", model.CredentialsRef) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %q?", model.CredentialsRef) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/alb/observability-credentials/update/update.go b/internal/cmd/beta/alb/observability-credentials/update/update.go index 222c94559..18cbf8eb2 100644 --- a/internal/cmd/beta/alb/observability-credentials/update/update.go +++ b/internal/cmd/beta/alb/observability-credentials/update/update.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update credential %q for %q?", *model.CredentialsRef, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return fmt.Errorf("update credential: %w", err) - } + prompt := fmt.Sprintf("Are you sure you want to update credential %q for %q?", *model.CredentialsRef, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return fmt.Errorf("update credential: %w", err) } // Call API diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index dcc51b7c6..a98d5f822 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update an application target pool for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update an application target pool for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 5b34fea74..1221cba4f 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update an application loadbalancer for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update an application loadbalancer for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // for updates of an existing ALB the current version must be passed to the request diff --git a/internal/cmd/beta/intake/runner/create/create.go b/internal/cmd/beta/intake/runner/create/create.go index 95b6b4211..72cff3b29 100644 --- a/internal/cmd/beta/intake/runner/create/create.go +++ b/internal/cmd/beta/intake/runner/create/create.go @@ -73,12 +73,10 @@ func NewCmd(p *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create an Intake Runner for project %q?", projectLabel) - err = p.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create an Intake Runner for project %q?", projectLabel) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/intake/runner/delete/delete.go b/internal/cmd/beta/intake/runner/delete/delete.go index fcb4ae69d..92d5b1acf 100644 --- a/internal/cmd/beta/intake/runner/delete/delete.go +++ b/internal/cmd/beta/intake/runner/delete/delete.go @@ -54,12 +54,10 @@ func NewCmd(p *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete Intake Runner %q?", model.RunnerId) - err = p.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete Intake Runner %q?", model.RunnerId) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/key/create/create.go b/internal/cmd/beta/kms/key/create/create.go index 91c6ab3c9..de64af6a7 100644 --- a/internal/cmd/beta/kms/key/create/create.go +++ b/internal/cmd/beta/kms/key/create/create.go @@ -85,11 +85,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS Key?") - if err != nil { - return err - } + err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS Key?") + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/key/delete/delete.go b/internal/cmd/beta/kms/key/delete/delete.go index 5ead9aca5..d7a6e02f6 100644 --- a/internal/cmd/beta/kms/key/delete/delete.go +++ b/internal/cmd/beta/kms/key/delete/delete.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { keyName = model.KeyId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete key %q? (This cannot be undone)", keyName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete key %q? (This cannot be undone)", keyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/key/importKey/importKey.go b/internal/cmd/beta/kms/key/importKey/importKey.go index 78c70270e..38010860e 100644 --- a/internal/cmd/beta/kms/key/importKey/importKey.go +++ b/internal/cmd/beta/kms/key/importKey/importKey.go @@ -79,12 +79,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { keyRingName = model.KeyRingId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to import a new version for the KMS Key %q inside the key ring %q?", keyName, keyRingName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to import a new version for the KMS Key %q inside the key ring %q?", keyName, keyRingName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/key/restore/restore.go b/internal/cmd/beta/kms/key/restore/restore.go index 43164aa89..c4fc71173 100644 --- a/internal/cmd/beta/kms/key/restore/restore.go +++ b/internal/cmd/beta/kms/key/restore/restore.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { keyName = model.KeyId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to restore key %q? (This cannot be undone)", keyName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to restore key %q? (This cannot be undone)", keyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/key/rotate/rotate.go b/internal/cmd/beta/kms/key/rotate/rotate.go index 0761554df..972234e7e 100644 --- a/internal/cmd/beta/kms/key/rotate/rotate.go +++ b/internal/cmd/beta/kms/key/rotate/rotate.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { keyName = model.KeyId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to rotate the key %q? (this cannot be undone)", keyName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to rotate the key %q? (this cannot be undone)", keyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/keyring/create/create.go b/internal/cmd/beta/kms/keyring/create/create.go index 6a44529ed..0e773b364 100644 --- a/internal/cmd/beta/kms/keyring/create/create.go +++ b/internal/cmd/beta/kms/keyring/create/create.go @@ -64,11 +64,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS key ring?") - if err != nil { - return err - } + err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS key ring?") + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/keyring/delete/delete.go b/internal/cmd/beta/kms/keyring/delete/delete.go index 79c7316ea..6e028c75b 100644 --- a/internal/cmd/beta/kms/keyring/delete/delete.go +++ b/internal/cmd/beta/kms/keyring/delete/delete.go @@ -58,12 +58,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { keyRingLabel = model.KeyRingId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete key ring %q? (this cannot be undone)", keyRingLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete key ring %q? (this cannot be undone)", keyRingLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/wrappingkey/create/create.go b/internal/cmd/beta/kms/wrappingkey/create/create.go index d652da5ac..885c3b3e2 100644 --- a/internal/cmd/beta/kms/wrappingkey/create/create.go +++ b/internal/cmd/beta/kms/wrappingkey/create/create.go @@ -71,11 +71,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS wrapping key?") - if err != nil { - return err - } + err = params.Printer.PromptForConfirmation("Are you sure you want to create a KMS wrapping key?") + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete.go b/internal/cmd/beta/kms/wrappingkey/delete/delete.go index 38b659cdf..75ce76a05 100644 --- a/internal/cmd/beta/kms/wrappingkey/delete/delete.go +++ b/internal/cmd/beta/kms/wrappingkey/delete/delete.go @@ -62,12 +62,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { wrappingKeyName = model.WrappingKeyId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the wrapping key %q? (this cannot be undone)", wrappingKeyName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the wrapping key %q? (this cannot be undone)", wrappingKeyName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/export-policy/create/create.go b/internal/cmd/beta/sfs/export-policy/create/create.go index 3f3ecf864..8732825aa 100644 --- a/internal/cmd/beta/sfs/export-policy/create/create.go +++ b/internal/cmd/beta/sfs/export-policy/create/create.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a export policy for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a export policy for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/export-policy/delete/delete.go b/internal/cmd/beta/sfs/export-policy/delete/delete.go index b93807b5c..8ae903d23 100644 --- a/internal/cmd/beta/sfs/export-policy/delete/delete.go +++ b/internal/cmd/beta/sfs/export-policy/delete/delete.go @@ -56,12 +56,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { exportPolicyLabel = model.ExportPolicyId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete export policy %q? (This cannot be undone)", exportPolicyLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete export policy %q? (This cannot be undone)", exportPolicyLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/export-policy/update/update.go b/internal/cmd/beta/sfs/export-policy/update/update.go index cbe394459..a0ab0a6dc 100644 --- a/internal/cmd/beta/sfs/export-policy/update/update.go +++ b/internal/cmd/beta/sfs/export-policy/update/update.go @@ -78,12 +78,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update export policy %q for project %q?", exportPolicyLabel, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update export policy %q for project %q?", exportPolicyLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/resource-pool/create/create.go b/internal/cmd/beta/sfs/resource-pool/create/create.go index 69093d471..4b97f16bb 100644 --- a/internal/cmd/beta/sfs/resource-pool/create/create.go +++ b/internal/cmd/beta/sfs/resource-pool/create/create.go @@ -82,12 +82,10 @@ The available performance class values can be obtained by running: projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a resource-pool for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a resource-pool for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete.go b/internal/cmd/beta/sfs/resource-pool/delete/delete.go index acd38ae4d..6883c3987 100644 --- a/internal/cmd/beta/sfs/resource-pool/delete/delete.go +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete.go @@ -59,12 +59,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { resourcePoolName = model.ResourcePoolId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete resource pool %q? (This cannot be undone)", resourcePoolName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete resource pool %q? (This cannot be undone)", resourcePoolName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/resource-pool/update/update.go b/internal/cmd/beta/sfs/resource-pool/update/update.go index 267f68939..a276fb91e 100644 --- a/internal/cmd/beta/sfs/resource-pool/update/update.go +++ b/internal/cmd/beta/sfs/resource-pool/update/update.go @@ -87,12 +87,10 @@ The available performance class values can be obtained by running: resourcePoolName = model.ResourcePoolId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update resource-pool %q for project %q?", resourcePoolName, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update resource-pool %q for project %q?", resourcePoolName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/share/create/create.go b/internal/cmd/beta/sfs/share/create/create.go index 8fc5312bf..c2b2246b8 100644 --- a/internal/cmd/beta/sfs/share/create/create.go +++ b/internal/cmd/beta/sfs/share/create/create.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { resourcePoolLabel = model.ResourcePoolId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a SFS share for resource pool %q?", resourcePoolLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a SFS share for resource pool %q?", resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/share/delete/delete.go b/internal/cmd/beta/sfs/share/delete/delete.go index 7d5221cf7..aed603d52 100644 --- a/internal/cmd/beta/sfs/share/delete/delete.go +++ b/internal/cmd/beta/sfs/share/delete/delete.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { shareLabel = model.ShareId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete SFS share %q? (This cannot be undone)", shareLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete SFS share %q? (This cannot be undone)", shareLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/share/update/update.go b/internal/cmd/beta/sfs/share/update/update.go index f6178e96a..7f368fa3d 100644 --- a/internal/cmd/beta/sfs/share/update/update.go +++ b/internal/cmd/beta/sfs/share/update/update.go @@ -81,12 +81,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { resourcePoolLabel = model.ResourcePoolId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update SFS share %q for resource pool %q?", shareLabel, resourcePoolLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update SFS share %q for resource pool %q?", shareLabel, resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/snapshot/create/create.go b/internal/cmd/beta/sfs/snapshot/create/create.go index e55d902e9..c531009de 100644 --- a/internal/cmd/beta/sfs/snapshot/create/create.go +++ b/internal/cmd/beta/sfs/snapshot/create/create.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { resourcePoolLabel = model.ResourcePoolId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a snapshot for resource pool %q?", resourcePoolLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a snapshot for resource pool %q?", resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sfs/snapshot/delete/delete.go b/internal/cmd/beta/sfs/snapshot/delete/delete.go index 6ddfc4435..15e0cec17 100644 --- a/internal/cmd/beta/sfs/snapshot/delete/delete.go +++ b/internal/cmd/beta/sfs/snapshot/delete/delete.go @@ -61,12 +61,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { resourcePoolLabel = model.ResourcePoolId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete snapshot %q for resource pool %q?", model.SnapshotName, resourcePoolLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete snapshot %q for resource pool %q?", model.SnapshotName, resourcePoolLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index 072c3b91e..9a2b8c2e0 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create database %q? (This cannot be undone)", model.DatabaseName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create database %q? (This cannot be undone)", model.DatabaseName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index edfd47f83..3408cc85d 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -58,12 +58,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete database %q? (This cannot be undone)", model.DatabaseName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete database %q? (This cannot be undone)", model.DatabaseName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 04841a4c7..4cc0469e5 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -103,12 +103,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a SQLServer Flex instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a SQLServer Flex instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index 5e320f039..74840b4db 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index 019826e3b..81a4b5008 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -94,12 +94,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 5a818be70..1f3887390 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -75,12 +75,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/user/delete/delete.go b/internal/cmd/beta/sqlserverflex/user/delete/delete.go index 0908a227f..c1dd038d0 100644 --- a/internal/cmd/beta/sqlserverflex/user/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/user/delete/delete.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go index b27b6e923..f76922fc8 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/config/profile/delete/delete.go b/internal/cmd/config/profile/delete/delete.go index 631374a84..a81bf7888 100644 --- a/internal/cmd/config/profile/delete/delete.go +++ b/internal/cmd/config/profile/delete/delete.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Warn("The profile you are trying to delete is the active profile. The default profile will be set to active.\n") } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete profile %q? (This cannot be undone)", model.Profile) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete profile %q? (This cannot be undone)", model.Profile) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } err = config.DeleteProfile(params.Printer, model.Profile) diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 3dcc666e9..2687b34da 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -73,12 +73,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { zoneLabel = model.ZoneId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a record set for zone %s?", zoneLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a record set for zone %s?", zoneLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/dns/record-set/delete/delete.go b/internal/cmd/dns/record-set/delete/delete.go index dcfa6d300..09337b89e 100644 --- a/internal/cmd/dns/record-set/delete/delete.go +++ b/internal/cmd/dns/record-set/delete/delete.go @@ -70,12 +70,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { recordSetLabel = model.RecordSetId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete record set %s of zone %s? (This cannot be undone)", recordSetLabel, zoneLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete record set %s of zone %s? (This cannot be undone)", recordSetLabel, zoneLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/dns/record-set/update/update.go b/internal/cmd/dns/record-set/update/update.go index e3df19d91..b9fb0e942 100644 --- a/internal/cmd/dns/record-set/update/update.go +++ b/internal/cmd/dns/record-set/update/update.go @@ -93,12 +93,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update record set %s of zone %s?", recordSetLabel, zoneLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update record set %s of zone %s?", recordSetLabel, zoneLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index 0611348f9..6bc02546d 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -75,12 +75,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { zoneLabel = model.ZoneId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to clone the zone %q?", zoneLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to clone the zone %q?", zoneLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index 3454e654d..75ef0a3e5 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a zone for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a zone for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/dns/zone/delete/delete.go b/internal/cmd/dns/zone/delete/delete.go index 499ba920a..a204a5dbe 100644 --- a/internal/cmd/dns/zone/delete/delete.go +++ b/internal/cmd/dns/zone/delete/delete.go @@ -59,12 +59,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get zone name: %v", err) zoneLabel = model.ZoneId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete zone %q? (This cannot be undone)", zoneLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete zone %q? (This cannot be undone)", zoneLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/dns/zone/update/update.go b/internal/cmd/dns/zone/update/update.go index 128f1c3f0..a3c31b097 100644 --- a/internal/cmd/dns/zone/update/update.go +++ b/internal/cmd/dns/zone/update/update.go @@ -82,12 +82,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { zoneLabel = model.ZoneId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update zone %s?", zoneLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update zone %s?", zoneLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index f1323fb49..b11bb16a6 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create the instance %q?", model.Name) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create the instance %q?", model.Name) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/git/instance/delete/delete.go b/internal/cmd/git/instance/delete/delete.go index ae9394c83..7c056829a 100644 --- a/internal/cmd/git/instance/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceName = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the stackit git instance %q for %q?", instanceName, projectName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the stackit git instance %q for %q?", instanceName, projectName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index 784c4389f..e463bf41e 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -127,12 +127,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } }() - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create the image %q?", model.Name) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create the image %q?", model.Name) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index ffbbf8714..c41746f58 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { imageName = model.ImageId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the image %q for %q?", imageName, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the image %q for %q?", imageName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index 7aa3851c0..26d8ca088 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -139,12 +139,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { imageLabel = model.Id } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update the image %q?", imageLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update the image %q?", imageLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/key-pair/create/create.go b/internal/cmd/key-pair/create/create.go index 4ce01cfdf..5bb18ef2e 100644 --- a/internal/cmd/key-pair/create/create.go +++ b/internal/cmd/key-pair/create/create.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := "Are your sure you want to create a key pair?" - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := "Are your sure you want to create a key pair?" + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/key-pair/delete/delete.go b/internal/cmd/key-pair/delete/delete.go index 70d7e9a8f..17984e936 100644 --- a/internal/cmd/key-pair/delete/delete.go +++ b/internal/cmd/key-pair/delete/delete.go @@ -50,12 +50,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete key pair %q?", model.KeyPairName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete key pair %q?", model.KeyPairName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/key-pair/update/update.go b/internal/cmd/key-pair/update/update.go index 450329082..14988bf28 100644 --- a/internal/cmd/key-pair/update/update.go +++ b/internal/cmd/key-pair/update/update.go @@ -51,12 +51,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update key pair %q?", *model.KeyPairName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return fmt.Errorf("update key pair: %w", err) - } + prompt := fmt.Sprintf("Are you sure you want to update key pair %q?", *model.KeyPairName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return fmt.Errorf("update key pair: %w", err) } // Call API diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index 0ebaaee16..31e74d9ba 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -78,12 +78,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a load balancer for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a load balancer for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index 0c43431f1..e1c3a33af 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -51,12 +51,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete load balancer %q? (This cannot be undone)", model.LoadBalancerName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete load balancer %q? (This cannot be undone)", model.LoadBalancerName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index 0aa0c8532..edb3f447e 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -76,12 +76,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { model.Password = utils.Ptr(pwd) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to add observability credentials for Load Balancer on project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to add observability credentials for Load Balancer on project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go index ce2df7311..35e123ee3 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup.go @@ -72,21 +72,19 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return nil } - if !model.AssumeYes { - prompt := "Will delete the following unused observability credentials: \n" - for _, credential := range credentials { - if credential.DisplayName == nil || credential.Username == nil { - return fmt.Errorf("list unused Load Balancer observability credentials: credentials %q missing display name or username", *credential.CredentialsRef) - } - name := *credential.DisplayName - username := *credential.Username - prompt += fmt.Sprintf(" - %s (username: %q)\n", name, username) - } - prompt += fmt.Sprintf("Are you sure you want to delete unused observability credentials on project %q? (This cannot be undone)", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err + prompt := "Will delete the following unused observability credentials: \n" + for _, credential := range credentials { + if credential.DisplayName == nil || credential.Username == nil { + return fmt.Errorf("list unused Load Balancer observability credentials: credentials %q missing display name or username", *credential.CredentialsRef) } + name := *credential.DisplayName + username := *credential.Username + prompt += fmt.Sprintf(" - %s (username: %q)\n", name, username) + } + prompt += fmt.Sprintf("Are you sure you want to delete unused observability credentials on project %q? (This cannot be undone)", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } for _, credential := range credentials { diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete.go b/internal/cmd/load-balancer/observability-credentials/delete/delete.go index 238a9fcfb..4139f56db 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsRef } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete observability credentials %q on project %q?(This cannot be undone)", credentialsLabel, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete observability credentials %q on project %q?(This cannot be undone)", credentialsLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/observability-credentials/update/update.go b/internal/cmd/load-balancer/observability-credentials/update/update.go index dfa4e6f1a..f19afb714 100644 --- a/internal/cmd/load-balancer/observability-credentials/update/update.go +++ b/internal/cmd/load-balancer/observability-credentials/update/update.go @@ -95,12 +95,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { model.Password = utils.Ptr(pwd) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update observability credentials %q for Load Balancer on project %q?", credentialsLabel, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update observability credentials %q for Load Balancer on project %q?", credentialsLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 8bd1032ea..4cc41d4ef 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -62,12 +62,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to add a target with IP %q to target pool %q of load balancer %q?", model.IP, model.TargetPoolName, model.LBName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to add a target with IP %q to target pool %q of load balancer %q?", model.IP, model.TargetPoolName, model.LBName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index c0550ade6..4cb053eff 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { targetLabel = model.IP } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to remove target %q from target pool %q of load balancer %q?", targetLabel, model.TargetPoolName, model.LBName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to remove target %q from target pool %q of load balancer %q?", targetLabel, model.TargetPoolName, model.LBName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/load-balancer/update/update.go b/internal/cmd/load-balancer/update/update.go index 7a3184e1c..5e55a414b 100644 --- a/internal/cmd/load-balancer/update/update.go +++ b/internal/cmd/load-balancer/update/update.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update load balancer %q?", model.LoadBalancerName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update load balancer %q?", model.LoadBalancerName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index 5c2451e73..79d5577c4 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/logme/credentials/delete/delete.go b/internal/cmd/logme/credentials/delete/delete.go index 3254e6f32..26d2750fd 100644 --- a/internal/cmd/logme/credentials/delete/delete.go +++ b/internal/cmd/logme/credentials/delete/delete.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index f3b1118c1..c0b1fcd48 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -91,12 +91,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a LogMe instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a LogMe instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/logme/instance/delete/delete.go b/internal/cmd/logme/instance/delete/delete.go index f804e3b6d..9cdfac9d0 100644 --- a/internal/cmd/logme/instance/delete/delete.go +++ b/internal/cmd/logme/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/logme/instance/update/update.go b/internal/cmd/logme/instance/update/update.go index 6d503a394..4cefddf26 100644 --- a/internal/cmd/logme/instance/update/update.go +++ b/internal/cmd/logme/instance/update/update.go @@ -90,12 +90,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mariadb/credentials/create/create.go b/internal/cmd/mariadb/credentials/create/create.go index 9ac022e6f..f3d9e1155 100644 --- a/internal/cmd/mariadb/credentials/create/create.go +++ b/internal/cmd/mariadb/credentials/create/create.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mariadb/credentials/delete/delete.go b/internal/cmd/mariadb/credentials/delete/delete.go index 830ebd840..7fd89c4e9 100644 --- a/internal/cmd/mariadb/credentials/delete/delete.go +++ b/internal/cmd/mariadb/credentials/delete/delete.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index 2793da086..22a8a2b91 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -91,12 +91,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a MariaDB instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a MariaDB instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mariadb/instance/delete/delete.go b/internal/cmd/mariadb/instance/delete/delete.go index 3e59476f6..1cd809204 100644 --- a/internal/cmd/mariadb/instance/delete/delete.go +++ b/internal/cmd/mariadb/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mariadb/instance/update/update.go b/internal/cmd/mariadb/instance/update/update.go index 6aa6f701d..ebb48e315 100644 --- a/internal/cmd/mariadb/instance/update/update.go +++ b/internal/cmd/mariadb/instance/update/update.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index f7e5feb79..a4b6e5ca9 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -77,12 +77,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to restore MongoDB Flex instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to restore MongoDB Flex instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // If backupInstanceId is not provided, the target is the same instance as the backup diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index ce4dce055..6934fb862 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = *model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update backup schedule of instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update backup schedule of instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Get current instance diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 6a7c181e6..e0239d2f5 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -93,12 +93,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a MongoDB Flex instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a MongoDB Flex instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Fill in version, if needed diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index f5316c8fe..cb4a2be9c 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index fa160df07..bcd4bb894 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index b1d32aed9..9fc9def6d 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -77,12 +77,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mongodbflex/user/delete/delete.go b/internal/cmd/mongodbflex/user/delete/delete.go index 54f28cdc2..823f43d65 100644 --- a/internal/cmd/mongodbflex/user/delete/delete.go +++ b/internal/cmd/mongodbflex/user/delete/delete.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mongodbflex/user/reset-password/reset_password.go b/internal/cmd/mongodbflex/user/reset-password/reset_password.go index e92c189db..749b8f9d0 100644 --- a/internal/cmd/mongodbflex/user/reset-password/reset_password.go +++ b/internal/cmd/mongodbflex/user/reset-password/reset_password.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/mongodbflex/user/update/update.go b/internal/cmd/mongodbflex/user/update/update.go index caa91c059..200873a77 100644 --- a/internal/cmd/mongodbflex/user/update/update.go +++ b/internal/cmd/mongodbflex/user/update/update.go @@ -73,12 +73,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update user %q of instance %q?", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update user %q of instance %q?", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 15e9b8192..078a6568c 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -114,12 +114,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "configure resource manager client: %v", err) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a network area for organization %q?", orgLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a network area for organization %q?", orgLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API @@ -147,7 +145,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create network area region: %w", err) } - if !model.AssumeYes { + if !model.Async { s := spinner.New(params.Printer) s.Start("Create network area region") _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, *resp.Id, model.Region).WaitWithContext(ctx) diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index becf4524c..e1dbca35e 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -69,12 +69,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaLabel = model.AreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete network area %q?", networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete network area %q?", networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Check if the network area has a regional configuration diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index a77852fb3..0502663d8 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaLabel = *model.NetworkAreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a network range for STACKIT Network Area (SNA) %q?", networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a network range for STACKIT Network Area (SNA) %q?", networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index 82e697109..84ceb85c7 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkRangeLabel = model.NetworkRangeId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete network range %q on STACKIT Network Area (SNA) %q?", networkRangeLabel, networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete network range %q on STACKIT Network Area (SNA) %q?", networkRangeLabel, networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/region/create/create.go b/internal/cmd/network-area/region/create/create.go index 4adf5cee9..63a8c6348 100644 --- a/internal/cmd/network-area/region/create/create.go +++ b/internal/cmd/network-area/region/create/create.go @@ -90,12 +90,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaLabel = model.NetworkAreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/region/delete/delete.go b/internal/cmd/network-area/region/delete/delete.go index ff31aeaa2..bbbd44262 100644 --- a/internal/cmd/network-area/region/delete/delete.go +++ b/internal/cmd/network-area/region/delete/delete.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaName = model.NetworkAreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/region/update/update.go b/internal/cmd/network-area/region/update/update.go index 1d1f64bf7..8b68195ff 100644 --- a/internal/cmd/network-area/region/update/update.go +++ b/internal/cmd/network-area/region/update/update.go @@ -83,12 +83,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaLabel = model.NetworkAreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update the regional configuration %q for STACKIT Network Area (SNA) %q?", model.Region, networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index d0ad72a2b..72c9fe006 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -98,12 +98,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaLabel = *model.NetworkAreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a static route for STACKIT Network Area (SNA) %q?", networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a static route for STACKIT Network Area (SNA) %q?", networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index 6292f3cd7..dbad67c03 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkAreaLabel = *model.NetworkAreaId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete static route %q on STACKIT Network Area (SNA) %q?", model.RouteId, networkAreaLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete static route %q on STACKIT Network Area (SNA) %q?", model.RouteId, networkAreaLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 71d9bd899..98f778bc3 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -103,12 +103,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "configure resource manager client: %v", err) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update a network area for organization %q?", orgLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update a network area for organization %q?", orgLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index c660bb561..5939d712d 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -86,12 +86,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a network interface for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a network interface for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index 8db2f2376..de6d972cb 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -54,12 +54,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the network interface %q? (This cannot be undone)", model.NicId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the network interface %q? (This cannot be undone)", model.NicId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index 283083698..eeae44774 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -80,12 +80,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update the network interface %q?", model.NicId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update the network interface %q?", model.NicId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 4a2098191..fee9123ce 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -108,12 +108,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a network for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a network for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index 4cb4410be..1f3b00b95 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkLabel = model.NetworkId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete network %q?", networkLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete network %q?", networkLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 6a752b5e1..13e7e5acc 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -93,12 +93,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { networkLabel = model.NetworkId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update network %q?", networkLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update network %q?", networkLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index a3409a6a5..9b8aae9a3 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -53,12 +53,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create bucket %q? (This cannot be undone)", model.BucketName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create bucket %q? (This cannot be undone)", model.BucketName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Check if the project is enabled before trying to create diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index 010aa121e..c06e88718 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -52,12 +52,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete bucket %q? (This cannot be undone)", model.BucketName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete bucket %q? (This cannot be undone)", model.BucketName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index 2081d3550..9150b98fe 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -52,12 +52,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a credentials group with name %q?", model.CredentialsGroupName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a credentials group with name %q?", model.CredentialsGroupName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/credentials-group/delete/delete.go b/internal/cmd/object-storage/credentials-group/delete/delete.go index aad80623e..79daa26b3 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete.go @@ -58,12 +58,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsGroupLabel = model.CredentialsGroupId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials group %q? (This cannot be undone)", credentialsGroupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials group %q? (This cannot be undone)", credentialsGroupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index ef75cac78..c970dcb21 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsGroupLabel = model.CredentialsGroupId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials in group %q?", credentialsGroupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials in group %q?", credentialsGroupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index c8f1c63d8..84a3b363b 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %q of credentials group %q? (This cannot be undone)", credentialsLabel, credentialsGroupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %q of credentials group %q? (This cannot be undone)", credentialsLabel, credentialsGroupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index 0272151f4..e7b0f501b 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -52,12 +52,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable Object Storage for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disable Object Storage for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index c135a1212..bd5304493 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -52,12 +52,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable Object Storage for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to enable Object Storage for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index a3ef3f615..12ff53649 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -61,12 +61,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/credentials/delete/delete.go b/internal/cmd/observability/credentials/delete/delete.go index 86617ab82..a28888dc9 100644 --- a/internal/cmd/observability/credentials/delete/delete.go +++ b/internal/cmd/observability/credentials/delete/delete.go @@ -61,12 +61,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials for username %q of instance %q? (This cannot be undone)", model.Username, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials for username %q of instance %q? (This cannot be undone)", model.Username, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index 4f63f776f..70a3ff85b 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable Grafana public read access for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disable Grafana public read access for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index 87a79cfd8..04f9eabf2 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable Grafana public read access for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to enable Grafana public read access for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index 806bd02d0..57d7d7b8b 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable single sign-on for Grafana for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disable single sign-on for Grafana for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go index fa8f7f6de..3aca5bbe8 100644 --- a/internal/cmd/observability/grafana/single-sign-on/enable/enable.go +++ b/internal/cmd/observability/grafana/single-sign-on/enable/enable.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable single sign-on for Grafana for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to enable single sign-on for Grafana for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 23c4bc51a..c492902e5 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create an Observability instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create an Observability instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index b06179e6c..0aec201da 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index c97eb98ba..51d0b9f56 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -76,12 +76,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index c4e8a4dac..f3e9a0515 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -89,12 +89,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { model.Payload = &defaultPayload } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create scrape configuration %q on Observability instance %q?", *model.Payload.JobName, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create scrape configuration %q on Observability instance %q?", *model.Payload.JobName, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/scrape-config/delete/delete.go b/internal/cmd/observability/scrape-config/delete/delete.go index ceae80ac5..4cd15229b 100644 --- a/internal/cmd/observability/scrape-config/delete/delete.go +++ b/internal/cmd/observability/scrape-config/delete/delete.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete scrape configuration %q on Observability instance %q? (This cannot be undone)", model.JobName, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete scrape configuration %q on Observability instance %q? (This cannot be undone)", model.JobName, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/observability/scrape-config/update/update.go b/internal/cmd/observability/scrape-config/update/update.go index 3556e6620..130199713 100644 --- a/internal/cmd/observability/scrape-config/update/update.go +++ b/internal/cmd/observability/scrape-config/update/update.go @@ -69,12 +69,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update scrape configuration %q?", model.JobName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update scrape configuration %q?", model.JobName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index f44215219..06c5b87dd 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/opensearch/credentials/delete/delete.go b/internal/cmd/opensearch/credentials/delete/delete.go index d8b57c185..236b9c626 100644 --- a/internal/cmd/opensearch/credentials/delete/delete.go +++ b/internal/cmd/opensearch/credentials/delete/delete.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index 91fe825c8..bc03d82dd 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -93,12 +93,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create an OpenSearch instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create an OpenSearch instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/opensearch/instance/delete/delete.go b/internal/cmd/opensearch/instance/delete/delete.go index 31983b4a5..e1cc328fb 100644 --- a/internal/cmd/opensearch/instance/delete/delete.go +++ b/internal/cmd/opensearch/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/opensearch/instance/update/update.go b/internal/cmd/opensearch/instance/update/update.go index fab2792f0..aa9b90eb5 100644 --- a/internal/cmd/opensearch/instance/update/update.go +++ b/internal/cmd/opensearch/instance/update/update.go @@ -91,12 +91,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/organization/member/add/add.go b/internal/cmd/organization/member/add/add.go index f41eaa06d..db8754c5f 100644 --- a/internal/cmd/organization/member/add/add.go +++ b/internal/cmd/organization/member/add/add.go @@ -58,12 +58,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to add the %s role to %s on organization with ID %q?", *model.Role, model.Subject, *model.OrganizationId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to add the %s role to %s on organization with ID %q?", *model.Role, model.Subject, *model.OrganizationId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Configure API client diff --git a/internal/cmd/organization/member/remove/remove.go b/internal/cmd/organization/member/remove/remove.go index f0d5ee13c..27e95be67 100644 --- a/internal/cmd/organization/member/remove/remove.go +++ b/internal/cmd/organization/member/remove/remove.go @@ -68,15 +68,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to remove the %s role from %s on organization with ID %q?", *model.Role, model.Subject, *model.OrganizationId) - if model.Force { - prompt = fmt.Sprintf("%s This will also remove other roles of the subject that would stop the removal of the requested role", prompt) - } - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to remove the %s role from %s on organization with ID %q?", *model.Role, model.Subject, *model.OrganizationId) + if model.Force { + prompt = fmt.Sprintf("%s This will also remove other roles of the subject that would stop the removal of the requested role", prompt) + } + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go index 5e954322e..16bb967fe 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go @@ -62,12 +62,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = *model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update backup schedule of instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update backup schedule of instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index 9c72a9874..d9a784d2a 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -78,12 +78,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to clone instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to clone instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index de9106998..8359ad2f7 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -94,12 +94,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a PostgreSQL Flex instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a PostgreSQL Flex instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Fill in version, if needed diff --git a/internal/cmd/postgresflex/instance/delete/delete.go b/internal/cmd/postgresflex/instance/delete/delete.go index 56401d564..2108d31c3 100644 --- a/internal/cmd/postgresflex/instance/delete/delete.go +++ b/internal/cmd/postgresflex/instance/delete/delete.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } toDelete, toForceDelete, err := getNextOperations(ctx, model, apiClient) diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 821d10b1c..8623a78f4 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q? (This may cause downtime)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q? (This may cause downtime)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index 7623ba786..fc53b1f07 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -75,12 +75,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/user/delete/delete.go b/internal/cmd/postgresflex/user/delete/delete.go index 219798121..d3646805a 100644 --- a/internal/cmd/postgresflex/user/delete/delete.go +++ b/internal/cmd/postgresflex/user/delete/delete.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index 3c78d191f..c899b5659 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to reset the password of user %q of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/postgresflex/user/update/update.go b/internal/cmd/postgresflex/user/update/update.go index 3ebb2231f..fa8d8e445 100644 --- a/internal/cmd/postgresflex/user/update/update.go +++ b/internal/cmd/postgresflex/user/update/update.go @@ -70,12 +70,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = model.UserId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update user %q of instance %q?", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update user %q of instance %q?", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/project/create/create.go b/internal/cmd/project/create/create.go index e00210b71..c18e083fc 100644 --- a/internal/cmd/project/create/create.go +++ b/internal/cmd/project/create/create.go @@ -77,12 +77,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a project under the parent with ID %q?", *model.ParentId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a project under the parent with ID %q?", *model.ParentId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/project/delete/delete.go b/internal/cmd/project/delete/delete.go index 314fb621e..14de5b63f 100644 --- a/internal/cmd/project/delete/delete.go +++ b/internal/cmd/project/delete/delete.go @@ -55,12 +55,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/project/member/add/add.go b/internal/cmd/project/member/add/add.go index d08437440..0901fba52 100644 --- a/internal/cmd/project/member/add/add.go +++ b/internal/cmd/project/member/add/add.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to add the role %q to %s on project %q?", *model.Role, model.Subject, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to add the role %q to %s on project %q?", *model.Role, model.Subject, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/project/member/remove/remove.go b/internal/cmd/project/member/remove/remove.go index 8b7089283..70a7c46d6 100644 --- a/internal/cmd/project/member/remove/remove.go +++ b/internal/cmd/project/member/remove/remove.go @@ -74,15 +74,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to remove the role %q from %s on project %q?", *model.Role, model.Subject, projectLabel) - if model.Force { - prompt = fmt.Sprintf("%s This will also remove other roles of the subject that would stop the removal of the requested role", prompt) - } - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to remove the role %q from %s on project %q?", *model.Role, model.Subject, projectLabel) + if model.Force { + prompt = fmt.Sprintf("%s This will also remove other roles of the subject that would stop the removal of the requested role", prompt) + } + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/project/update/update.go b/internal/cmd/project/update/update.go index 37e799a36..a0ee9ae4f 100644 --- a/internal/cmd/project/update/update.go +++ b/internal/cmd/project/update/update.go @@ -74,12 +74,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index a3ed8cc0e..357a6c87f 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { publicIpLabel = model.PublicIpId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to associate public IP %q with resource %v?", publicIpLabel, *model.AssociatedResourceId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to associate public IP %q with resource %v?", publicIpLabel, *model.AssociatedResourceId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index a467529d9..a13574190 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a public IP for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a public IP for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index 4cbcd1094..2bf9c234f 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { publicIpLabel = model.PublicIpId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete public IP %q? (This cannot be undone)", publicIpLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete public IP %q? (This cannot be undone)", publicIpLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index 69a5dc77d..7df01b637 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -61,12 +61,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { publicIpLabel = model.PublicIpId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disassociate public IP %q from the associated resource %q?", publicIpLabel, associatedResourceId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disassociate public IP %q from the associated resource %q?", publicIpLabel, associatedResourceId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index df2687a76..8fb1d8a77 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { publicIpLabel = model.PublicIpId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update public IP %q?", publicIpLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update public IP %q?", publicIpLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 9c43e2ca1..3aeea6efe 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/rabbitmq/credentials/delete/delete.go b/internal/cmd/rabbitmq/credentials/delete/delete.go index 7dcd75143..a30d2e9d0 100644 --- a/internal/cmd/rabbitmq/credentials/delete/delete.go +++ b/internal/cmd/rabbitmq/credentials/delete/delete.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index 2778e082a..1ac8e7cc2 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -93,12 +93,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create an RabbitMQ instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create an RabbitMQ instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index 8be4dacfb..766ced827 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index f2a87e12b..d3cf53603 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -91,12 +91,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/redis/credentials/create/create.go b/internal/cmd/redis/credentials/create/create.go index c7793c1c7..a3e3e8e63 100644 --- a/internal/cmd/redis/credentials/create/create.go +++ b/internal/cmd/redis/credentials/create/create.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create credentials for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/redis/credentials/delete/delete.go b/internal/cmd/redis/credentials/delete/delete.go index 2209c45b1..496a43dd2 100644 --- a/internal/cmd/redis/credentials/delete/delete.go +++ b/internal/cmd/redis/credentials/delete/delete.go @@ -68,12 +68,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { credentialsLabel = model.CredentialsId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete credentials %s of instance %q? (This cannot be undone)", credentialsLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index f6b4d050c..8993b98ca 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -91,12 +91,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Redis instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a Redis instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/redis/instance/delete/delete.go b/internal/cmd/redis/instance/delete/delete.go index 1b314ea33..0c8124906 100644 --- a/internal/cmd/redis/instance/delete/delete.go +++ b/internal/cmd/redis/instance/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/redis/instance/update/update.go b/internal/cmd/redis/instance/update/update.go index 98b192ad6..3fcc2e7b4 100644 --- a/internal/cmd/redis/instance/update/update.go +++ b/internal/cmd/redis/instance/update/update.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 33b38ebfa..ccb1b9f5a 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -62,7 +62,9 @@ func NewRootCmd(version, date string, p *print.Printer) *cobra.Command { DisableAutoGenTag: true, PersistentPreRunE: func(cmd *cobra.Command, _ []string) error { p.Cmd = cmd - p.Verbosity = print.Level(globalflags.Parse(p, cmd).Verbosity) + globalFlags := globalflags.Parse(p, cmd) + p.Verbosity = print.Level(globalFlags.Verbosity) + p.AssumeYes = globalFlags.AssumeYes argsString := print.BuildDebugStrFromSlice(os.Args) p.Debug(print.DebugLevel, "arguments: %s", argsString) @@ -209,6 +211,7 @@ func Execute(version, date string) { // We need to set the printer and verbosity here because the // PersistentPreRun is not called when the command is wrongly called + // In this case Printer.AssumeYes isn't set either, but `false` as default is acceptable p.Cmd = cmd p.Verbosity = print.InfoLevel diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index abc0bb5f2..0c6d8420b 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Secrets Manager instance for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a Secrets Manager instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API to create instance diff --git a/internal/cmd/secrets-manager/instance/delete/delete.go b/internal/cmd/secrets-manager/instance/delete/delete.go index ec8148e34..94ed3385a 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete.go +++ b/internal/cmd/secrets-manager/instance/delete/delete.go @@ -57,12 +57,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete instance %q? (This cannot be undone)", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/secrets-manager/instance/update/update.go b/internal/cmd/secrets-manager/instance/update/update.go index c3cfb5956..58786ffd6 100644 --- a/internal/cmd/secrets-manager/instance/update/update.go +++ b/internal/cmd/secrets-manager/instance/update/update.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/secrets-manager/user/create/create.go b/internal/cmd/secrets-manager/user/create/create.go index eba0d736b..1584b5cf5 100644 --- a/internal/cmd/secrets-manager/user/create/create.go +++ b/internal/cmd/secrets-manager/user/create/create.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { instanceLabel = model.InstanceId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a user for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/secrets-manager/user/delete/delete.go b/internal/cmd/secrets-manager/user/delete/delete.go index e2ad75eb5..65193fac3 100644 --- a/internal/cmd/secrets-manager/user/delete/delete.go +++ b/internal/cmd/secrets-manager/user/delete/delete.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = fmt.Sprintf("%q", model.UserId) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete user %s of instance %q? (This cannot be undone)", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete user %s of instance %q? (This cannot be undone)", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/secrets-manager/user/update/update.go b/internal/cmd/secrets-manager/user/update/update.go index 31a8e5a6e..38507699b 100644 --- a/internal/cmd/secrets-manager/user/update/update.go +++ b/internal/cmd/secrets-manager/user/update/update.go @@ -76,12 +76,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { userLabel = fmt.Sprintf("%q", model.UserId) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update user %s of instance %q?", userLabel, instanceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update user %s of instance %q?", userLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index b5e7143a2..5c52d133a 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -56,12 +56,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create the security group %q?", *model.Name) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create the security group %q?", *model.Name) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 37c0b283c..1950d712b 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -60,12 +60,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { groupLabel = model.SecurityGroupId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the security group %q for %q?", groupLabel, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the security group %q for %q?", groupLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index 5e08c09b0..b2f443ace 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -101,12 +101,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { securityGroupLabel = model.SecurityGroupId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a security group rule for security group %q for project %q?", securityGroupLabel, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a security group rule for security group %q for project %q?", securityGroupLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index 722142f9d..388e3b0b7 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { securityGroupRuleLabel = model.SecurityGroupRuleId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete security group rule %q from security group %q?", securityGroupRuleLabel, securityGroupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete security group rule %q from security group %q?", securityGroupRuleLabel, securityGroupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index 5a5039fa9..6f612f744 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { groupLabel = model.SecurityGroupId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update the security group %q?", groupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update the security group %q?", groupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/create/create.go b/internal/cmd/server/backup/create/create.go index c2ab4b028..50b36dce4 100644 --- a/internal/cmd/server/backup/create/create.go +++ b/internal/cmd/server/backup/create/create.go @@ -79,12 +79,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Backup for server %s?", model.ServerId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a Backup for server %s?", model.ServerId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/delete/delete.go b/internal/cmd/server/backup/delete/delete.go index e4cb8118d..5eedcde2d 100644 --- a/internal/cmd/server/backup/delete/delete.go +++ b/internal/cmd/server/backup/delete/delete.go @@ -54,12 +54,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete server backup %q? (This cannot be undone)", model.BackupId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete server backup %q? (This cannot be undone)", model.BackupId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/disable/disable.go b/internal/cmd/server/backup/disable/disable.go index a9cc28ac4..4aecf6553 100644 --- a/internal/cmd/server/backup/disable/disable.go +++ b/internal/cmd/server/backup/disable/disable.go @@ -74,12 +74,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return nil } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disable the backup service for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/enable/enable.go b/internal/cmd/server/backup/enable/enable.go index 419d54076..7f6854be3 100644 --- a/internal/cmd/server/backup/enable/enable.go +++ b/internal/cmd/server/backup/enable/enable.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to enable the Server Backup service for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/restore/restore.go b/internal/cmd/server/backup/restore/restore.go index 8d3899dd5..b55b2b465 100644 --- a/internal/cmd/server/backup/restore/restore.go +++ b/internal/cmd/server/backup/restore/restore.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to restore server backup %q? (This cannot be undone)", model.BackupId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to restore server backup %q? (This cannot be undone)", model.BackupId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/schedule/create/create.go b/internal/cmd/server/backup/schedule/create/create.go index 9f113f0e6..6b722c0b0 100644 --- a/internal/cmd/server/backup/schedule/create/create.go +++ b/internal/cmd/server/backup/schedule/create/create.go @@ -87,12 +87,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Backup Schedule for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a Backup Schedule for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/schedule/delete/delete.go b/internal/cmd/server/backup/schedule/delete/delete.go index 498f7cacd..42e4c07ef 100644 --- a/internal/cmd/server/backup/schedule/delete/delete.go +++ b/internal/cmd/server/backup/schedule/delete/delete.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete server backup schedule %q? (This cannot be undone)", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete server backup schedule %q? (This cannot be undone)", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/schedule/update/update.go b/internal/cmd/server/backup/schedule/update/update.go index 3a54a12eb..d16db4d63 100644 --- a/internal/cmd/server/backup/schedule/update/update.go +++ b/internal/cmd/server/backup/schedule/update/update.go @@ -82,12 +82,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update Server Backup Schedule %q?", model.BackupScheduleId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update Server Backup Schedule %q?", model.BackupScheduleId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/volume-backup/delete/delete.go b/internal/cmd/server/backup/volume-backup/delete/delete.go index f13d85633..1a7241bba 100644 --- a/internal/cmd/server/backup/volume-backup/delete/delete.go +++ b/internal/cmd/server/backup/volume-backup/delete/delete.go @@ -56,12 +56,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete server volume backup %q? (This cannot be undone)", model.VolumeId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete server volume backup %q? (This cannot be undone)", model.VolumeId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/backup/volume-backup/restore/restore.go b/internal/cmd/server/backup/volume-backup/restore/restore.go index 676b5135e..343f4ade8 100644 --- a/internal/cmd/server/backup/volume-backup/restore/restore.go +++ b/internal/cmd/server/backup/volume-backup/restore/restore.go @@ -58,12 +58,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to restore volume backup %q? (This cannot be undone)", model.VolumeBackupId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to restore volume backup %q? (This cannot be undone)", model.VolumeBackupId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 1937f4e28..1561ab3b5 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -75,12 +75,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a Command for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a Command for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index 86f0af5dc..a93efcbf7 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -128,12 +128,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a server for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a server for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index 9c8d7971c..bed42bf7a 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to deallocate server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to deallocate server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index 85c264b5e..412c099dc 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -66,12 +66,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 3e98a366e..5bcf7ed6d 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -78,13 +78,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a network interface for network %q and attach it to server %q?", networkLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a network interface for network %q and attach it to server %q?", networkLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } + // Call API req := buildRequestCreateAndAttach(ctx, model, apiClient) err = req.Execute() @@ -95,13 +94,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return nil } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to attach network interface %q to server %q?", *model.NicId, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to attach network interface %q to server %q?", *model.NicId, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } + // Call API req := buildRequestAttach(ctx, model, apiClient) err = req.Execute() diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index 1e8babe16..ed891e912 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -80,13 +80,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) networkLabel = *model.NetworkId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to detach and delete all network interfaces of network %q from server %q? (This cannot be undone)", networkLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to detach and delete all network interfaces of network %q from server %q? (This cannot be undone)", networkLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } + // Call API req := buildRequestDetachAndDelete(ctx, model, apiClient) err = req.Execute() @@ -97,13 +96,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return nil } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to detach network interface %q from server %q?", *model.NicId, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to detach network interface %q from server %q?", *model.NicId, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } + // Call API req := buildRequestDetach(ctx, model, apiClient) err = req.Execute() diff --git a/internal/cmd/server/os-update/create/create.go b/internal/cmd/server/os-update/create/create.go index eac250845..1d1ad8962 100644 --- a/internal/cmd/server/os-update/create/create.go +++ b/internal/cmd/server/os-update/create/create.go @@ -74,12 +74,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a os-update for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a os-update for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/os-update/disable/disable.go b/internal/cmd/server/os-update/disable/disable.go index c0cc0bb8d..c2a308710 100644 --- a/internal/cmd/server/os-update/disable/disable.go +++ b/internal/cmd/server/os-update/disable/disable.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable the os-update service for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disable the os-update service for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/os-update/enable/enable.go b/internal/cmd/server/os-update/enable/enable.go index 5e25334bb..0d4630c45 100644 --- a/internal/cmd/server/os-update/enable/enable.go +++ b/internal/cmd/server/os-update/enable/enable.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable the server os-update service for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to enable the server os-update service for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/os-update/schedule/create/create.go b/internal/cmd/server/os-update/schedule/create/create.go index 446859534..421a173c6 100644 --- a/internal/cmd/server/os-update/schedule/create/create.go +++ b/internal/cmd/server/os-update/schedule/create/create.go @@ -82,12 +82,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a os-update Schedule for server %s?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a os-update Schedule for server %s?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/os-update/schedule/delete/delete.go b/internal/cmd/server/os-update/schedule/delete/delete.go index de1d19d3e..b26084c9a 100644 --- a/internal/cmd/server/os-update/schedule/delete/delete.go +++ b/internal/cmd/server/os-update/schedule/delete/delete.go @@ -53,12 +53,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete server os-update schedule %q? (This cannot be undone)", model.ScheduleId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete server os-update schedule %q? (This cannot be undone)", model.ScheduleId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index 59ca210b1..72c3f92f4 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -74,12 +74,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update Server os-update Schedule %q?", model.ScheduleId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update Server os-update Schedule %q?", model.ScheduleId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 52ef99867..7532eac13 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to attach public IP %q to server %q?", publicIpLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to attach public IP %q to server %q?", publicIpLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index adfa2ad47..8c85195e9 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to detach public IP %q from server %q?", publicIpLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to detach public IP %q from server %q?", publicIpLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index 4f4b3e268..bf689cfcc 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -70,12 +70,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } else if serverLabel == "" { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to reboot server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to reboot server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index 746fbadc4..dd77e4625 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to rescue server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to rescue server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index d2a7836a2..804dbce1a 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to resize server %q to machine type %q?", serverLabel, *model.MachineType) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to resize server %q to machine type %q?", serverLabel, *model.MachineType) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/service-account/attach/attach.go b/internal/cmd/server/service-account/attach/attach.go index 1bf853199..e7c7ea762 100644 --- a/internal/cmd/server/service-account/attach/attach.go +++ b/internal/cmd/server/service-account/attach/attach.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to attach service account %q to server %q?", model.ServiceAccMail, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to attach service account %q to server %q?", model.ServiceAccMail, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index ab9fbbe03..00830e7d6 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are your sure you want to detach service account %q from a server %q?", model.ServiceAccMail, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are your sure you want to detach service account %q from a server %q?", model.ServiceAccMail, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index 07a8008c3..a7a9b4604 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to stop server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to stop server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index e65d13d6e..f47ef6794 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to unrescue server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to unrescue server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index 76973b91c..7349d1c28 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -70,12 +70,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update server %q?", serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update server %q?", serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index f8bf74a2f..27c734f8d 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -78,12 +78,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to attach volume %q to server %q?", volumeLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to attach volume %q to server %q?", volumeLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index 7ae8dee8e..0c8081a5d 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -70,12 +70,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to detach volume %q from server %q?", volumeLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to detach volume %q from server %q?", volumeLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index b3faf2d2f..4ba1a9342 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -74,12 +74,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update attached volume %q of server %q?", volumeLabel, serverLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update attached volume %q of server %q?", volumeLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/create/create.go b/internal/cmd/service-account/create/create.go index aca5c8133..8d9daf092 100644 --- a/internal/cmd/service-account/create/create.go +++ b/internal/cmd/service-account/create/create.go @@ -59,12 +59,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a service account for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a service account for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/delete/delete.go b/internal/cmd/service-account/delete/delete.go index ff843534d..eefc8a3e3 100644 --- a/internal/cmd/service-account/delete/delete.go +++ b/internal/cmd/service-account/delete/delete.go @@ -50,12 +50,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete service account %s? (This cannot be undone)", model.Email) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete service account %s? (This cannot be undone)", model.Email) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/key/create/create.go b/internal/cmd/service-account/key/create/create.go index 6af133cdc..49bdd3918 100644 --- a/internal/cmd/service-account/key/create/create.go +++ b/internal/cmd/service-account/key/create/create.go @@ -69,16 +69,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - validUntilInfo := "The key will be valid until deleted" - if model.ExpiresInDays != nil { - validUntilInfo = fmt.Sprintf("The key will be valid for %d days", *model.ExpiresInDays) - } - prompt := fmt.Sprintf("Are you sure you want to create a key for service account %s? %s", model.ServiceAccountEmail, validUntilInfo) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + validUntilInfo := "The key will be valid until deleted" + if model.ExpiresInDays != nil { + validUntilInfo = fmt.Sprintf("The key will be valid for %d days", *model.ExpiresInDays) + } + prompt := fmt.Sprintf("Are you sure you want to create a key for service account %s? %s", model.ServiceAccountEmail, validUntilInfo) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/key/delete/delete.go b/internal/cmd/service-account/key/delete/delete.go index b6ff682d8..c468d72a7 100644 --- a/internal/cmd/service-account/key/delete/delete.go +++ b/internal/cmd/service-account/key/delete/delete.go @@ -56,12 +56,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete the key %s from service account %s?", model.KeyId, model.ServiceAccountEmail) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete the key %s from service account %s?", model.KeyId, model.ServiceAccountEmail) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/key/update/update.go b/internal/cmd/service-account/key/update/update.go index fd5d3383a..5594396e4 100644 --- a/internal/cmd/service-account/key/update/update.go +++ b/internal/cmd/service-account/key/update/update.go @@ -73,12 +73,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update the key with ID %q?", model.KeyId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update the key with ID %q?", model.KeyId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index ea0b1f39d..a3286219b 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create an access token for service account %s?", model.ServiceAccountEmail) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create an access token for service account %s?", model.ServiceAccountEmail) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/service-account/token/revoke/revoke.go b/internal/cmd/service-account/token/revoke/revoke.go index ee3c05a81..2a892e005 100644 --- a/internal/cmd/service-account/token/revoke/revoke.go +++ b/internal/cmd/service-account/token/revoke/revoke.go @@ -59,12 +59,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to revoke the access token with ID %q?", model.TokenId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to revoke the access token with ID %q?", model.TokenId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 18113539b..1602e3680 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -82,12 +82,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a cluster for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a cluster for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Configure ServiceEnable API client diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index fc8b70978..34de6f2c7 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -52,12 +52,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete cluster %q? (This cannot be undone)", model.ClusterName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete cluster %q? (This cannot be undone)", model.ClusterName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go index ce4c416e5..5e679e38b 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -57,12 +57,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to trigger hibernate for %q in project %q?", model.ClusterName, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to trigger hibernate for %q in project %q?", model.ClusterName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go index cc3c1ab1d..0b5f406ca 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -57,12 +57,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to trigger maintenance for %q in project %q?", model.ClusterName, projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to trigger maintenance for %q in project %q?", model.ClusterName, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index e59fa9990..6150a9bda 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -70,12 +70,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update cluster %q?", model.ClusterName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update cluster %q?", model.ClusterName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Check if cluster exists diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index 5fc0f81bb..25f2601aa 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -69,12 +69,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to complete the rotation of the credentials for SKE cluster %q?", model.ClusterName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to complete the rotation of the credentials for SKE cluster %q?", model.ClusterName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index fa239775a..3cb3cee55 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -72,12 +72,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to start the rotation of the credentials for SKE cluster %q?", model.ClusterName) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to start the rotation of the credentials for SKE cluster %q?", model.ClusterName) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index cd2dc87db..075711b1a 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -55,12 +55,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to disable SKE for project %q? (This will delete all associated clusters)", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to disable SKE for project %q? (This will delete all associated clusters)", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 411140edc..366f8d5f2 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -55,12 +55,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to enable SKE for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to enable SKE for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index 725c53636..355364098 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -90,7 +90,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - if !model.AssumeYes && !model.DisableWriting { + if !model.DisableWriting { var prompt string if model.Overwrite { prompt = fmt.Sprintf("Are you sure you want to create a kubeconfig for SKE cluster %q? This will OVERWRITE your current kubeconfig file, if it exists.", model.ClusterName) diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index 3673b6ac8..fc9e0b3cd 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -96,12 +96,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create backup from %s? (This cannot be undone)", sourceLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create backup from %s? (This cannot be undone)", sourceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go index e8e2ce676..9c9717427 100644 --- a/internal/cmd/volume/backup/delete/delete.go +++ b/internal/cmd/volume/backup/delete/delete.go @@ -58,12 +58,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get backup name: %v", err) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete backup %q? (This cannot be undone)", backupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete backup %q? (This cannot be undone)", backupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go index 29239a7fe..63fc0d915 100644 --- a/internal/cmd/volume/backup/restore/restore.go +++ b/internal/cmd/volume/backup/restore/restore.go @@ -71,12 +71,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to restore %q with backup %q? (This cannot be undone)", sourceLabel, backupLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to restore %q with backup %q? (This cannot be undone)", sourceLabel, backupLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go index 02fe3703a..9141f9a2b 100644 --- a/internal/cmd/volume/backup/update/update.go +++ b/internal/cmd/volume/backup/update/update.go @@ -65,12 +65,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get backup name: %v", err) } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update backup %q? (This cannot be undone)", model.BackupId) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update backup %q? (This cannot be undone)", model.BackupId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 8b3a536a5..f0bda5f69 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -88,12 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { projectLabel = model.ProjectId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create a volume for project %q?", projectLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create a volume for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index f6550714c..599f3bf56 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -64,12 +64,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { volumeLabel = model.VolumeId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete volume %q?", volumeLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete volume %q?", volumeLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index 7bcc40dc0..0bfbc0797 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -63,12 +63,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { volumeLabel = model.VolumeId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to resize volume %q?", volumeLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to resize volume %q?", volumeLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index 29dd2894c..f63a38b16 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -79,12 +79,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { volumeLabel = model.VolumeID } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to create snapshot from volume %q? (This cannot be undone)", volumeLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to create snapshot from volume %q? (This cannot be undone)", volumeLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go index c4c06b34d..7334cac51 100644 --- a/internal/cmd/volume/snapshot/delete/delete.go +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -61,12 +61,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { snapshotLabel = model.SnapshotId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to delete snapshot %q? (This cannot be undone)", snapshotLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to delete snapshot %q? (This cannot be undone)", snapshotLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/snapshot/update/update.go b/internal/cmd/volume/snapshot/update/update.go index b43072bce..f48649743 100644 --- a/internal/cmd/volume/snapshot/update/update.go +++ b/internal/cmd/volume/snapshot/update/update.go @@ -67,12 +67,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { snapshotLabel = model.SnapshotId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update snapshot %q?", snapshotLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update snapshot %q?", snapshotLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 194a70db3..3c8f447d3 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -74,12 +74,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { volumeLabel = model.VolumeId } - if !model.AssumeYes { - prompt := fmt.Sprintf("Are you sure you want to update volume %q?", volumeLabel) - err = params.Printer.PromptForConfirmation(prompt) - if err != nil { - return err - } + prompt := fmt.Sprintf("Are you sure you want to update volume %q?", volumeLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err } // Call API diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index d8e06a25c..4098b9cb5 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -51,6 +51,7 @@ var ( type Printer struct { Cmd *cobra.Command + AssumeYes bool Verbosity Level } @@ -134,6 +135,10 @@ func (p *Printer) Error(msg string, args ...any) { // Returns nil only if the user (explicitly) answers positive. // Returns ErrAborted if the user answers negative. func (p *Printer) PromptForConfirmation(prompt string) error { + if p.AssumeYes { + p.Warn("Auto-confirming prompt: %q\n", prompt) + return nil + } question := fmt.Sprintf("%s [y/N] ", prompt) reader := bufio.NewReader(p.Cmd.InOrStdin()) for i := 0; i < 3; i++ { @@ -157,6 +162,10 @@ func (p *Printer) PromptForConfirmation(prompt string) error { // // Returns nil if the user presses Enter. func (p *Printer) PromptForEnter(prompt string) error { + if p.AssumeYes { + p.Warn("Auto-confirming prompt: %q", prompt) + return nil + } reader := bufio.NewReader(p.Cmd.InOrStdin()) p.Cmd.PrintErr(prompt) _, err := reader.ReadString('\n') diff --git a/internal/pkg/print/print_test.go b/internal/pkg/print/print_test.go index 8cb2e8ee2..d52af5241 100644 --- a/internal/pkg/print/print_test.go +++ b/internal/pkg/print/print_test.go @@ -509,6 +509,7 @@ func TestPromptForConfirmation(t *testing.T) { verbosity Level isValid bool isAborted bool + assumeYes bool }{ // Note: Some of these inputs have normal spaces, others have tabs { @@ -647,6 +648,13 @@ func TestPromptForConfirmation(t *testing.T) { verbosity: DebugLevel, isValid: false, }, + { + description: "no input with assume yes", + input: "", + verbosity: DebugLevel, + isValid: true, + assumeYes: true, + }, } for _, tt := range tests { @@ -665,6 +673,7 @@ func TestPromptForConfirmation(t *testing.T) { p := &Printer{ Cmd: cmd, Verbosity: tt.verbosity, + AssumeYes: tt.assumeYes, } err = p.PromptForConfirmation("") From 1a43e78a17b76bce2e9587fb40914d8b8711aa34 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:26:16 +0100 Subject: [PATCH 308/422] chore(deps): update module golang.org/x/tools to v0.41.0 (#1225) Co-authored-by: Renovate Bot --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 617c54c23..656654080 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( ) require ( - golang.org/x/net v0.48.0 // indirect + golang.org/x/net v0.49.0 // indirect golang.org/x/time v0.11.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect ) @@ -232,8 +232,8 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 // indirect golang.org/x/sync v0.19.0 // indirect - golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc // indirect - golang.org/x/tools v0.40.0 // indirect + golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 // indirect + golang.org/x/tools v0.41.0 // indirect google.golang.org/protobuf v1.36.8 // indirect honnef.co/go/tools v0.6.1 // indirect mvdan.cc/gofumpt v0.9.2 // indirect diff --git a/go.sum b/go.sum index e3a7f587a..0d69feaf8 100644 --- a/go.sum +++ b/go.sum @@ -834,8 +834,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -913,8 +913,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc h1:bH6xUXay0AIFMElXG2rQ4uiE+7ncwtiOdPfYK1NK2XA= -golang.org/x/telemetry v0.0.0-20251203150158-8fff8a5912fc/go.mod h1:hKdjCMrbv9skySur+Nek8Hd0uJ0GuxJIoIX2payrIdQ= +golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 h1:O1cMQHRfwNpDfDJerqRoE2oD+AFlyid87D40L/OkkJo= +golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -992,8 +992,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= -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.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= From c0f0576c84a9ead91bf2c9f501f30b007cc8ad24 Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:32:47 +0100 Subject: [PATCH 309/422] chore(deps): update renovatebot/github-action action to v44.2.4 (#1224) Co-authored-by: Renovate Bot --- .github/workflows/renovate.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml index 4716838ca..c2e439819 100644 --- a/.github/workflows/renovate.yaml +++ b/.github/workflows/renovate.yaml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.2.3 + uses: renovatebot/github-action@v44.2.4 with: configurationFile: .github/renovate.json token: ${{ secrets.RENOVATE_TOKEN }} From c00da4622bbc1078a20b1abf3897e961d67d406e Mon Sep 17 00:00:00 2001 From: Robert Gogolok Date: Tue, 13 Jan 2026 11:47:30 +0100 Subject: [PATCH 310/422] feat(goreleaser): Ship FreeBSD binaries (#1048) * feat(goreleaser): Ship FreeBSD binaries * Add FreeBSD installation instructions --------- Co-authored-by: cgoetz-inovex --- .goreleaser.yaml | 11 +++++++++++ INSTALLATION.md | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index b86115c5f..2ef5c2ad1 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -53,6 +53,16 @@ builds: - cmd: sh -c 'go run main.go completion bash > ./dist/completions/stackit.bash' - cmd: sh -c 'go run main.go completion fish > ./dist/completions/stackit.fish' + - id: freebsd-builds + env: + - CGO_ENABLED=0 + goos: + - freebsd + goarch: + - arm64 + - amd64 + binary: "stackit" + archives: - id: windows-archives ids: @@ -61,6 +71,7 @@ archives: - ids: - linux-builds - macos-builds + - freebsd-builds formats: [ 'tar.gz' ] files: - src: ./dist/completions/* diff --git a/INSTALLATION.md b/INSTALLATION.md index c2e7bf751..14976fe69 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -215,6 +215,24 @@ You can also get the STACKIT CLI by compiling it from source or downloading a pr go run . ``` +### FreeBSD + +The STACKIT CLI can be installed through the [FreeBSD ports or packages](https://docs.freebsd.org/en/books/handbook/ports/). + +To install the port: + +```shell +cd /usr/ports/sysutils/stackit/ && make install clean +``` + +To add the package, run one of these commands: + +```shell +pkg install sysutils/stackit +# OR +pkg install stackit +``` + ### Pre-compiled binary 1. Download the binary corresponding to your operating system and CPU architecture from our [Releases](https://github.com/stackitcloud/stackit-cli/releases) page From e2123e2e321248e0d993d0e9e00756b359aaa123 Mon Sep 17 00:00:00 2001 From: Robert Ruf <240721653+RobertRuf@users.noreply.github.com> Date: Tue, 13 Jan 2026 17:10:24 +0100 Subject: [PATCH 311/422] Initial release of the STACKIT Edge-Cloud service CLI (BETA) (#1223) * Add new custom error types * Add new test utils * Initial Release of the STACKIT Edge-Cloud service CLI --- docs/stackit_beta.md | 1 + docs/stackit_beta_edge-cloud.md | 37 + docs/stackit_beta_edge-cloud_instance.md | 38 + ...stackit_beta_edge-cloud_instance_create.md | 43 + ...stackit_beta_edge-cloud_instance_delete.md | 45 + ...ackit_beta_edge-cloud_instance_describe.md | 45 + docs/stackit_beta_edge-cloud_instance_list.md | 44 + ...stackit_beta_edge-cloud_instance_update.md | 50 ++ docs/stackit_beta_edge-cloud_kubeconfig.md | 34 + ...ackit_beta_edge-cloud_kubeconfig_create.md | 61 ++ docs/stackit_beta_edge-cloud_plans.md | 34 + docs/stackit_beta_edge-cloud_plans_list.md | 44 + docs/stackit_beta_edge-cloud_token.md | 34 + docs/stackit_beta_edge-cloud_token_create.md | 49 ++ docs/stackit_config_set.md | 1 + docs/stackit_config_unset.md | 1 + go.mod | 1 + go.sum | 2 + internal/cmd/beta/beta.go | 2 + internal/cmd/beta/edge/edge.go | 34 + .../cmd/beta/edge/instance/create/create.go | 228 +++++ .../beta/edge/instance/create/create_test.go | 419 +++++++++ .../cmd/beta/edge/instance/delete/delete.go | 241 +++++ .../beta/edge/instance/delete/delete_test.go | 557 ++++++++++++ .../beta/edge/instance/describe/describe.go | 203 +++++ .../edge/instance/describe/describe_test.go | 575 ++++++++++++ internal/cmd/beta/edge/instance/instance.go | 38 + internal/cmd/beta/edge/instance/list/list.go | 194 +++++ .../cmd/beta/edge/instance/list/list_test.go | 460 ++++++++++ .../cmd/beta/edge/instance/update/update.go | 281 ++++++ .../beta/edge/instance/update/update_test.go | 541 ++++++++++++ .../cmd/beta/edge/kubeconfig/create/create.go | 396 +++++++++ .../edge/kubeconfig/create/create_test.go | 820 ++++++++++++++++++ .../cmd/beta/edge/kubeconfig/kubeconfig.go | 29 + internal/cmd/beta/edge/plans/list/list.go | 193 +++++ .../cmd/beta/edge/plans/list/list_test.go | 450 ++++++++++ internal/cmd/beta/edge/plans/plans.go | 29 + internal/cmd/beta/edge/token/create/create.go | 291 +++++++ .../cmd/beta/edge/token/create/create_test.go | 675 ++++++++++++++ internal/cmd/beta/edge/token/token.go | 29 + .../profile/import/template/profile.json | 3 +- internal/cmd/config/set/set.go | 4 + internal/cmd/config/unset/unset.go | 7 + internal/cmd/config/unset/unset_test.go | 13 + internal/pkg/config/config.go | 3 + .../pkg/config/template/test_profile.json | 3 +- internal/pkg/errors/errors.go | 136 +++ internal/pkg/errors/errors_test.go | 243 ++++++ internal/pkg/services/edge/client/client.go | 36 + .../pkg/services/edge/common/error/error.go | 85 ++ .../services/edge/common/error/error_test.go | 180 ++++ .../services/edge/common/instance/instance.go | 140 +++ .../edge/common/instance/instance_test.go | 348 ++++++++ .../edge/common/kubeconfig/kubeconfig.go | 361 ++++++++ .../edge/common/kubeconfig/kubeconfig_test.go | 744 ++++++++++++++++ .../services/edge/common/validation/input.go | 51 ++ .../edge/common/validation/input_test.go | 81 ++ internal/pkg/testutils/assert.go | 181 ++++ internal/pkg/testutils/assert_test.go | 227 +++++ internal/pkg/testutils/parse_input.go | 126 +++ internal/pkg/testutils/parse_input_test.go | 169 ++++ 61 files changed, 10388 insertions(+), 2 deletions(-) create mode 100644 docs/stackit_beta_edge-cloud.md create mode 100644 docs/stackit_beta_edge-cloud_instance.md create mode 100644 docs/stackit_beta_edge-cloud_instance_create.md create mode 100644 docs/stackit_beta_edge-cloud_instance_delete.md create mode 100644 docs/stackit_beta_edge-cloud_instance_describe.md create mode 100644 docs/stackit_beta_edge-cloud_instance_list.md create mode 100644 docs/stackit_beta_edge-cloud_instance_update.md create mode 100644 docs/stackit_beta_edge-cloud_kubeconfig.md create mode 100644 docs/stackit_beta_edge-cloud_kubeconfig_create.md create mode 100644 docs/stackit_beta_edge-cloud_plans.md create mode 100644 docs/stackit_beta_edge-cloud_plans_list.md create mode 100644 docs/stackit_beta_edge-cloud_token.md create mode 100644 docs/stackit_beta_edge-cloud_token_create.md create mode 100644 internal/cmd/beta/edge/edge.go create mode 100755 internal/cmd/beta/edge/instance/create/create.go create mode 100755 internal/cmd/beta/edge/instance/create/create_test.go create mode 100755 internal/cmd/beta/edge/instance/delete/delete.go create mode 100755 internal/cmd/beta/edge/instance/delete/delete_test.go create mode 100755 internal/cmd/beta/edge/instance/describe/describe.go create mode 100755 internal/cmd/beta/edge/instance/describe/describe_test.go create mode 100644 internal/cmd/beta/edge/instance/instance.go create mode 100755 internal/cmd/beta/edge/instance/list/list.go create mode 100755 internal/cmd/beta/edge/instance/list/list_test.go create mode 100755 internal/cmd/beta/edge/instance/update/update.go create mode 100755 internal/cmd/beta/edge/instance/update/update_test.go create mode 100755 internal/cmd/beta/edge/kubeconfig/create/create.go create mode 100755 internal/cmd/beta/edge/kubeconfig/create/create_test.go create mode 100644 internal/cmd/beta/edge/kubeconfig/kubeconfig.go create mode 100755 internal/cmd/beta/edge/plans/list/list.go create mode 100755 internal/cmd/beta/edge/plans/list/list_test.go create mode 100644 internal/cmd/beta/edge/plans/plans.go create mode 100755 internal/cmd/beta/edge/token/create/create.go create mode 100755 internal/cmd/beta/edge/token/create/create_test.go create mode 100644 internal/cmd/beta/edge/token/token.go create mode 100644 internal/pkg/services/edge/client/client.go create mode 100755 internal/pkg/services/edge/common/error/error.go create mode 100755 internal/pkg/services/edge/common/error/error_test.go create mode 100644 internal/pkg/services/edge/common/instance/instance.go create mode 100755 internal/pkg/services/edge/common/instance/instance_test.go create mode 100755 internal/pkg/services/edge/common/kubeconfig/kubeconfig.go create mode 100755 internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go create mode 100644 internal/pkg/services/edge/common/validation/input.go create mode 100755 internal/pkg/services/edge/common/validation/input_test.go create mode 100755 internal/pkg/testutils/assert.go create mode 100755 internal/pkg/testutils/assert_test.go create mode 100755 internal/pkg/testutils/parse_input.go create mode 100755 internal/pkg/testutils/parse_input_test.go diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index fab1825e5..a0c177662 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -42,6 +42,7 @@ stackit beta [flags] * [stackit](./stackit.md) - Manage STACKIT resources using the command line * [stackit beta alb](./stackit_beta_alb.md) - Manages application loadbalancers +* [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. * [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) diff --git a/docs/stackit_beta_edge-cloud.md b/docs/stackit_beta_edge-cloud.md new file mode 100644 index 000000000..161433446 --- /dev/null +++ b/docs/stackit_beta_edge-cloud.md @@ -0,0 +1,37 @@ +## stackit beta edge-cloud + +Provides functionality for edge services. + +### Synopsis + +Provides functionality for STACKIT Edge Cloud (STEC) services. + +``` +stackit beta edge-cloud [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta edge-cloud instance](./stackit_beta_edge-cloud_instance.md) - Provides functionality for edge instances. +* [stackit beta edge-cloud kubeconfig](./stackit_beta_edge-cloud_kubeconfig.md) - Provides functionality for edge kubeconfig. +* [stackit beta edge-cloud plans](./stackit_beta_edge-cloud_plans.md) - Provides functionality for edge service plans. +* [stackit beta edge-cloud token](./stackit_beta_edge-cloud_token.md) - Provides functionality for edge service token. + diff --git a/docs/stackit_beta_edge-cloud_instance.md b/docs/stackit_beta_edge-cloud_instance.md new file mode 100644 index 000000000..853ac56f0 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_instance.md @@ -0,0 +1,38 @@ +## stackit beta edge-cloud instance + +Provides functionality for edge instances. + +### Synopsis + +Provides functionality for STACKIT Edge Cloud (STEC) instance management. + +``` +stackit beta edge-cloud instance [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud instance" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. +* [stackit beta edge-cloud instance create](./stackit_beta_edge-cloud_instance_create.md) - Creates an edge instance +* [stackit beta edge-cloud instance delete](./stackit_beta_edge-cloud_instance_delete.md) - Deletes an edge instance +* [stackit beta edge-cloud instance describe](./stackit_beta_edge-cloud_instance_describe.md) - Describes an edge instance +* [stackit beta edge-cloud instance list](./stackit_beta_edge-cloud_instance_list.md) - Lists edge instances +* [stackit beta edge-cloud instance update](./stackit_beta_edge-cloud_instance_update.md) - Updates an edge instance + diff --git a/docs/stackit_beta_edge-cloud_instance_create.md b/docs/stackit_beta_edge-cloud_instance_create.md new file mode 100644 index 000000000..78c123ec1 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_instance_create.md @@ -0,0 +1,43 @@ +## stackit beta edge-cloud instance create + +Creates an edge instance + +### Synopsis + +Creates a STACKIT Edge Cloud (STEC) instance. The instance will take a moment to become fully functional. + +``` +stackit beta edge-cloud instance create [flags] +``` + +### Examples + +``` + Creates an edge instance with the name "xxx" and plan-id "yyy" + $ stackit beta edge-cloud instance create --name "xxx" --plan-id "yyy" +``` + +### Options + +``` + -d, --description string A user chosen description to distinguish multiple instances. + -h, --help Help for "stackit beta edge-cloud instance create" + -n, --name string The displayed name to distinguish multiple instances. + --plan-id string Service Plan configures the size of the Instance. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud instance](./stackit_beta_edge-cloud_instance.md) - Provides functionality for edge instances. + diff --git a/docs/stackit_beta_edge-cloud_instance_delete.md b/docs/stackit_beta_edge-cloud_instance_delete.md new file mode 100644 index 000000000..b8aa5834d --- /dev/null +++ b/docs/stackit_beta_edge-cloud_instance_delete.md @@ -0,0 +1,45 @@ +## stackit beta edge-cloud instance delete + +Deletes an edge instance + +### Synopsis + +Deletes a STACKIT Edge Cloud (STEC) instance. The instance will be deleted permanently. + +``` +stackit beta edge-cloud instance delete [flags] +``` + +### Examples + +``` + Delete an edge instance with id "xxx" + $ stackit beta edge-cloud instance delete --id "xxx" + + Delete an edge instance with name "xxx" + $ stackit beta edge-cloud instance delete --name "xxx" +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud instance delete" + -i, --id string The project-unique identifier of this instance. + -n, --name string The displayed name to distinguish multiple instances. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud instance](./stackit_beta_edge-cloud_instance.md) - Provides functionality for edge instances. + diff --git a/docs/stackit_beta_edge-cloud_instance_describe.md b/docs/stackit_beta_edge-cloud_instance_describe.md new file mode 100644 index 000000000..534bc9cf0 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_instance_describe.md @@ -0,0 +1,45 @@ +## stackit beta edge-cloud instance describe + +Describes an edge instance + +### Synopsis + +Describes a STACKIT Edge Cloud (STEC) instance. + +``` +stackit beta edge-cloud instance describe [flags] +``` + +### Examples + +``` + Describe an edge instance with id "xxx" + $ stackit beta edge-cloud instance describe --id + + Describe an edge instance with name "xxx" + $ stackit beta edge-cloud instance describe --name +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud instance describe" + -i, --id string The project-unique identifier of this instance. + -n, --name string The displayed name to distinguish multiple instances. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud instance](./stackit_beta_edge-cloud_instance.md) - Provides functionality for edge instances. + diff --git a/docs/stackit_beta_edge-cloud_instance_list.md b/docs/stackit_beta_edge-cloud_instance_list.md new file mode 100644 index 000000000..e605d6f64 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_instance_list.md @@ -0,0 +1,44 @@ +## stackit beta edge-cloud instance list + +Lists edge instances + +### Synopsis + +Lists STACKIT Edge Cloud (STEC) instances of a project. + +``` +stackit beta edge-cloud instance list [flags] +``` + +### Examples + +``` + Lists all edge instances of a given project + $ stackit beta edge-cloud instance list + + Lists all edge instances of a given project and limits the output to two instances + $ stackit beta edge-cloud instance list --limit 2 +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud instance list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud instance](./stackit_beta_edge-cloud_instance.md) - Provides functionality for edge instances. + diff --git a/docs/stackit_beta_edge-cloud_instance_update.md b/docs/stackit_beta_edge-cloud_instance_update.md new file mode 100644 index 000000000..9f3cb39b7 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_instance_update.md @@ -0,0 +1,50 @@ +## stackit beta edge-cloud instance update + +Updates an edge instance + +### Synopsis + +Updates a STACKIT Edge Cloud (STEC) instance. + +``` +stackit beta edge-cloud instance update [flags] +``` + +### Examples + +``` + Updates the description of an edge instance with id "xxx" + $ stackit beta edge-cloud instance update --id "xxx" --description "yyy" + + Updates the plan of an edge instance with name "xxx" + $ stackit beta edge-cloud instance update --name "xxx" --plan-id "yyy" + + Updates the description and plan of an edge instance with id "xxx" + $ stackit beta edge-cloud instance update --id "xxx" --description "yyy" --plan-id "zzz" +``` + +### Options + +``` + -d, --description string A user chosen description to distinguish multiple instances. + -h, --help Help for "stackit beta edge-cloud instance update" + -i, --id string The project-unique identifier of this instance. + -n, --name string The displayed name to distinguish multiple instances. + --plan-id string Service Plan configures the size of the Instance. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud instance](./stackit_beta_edge-cloud_instance.md) - Provides functionality for edge instances. + diff --git a/docs/stackit_beta_edge-cloud_kubeconfig.md b/docs/stackit_beta_edge-cloud_kubeconfig.md new file mode 100644 index 000000000..be5078f00 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_kubeconfig.md @@ -0,0 +1,34 @@ +## stackit beta edge-cloud kubeconfig + +Provides functionality for edge kubeconfig. + +### Synopsis + +Provides functionality for STACKIT Edge Cloud (STEC) kubeconfig management. + +``` +stackit beta edge-cloud kubeconfig [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud kubeconfig" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. +* [stackit beta edge-cloud kubeconfig create](./stackit_beta_edge-cloud_kubeconfig_create.md) - Creates or updates a local kubeconfig file of an edge instance + diff --git a/docs/stackit_beta_edge-cloud_kubeconfig_create.md b/docs/stackit_beta_edge-cloud_kubeconfig_create.md new file mode 100644 index 000000000..2d9a5ad40 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_kubeconfig_create.md @@ -0,0 +1,61 @@ +## stackit beta edge-cloud kubeconfig create + +Creates or updates a local kubeconfig file of an edge instance + +### Synopsis + +Creates or updates a local kubeconfig file of a STACKIT Edge Cloud (STEC) instance. If the config exists in the kubeconfig file, the information will be updated. + +By default, the kubeconfig information of the edge instance is merged into the current kubeconfig file which is determined by Kubernetes client logic. If the kubeconfig file doesn't exist, a new one will be created. +You can override this behavior by specifying a custom filepath with the --filepath flag or disable writing with the --disable-writing flag. +An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 3600 seconds. +Note: the format for the duration is , e.g. 30d for 30 days. You may not combine units. + +``` +stackit beta edge-cloud kubeconfig create [flags] +``` + +### Examples + +``` + Create or update a kubeconfig for the edge instance with id "xxx". If the config exists in the kubeconfig file, the information will be updated. + $ stackit beta edge-cloud kubeconfig create --id "xxx" + + Create or update a kubeconfig for the edge instance with name "xxx" in a custom filepath. + $ stackit beta edge-cloud kubeconfig create --name "xxx" --filepath "yyy" + + Get a kubeconfig for the edge instance with name "xxx" without writing it to a file and format the output as json. + $ stackit beta edge-cloud kubeconfig create --name "xxx" --disable-writing --output-format json + + Create a kubeconfig for the edge instance with id "xxx". This will replace your current kubeconfig file. + $ stackit beta edge-cloud kubeconfig create --id "xxx" --overwrite +``` + +### Options + +``` + --disable-writing Disable writing the kubeconfig to a file. + -e, --expiration string Expiration time for the kubeconfig, e.g. 5d. By default, the token is valid for 1h. + -f, --filepath string Path to the kubeconfig file. A default is chosen by Kubernetes if not set. + -h, --help Help for "stackit beta edge-cloud kubeconfig create" + -i, --id string The project-unique identifier of this instance. + -n, --name string The displayed name to distinguish multiple instances. + --overwrite Force overwrite the kubeconfig file if it exists. + --switch-context Switch to the context in the kubeconfig file to the new context. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud kubeconfig](./stackit_beta_edge-cloud_kubeconfig.md) - Provides functionality for edge kubeconfig. + diff --git a/docs/stackit_beta_edge-cloud_plans.md b/docs/stackit_beta_edge-cloud_plans.md new file mode 100644 index 000000000..c58e5a8e1 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_plans.md @@ -0,0 +1,34 @@ +## stackit beta edge-cloud plans + +Provides functionality for edge service plans. + +### Synopsis + +Provides functionality for STACKIT Edge Cloud (STEC) service plan management. + +``` +stackit beta edge-cloud plans [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud plans" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. +* [stackit beta edge-cloud plans list](./stackit_beta_edge-cloud_plans_list.md) - Lists available edge service plans + diff --git a/docs/stackit_beta_edge-cloud_plans_list.md b/docs/stackit_beta_edge-cloud_plans_list.md new file mode 100644 index 000000000..a57c7e197 --- /dev/null +++ b/docs/stackit_beta_edge-cloud_plans_list.md @@ -0,0 +1,44 @@ +## stackit beta edge-cloud plans list + +Lists available edge service plans + +### Synopsis + +Lists available STACKIT Edge Cloud (STEC) service plans of a project + +``` +stackit beta edge-cloud plans list [flags] +``` + +### Examples + +``` + Lists all edge plans for a given project + $ stackit beta edge-cloud plan list + + Lists all edge plans for a given project and limits the output to two plans + $ stackit beta edge-cloud plan list --limit 2 +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud plans list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud plans](./stackit_beta_edge-cloud_plans.md) - Provides functionality for edge service plans. + diff --git a/docs/stackit_beta_edge-cloud_token.md b/docs/stackit_beta_edge-cloud_token.md new file mode 100644 index 000000000..ba7fe0b3a --- /dev/null +++ b/docs/stackit_beta_edge-cloud_token.md @@ -0,0 +1,34 @@ +## stackit beta edge-cloud token + +Provides functionality for edge service token. + +### Synopsis + +Provides functionality for STACKIT Edge Cloud (STEC) token management. + +``` +stackit beta edge-cloud token [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta edge-cloud token" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. +* [stackit beta edge-cloud token create](./stackit_beta_edge-cloud_token_create.md) - Creates a token for an edge instance + diff --git a/docs/stackit_beta_edge-cloud_token_create.md b/docs/stackit_beta_edge-cloud_token_create.md new file mode 100644 index 000000000..4d96d548c --- /dev/null +++ b/docs/stackit_beta_edge-cloud_token_create.md @@ -0,0 +1,49 @@ +## stackit beta edge-cloud token create + +Creates a token for an edge instance + +### Synopsis + +Creates a token for a STACKIT Edge Cloud (STEC) instance. + +An expiration time can be set for the token. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 3600 seconds. +Note: the format for the duration is , e.g. 30d for 30 days. You may not combine units. + +``` +stackit beta edge-cloud token create [flags] +``` + +### Examples + +``` + Create a token for the edge instance with id "xxx". + $ stackit beta edge-cloud token create --id "xxx" + + Create a token for the edge instance with name "xxx". The token will be valid for one day. + $ stackit beta edge-cloud token create --name "xxx" --expiration 1d +``` + +### Options + +``` + -e, --expiration string Expiration time for the kubeconfig, e.g. 5d. By default, the token is valid for 1h. + -h, --help Help for "stackit beta edge-cloud token create" + -i, --id string The project-unique identifier of this instance. + -n, --name string The displayed name to distinguish multiple instances. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta edge-cloud token](./stackit_beta_edge-cloud_token.md) - Provides functionality for edge service token. + diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index b9a4e81a1..211bc1113 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -32,6 +32,7 @@ stackit config set [flags] --allowed-url-domain string Domain name, used for the verification of the URLs that are given in the custom identity provider endpoint and "STACKIT curl" command --authorization-custom-endpoint string Authorization API base URL, used in calls to this API --dns-custom-endpoint string DNS API base URL, used in calls to this API + --edge-custom-endpoint string Edge API base URL, used in calls to this API -h, --help Help for "stackit config set" --iaas-custom-endpoint string IaaS API base URL, used in calls to this API --identity-provider-custom-client-id string Identity Provider client ID, used for user authentication diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 9e005607b..07b161c8c 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -30,6 +30,7 @@ stackit config unset [flags] --async Configuration option to run commands asynchronously --authorization-custom-endpoint Authorization API base URL. If unset, uses the default base URL --dns-custom-endpoint DNS API base URL. If unset, uses the default base URL + --edge-custom-endpoint Edge API base URL. If unset, uses the default base URL -h, --help Help for "stackit config unset" --iaas-custom-endpoint IaaS API base URL. If unset, uses the default base URL --identity-provider-custom-client-id Identity Provider client ID, used for user authentication diff --git a/go.mod b/go.mod index 656654080..819818a8b 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 + github.com/stackitcloud/stackit-sdk-go/services/edge v0.2.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 diff --git a/go.sum b/go.sum index 0d69feaf8..6c2cf3173 100644 --- a/go.sum +++ b/go.sum @@ -608,6 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.2.0 h1:ElmnEg3V4MisAgqqJFxl3nCmKraxbHtN+vv1DNiWYfM= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.2.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index 935791cb9..973a87c21 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -6,6 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs" @@ -43,6 +44,7 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(sqlserverflex.NewCmd(params)) cmd.AddCommand(sfs.NewCmd(params)) cmd.AddCommand(alb.NewCmd(params)) + cmd.AddCommand(edge.NewCmd(params)) cmd.AddCommand(intake.NewCmd(params)) cmd.AddCommand(kms.NewCmd(params)) } diff --git a/internal/cmd/beta/edge/edge.go b/internal/cmd/beta/edge/edge.go new file mode 100644 index 000000000..11d1b1e16 --- /dev/null +++ b/internal/cmd/beta/edge/edge.go @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package edge + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/kubeconfig" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/plans" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/token" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "edge-cloud", + Short: "Provides functionality for edge services.", + Long: "Provides functionality for STACKIT Edge Cloud (STEC) services.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(plans.NewCmd(params)) + cmd.AddCommand(kubeconfig.NewCmd(params)) + cmd.AddCommand(token.NewCmd(params)) +} diff --git a/internal/cmd/beta/edge/instance/create/create.go b/internal/cmd/beta/edge/instance/create/create.go new file mode 100755 index 000000000..bc264ddb5 --- /dev/null +++ b/internal/cmd/beta/edge/instance/create/create.go @@ -0,0 +1,228 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" +) + +// Command constructor +// Instance id and displayname are likely to be refactored in future. For the time being we decided to use flags +// instead of args to provide the instance-id xor displayname to uniquely identify an instance. The displayname +// is guaranteed to be unique within a given project as of today. The chosen flag over args approach ensures we +// won't need a breaking change of the CLI when we refactor the commands to take the identifier as arg at some point. +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates an edge instance", + Long: "Creates a STACKIT Edge Cloud (STEC) instance. The instance will take a moment to become fully functional.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + fmt.Sprintf(`Creates an edge instance with the %s "xxx" and %s "yyy"`, commonInstance.DisplayNameFlag, commonInstance.PlanIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance create --%s "xxx" --%s "yyy"`, commonInstance.DisplayNameFlag, commonInstance.PlanIdFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + // If project label can't be determined, fall back to project ID + projectLabel = model.ProjectId + } + + // Prompt for confirmation + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to create a new edge instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + resp, err := run(ctx, model, apiClient) + if err != nil { + return err + } + if resp == nil { + return fmt.Errorf("create instance: empty response from API") + } + if resp.Id == nil { + return fmt.Errorf("create instance: instance id missing in response") + } + instanceId := *resp.Id + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating instance") + // The waiter handler needs a concrete client type. We can safely cast here as the real implementation will always match. + client, ok := apiClient.(*edge.APIClient) + if !ok { + return fmt.Errorf("failed to configure API client") + } + _, err = wait.CreateOrUpdateInstanceWaitHandler(ctx, client, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + + if err != nil { + return fmt.Errorf("wait for edge instance creation: %w", err) + } + s.Stop() + } + + // Handle output to printer + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +// inputModel represents the user input for creating an edge instance. +type inputModel struct { + *globalflags.GlobalFlagModel + DisplayName string + Description string + PlanId string +} + +// createRequestSpec captures the details of the request for testing. +type createRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + Payload edge.PostInstancesPayload + + // Execute is a closure that wraps the actual SDK call + Execute func() (*edge.Instance, error) +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(commonInstance.DisplayNameFlag, commonInstance.DisplayNameShorthand, "", commonInstance.DisplayNameUsage) + cmd.Flags().StringP(commonInstance.DescriptionFlag, commonInstance.DescriptionShorthand, "", commonInstance.DescriptionUsage) + cmd.Flags().String(commonInstance.PlanIdFlag, "", commonInstance.PlanIdUsage) + + cobra.CheckErr(flags.MarkFlagsRequired(cmd, commonInstance.DisplayNameFlag, commonInstance.PlanIdFlag)) +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Parse and validate user input then add it to the model + displayNameValue := flags.FlagToStringPointer(p, cmd, commonInstance.DisplayNameFlag) + if err := commonInstance.ValidateDisplayName(displayNameValue); err != nil { + return nil, err + } + + planIdValue := flags.FlagToStringPointer(p, cmd, commonInstance.PlanIdFlag) + if err := commonInstance.ValidatePlanId(planIdValue); err != nil { + return nil, err + } + + descriptionValue := flags.FlagWithDefaultToStringValue(p, cmd, commonInstance.DescriptionFlag) + if err := commonInstance.ValidateDescription(descriptionValue); err != nil { + return nil, err + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + DisplayName: *displayNameValue, + Description: descriptionValue, + PlanId: *planIdValue, + } + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) (*edge.Instance, error) { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return nil, err + } + + resp, err := spec.Execute() + if err != nil { + return nil, cliErr.NewRequestFailedError(err) + } + + return resp, nil +} + +// buildRequest constructs the spec that can be tested. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*createRequestSpec, error) { + req := apiClient.PostInstances(ctx, model.ProjectId, model.Region) + + // Build request payload + payload := edge.PostInstancesPayload{ + DisplayName: &model.DisplayName, + Description: &model.Description, + PlanId: &model.PlanId, + } + req = req.PostInstancesPayload(payload) + + return &createRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + Payload: payload, + Execute: req.Execute, + }, nil +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel string, instance *edge.Instance) error { + if instance == nil { + // This is only to prevent nil pointer deref. + // As long as the API behaves as defined by it's spec, instance can not be empty (HTTP 200 with an empty body) + return commonErr.NewNoInstanceError("") + } + + return p.OutputResult(outputFormat, instance, func() error { + operationState := "Created" + if async { + operationState = "Triggered creation of" + } + p.Outputf("%s instance for project %q. Instance ID: %q.\n", operationState, projectLabel, utils.PtrString(instance.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/edge/instance/create/create_test.go b/internal/cmd/beta/edge/instance/create/create_test.go new file mode 100755 index 000000000..bbec4b074 --- /dev/null +++ b/internal/cmd/beta/edge/instance/create/create_test.go @@ -0,0 +1,419 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package create + +import ( + "context" + "errors" + "strings" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" + + testName = "test" + testPlanId = uuid.NewString() + testDescription = "Initial instance description" + testInstanceId = uuid.NewString() +) + +// mockExecutable is a mock for the Executable interface used by the SDK +type mockExecutable struct { + executeFails bool + resp *edge.Instance +} + +func (m *mockExecutable) PostInstancesPayload(_ edge.PostInstancesPayload) edge.ApiPostInstancesRequest { + // This method is needed to satisfy the interface. It allows chaining in buildRequest. + return m +} +func (m *mockExecutable) Execute() (*edge.Instance, error) { + if m.executeFails { + return nil, errors.New("API error") + } + if m.resp != nil { + return m.resp, nil + } + return &edge.Instance{Id: &testInstanceId}, nil +} + +// mockAPIClient is a mock for the client.APIClient interface +type mockAPIClient struct { + postInstancesMock edge.ApiPostInstancesRequest +} + +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + if m.postInstancesMock != nil { + return m.postInstancesMock + } + return &mockExecutable{} +} + +// Unused methods to satisfy the client.APIClient interface +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + commonInstance.DisplayNameFlag: testName, + commonInstance.DescriptionFlag: testDescription, + commonInstance.PlanIdFlag: testPlanId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + DisplayName: testName, + Description: testDescription, + PlanId: testPlanId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "create success", + want: fixtureInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}, globalflags.GlobalFlagModel{}), + }, + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "name missing", + wantErr: "required flag(s) \"name\" not set", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.DisplayNameFlag) + }), + }, + }, + { + name: "name too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = "this-name-is-way-too-long-for-the-validation" + }), + }, + }, + { + name: "name too short", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = "in" + }), + }, + }, + { + name: "name invalid", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = "1test" + }), + }, + }, + { + name: "plan invalid", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.PlanIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "description too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DescriptionFlag] = strings.Repeat("a", 257) + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + tests := []struct { + name string + args args + want *createRequestSpec + }{ + { + name: "success", + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + postInstancesMock: &mockExecutable{}, + }, + }, + want: &createRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + Payload: edge.PostInstancesPayload{ + DisplayName: &testName, + Description: &testDescription, + PlanId: &testPlanId, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, _ := buildRequest(testCtx, tt.args.model, tt.args.client) + + if got != nil { + if got.Execute == nil { + t.Error("expected non-nil Execute function") + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(createRequestSpec{}, "Execute")) + } + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *edge.Instance + args args + }{ + { + name: "create success", + want: &edge.Instance{Id: &testInstanceId}, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + postInstancesMock: &mockExecutable{ + resp: &edge.Instance{Id: &testInstanceId}, + }, + }, + }, + }, + { + name: "create API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + postInstancesMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := run(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + instance *edge.Instance + projectLabel string + } + + tests := []struct { + name string + wantErr error + args args + }{ + { + name: "no instance", + wantErr: &commonErr.NoInstanceError{}, + args: args{ + model: fixtureInputModel(), + }, + }, + { + name: "output json", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + instance: &edge.Instance{}, + }, + }, + { + name: "output yaml", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + }), + instance: &edge.Instance{}, + }, + }, + { + name: "output default", + args: args{ + model: fixtureInputModel(), + instance: &edge.Instance{Id: &testInstanceId}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + err := outputResult(p, tt.args.model.OutputFormat, tt.args.model.Async, tt.args.projectLabel, tt.args.instance) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} diff --git a/internal/cmd/beta/edge/instance/delete/delete.go b/internal/cmd/beta/edge/instance/delete/delete.go new file mode 100755 index 000000000..d6650e7e6 --- /dev/null +++ b/internal/cmd/beta/edge/instance/delete/delete.go @@ -0,0 +1,241 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" +) + +// Struct to model user input (arguments and/or flags) +type inputModel struct { + *globalflags.GlobalFlagModel + identifier *commonValidation.Identifier +} + +// deleteRequestSpec captures the details of a request for testing. +type deleteRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + InstanceId string // Set if deleting by ID + InstanceName string // Set if deleting by Name + + // Execute is a closure that wraps the actual SDK call + Execute func() error +} + +// OpenApi generated code will have different types for by-instance-id and by-display-name API calls and therefore different wait handlers. +// InstanceWaiter is an interface to abstract the different wait handlers so they can be used interchangeably. +type instanceWaiter interface { + WaitWithContext(context.Context) (*edge.Instance, error) +} + +// A function that creates an instance waiter +type instanceWaiterFactory = func(client *edge.APIClient) instanceWaiter + +// Command constructor +// Instance id and displayname are likely to be refactored in future. For the time being we decided to use flags +// instead of args to provide the instance-id xor displayname to uniquely identify an instance. The displayname +// is guaranteed to be unique within a given project as of today. The chosen flag over args approach ensures we +// won't need a breaking change of the CLI when we refactor the commands to take the identifier as arg at some point. +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete", + Short: "Deletes an edge instance", + Long: "Deletes a STACKIT Edge Cloud (STEC) instance. The instance will be deleted permanently.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + fmt.Sprintf(`Delete an edge instance with %s "xxx"`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance delete --%s "xxx"`, commonInstance.InstanceIdFlag)), + examples.NewExample( + fmt.Sprintf(`Delete an edge instance with %s "xxx"`, commonInstance.DisplayNameFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance delete --%s "xxx"`, commonInstance.DisplayNameFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + // If project label can't be determined, fall back to project ID + projectLabel = model.ProjectId + } + + // Prompt for confirmation + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to delete the edge instance %q of project %q?", model.identifier.Value, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + err = run(ctx, model, apiClient) + if err != nil { + return err + } + + // Wait for async operation, if async mode not enabled + operationState := "Triggered deletion of" + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Deleting instance") + // Determine identifier and waiter to use + waiterFactory, err := getWaiterFactory(ctx, model) + if err != nil { + return err + } + // The waiter factory needs a concrete client type. We can safely cast here as the real implementation will always match. + client, ok := apiClient.(*edge.APIClient) + if !ok { + return fmt.Errorf("failed to configure API client") + } + waiter := waiterFactory(client) + + if _, err = waiter.WaitWithContext(ctx); err != nil { + return fmt.Errorf("wait for edge instance deletion: %w", err) + } + operationState = "Deleted" + s.Stop() + } + + params.Printer.Info("%s instance with %q %q of project %q.\n", operationState, model.identifier.Flag, model.identifier.Value, projectLabel) + + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(commonInstance.InstanceIdFlag, commonInstance.InstanceIdShorthand, "", commonInstance.InstanceIdUsage) + cmd.Flags().StringP(commonInstance.DisplayNameFlag, commonInstance.DisplayNameShorthand, "", commonInstance.DisplayNameUsage) + + identifierFlags := []string{commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag} + cmd.MarkFlagsMutuallyExclusive(identifierFlags...) // InstanceId xor DisplayName + cmd.MarkFlagsOneRequired(identifierFlags...) +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Generate input model based on chosen flags + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + // Parse and validate user input then add it to the model + id, err := commonValidation.GetValidatedInstanceIdentifier(p, cmd) + if err != nil { + return nil, err + } + model.identifier = id + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) error { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return err + } + + if err := spec.Execute(); err != nil { + return cliErr.NewRequestFailedError(err) + } + + return nil +} + +// buildRequest constructs the spec that can be tested. +// It handles the logic of choosing between DeleteInstance and DeleteInstanceByName. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*deleteRequestSpec, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + spec := &deleteRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + } + + // Switch the concrete client based on the identifier flag used + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + spec.InstanceId = model.identifier.Value + req := apiClient.DeleteInstance(ctx, model.ProjectId, model.Region, model.identifier.Value) + spec.Execute = req.Execute + case commonInstance.DisplayNameFlag: + spec.InstanceName = model.identifier.Value + req := apiClient.DeleteInstanceByName(ctx, model.ProjectId, model.Region, model.identifier.Value) + spec.Execute = req.Execute + default: + return nil, fmt.Errorf("%w: %w", cliErr.NewBuildRequestError("invalid identifier flag", nil), commonErr.NewInvalidIdentifierError(model.identifier.Flag)) + } + + return spec, nil +} + +// Returns a factory function to create the appropriate waiter based on the input model. +func getWaiterFactory(ctx context.Context, model *inputModel) (instanceWaiterFactory, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + factory := func(c *edge.APIClient) instanceWaiter { + return wait.DeleteInstanceWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value) + } + return factory, nil + case commonInstance.DisplayNameFlag: + factory := func(c *edge.APIClient) instanceWaiter { + return wait.DeleteInstanceByNameWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value) + } + return factory, nil + default: + return nil, commonErr.NewInvalidIdentifierError(model.identifier.Flag) + } +} diff --git a/internal/cmd/beta/edge/instance/delete/delete_test.go b/internal/cmd/beta/edge/instance/delete/delete_test.go new file mode 100755 index 000000000..2772b8c97 --- /dev/null +++ b/internal/cmd/beta/edge/instance/delete/delete_test.go @@ -0,0 +1,557 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package delete + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" + + testInstanceId = "instance" + testDisplayName = "test" +) + +// mockExecutable implements the SDK delete request interface for testing. +type mockExecutable struct { + executeFails bool + executeNotFound bool +} + +func (m *mockExecutable) Execute() error { + if m.executeNotFound { + return &oapierror.GenericOpenAPIError{ + StatusCode: http.StatusNotFound, + Body: []byte(`{"message":"not found"}`), + } + } + if m.executeFails { + return errors.New("execute failed") + } + return nil +} + +// mockAPIClient provides the minimal API client behavior required by the tests. +type mockAPIClient struct { + deleteInstanceMock edge.ApiDeleteInstanceRequest + deleteInstanceByNameMock edge.ApiDeleteInstanceByNameRequest +} + +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + if m.deleteInstanceMock != nil { + return m.deleteInstanceMock + } + return &mockExecutable{} +} + +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + if m.deleteInstanceByNameMock != nil { + return m.deleteInstanceByNameMock + } + return &mockExecutable{} +} + +// Unused methods to satisfy the client.APIClient interface. +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func fixtureFlagValues(mods ...func(map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + commonInstance.InstanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(useDisplayName bool, mods ...func(*inputModel)) *inputModel { + identifier := &commonValidation.Identifier{ + Flag: commonInstance.InstanceIdFlag, + Value: testInstanceId, + } + if useDisplayName { + identifier = &commonValidation.Identifier{ + Flag: commonInstance.DisplayNameFlag, + Value: testDisplayName, + } + } + + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + identifier: identifier, + } + + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureByIdInputModel(mods ...func(*inputModel)) *inputModel { + return fixtureInputModel(false, mods...) +} + +func fixtureByNameInputModel(mods ...func(*inputModel)) *inputModel { + return fixtureInputModel(true, mods...) +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "by id", + want: fixtureByIdInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}, globalflags.GlobalFlagModel{}), + }, + }, + }, + { + name: "by name", + want: fixtureByNameInputModel(), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}, globalflags.GlobalFlagModel{}), + }, + }, + }, + { + name: "by id and name", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "instance id empty", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "" + }), + }, + }, + { + name: "instance id too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "invalid-instance-id" + }), + }, + }, + { + name: "instance id too short", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "id" + }), + }, + }, + { + name: "name too short", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foo" + }), + }, + }, + { + name: "name too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foofoofoo" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + tests := []struct { + name string + args args + wantErr error + }{ + { + name: "delete by id success", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + deleteInstanceMock: &mockExecutable{}, + }, + }, + }, + { + name: "delete by id API error", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + deleteInstanceMock: &mockExecutable{executeFails: true}, + }, + }, + wantErr: &cliErr.RequestFailedError{}, + }, + { + name: "delete by id not found", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + deleteInstanceMock: &mockExecutable{executeNotFound: true}, + }, + }, + wantErr: &cliErr.RequestFailedError{}, + }, + { + name: "delete by name success", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + deleteInstanceByNameMock: &mockExecutable{}, + }, + }, + }, + { + name: "delete by name API error", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + deleteInstanceByNameMock: &mockExecutable{executeFails: true}, + }, + }, + wantErr: &cliErr.RequestFailedError{}, + }, + { + name: "delete by name not found", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + deleteInstanceByNameMock: &mockExecutable{executeNotFound: true}, + }, + }, + wantErr: &cliErr.RequestFailedError{}, + }, + { + name: "no identifier", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + wantErr: &commonErr.NoIdentifierError{}, + }, + { + name: "invalid identifier", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = &commonValidation.Identifier{Flag: "unknown", Value: "value"} + }), + client: &mockAPIClient{}, + }, + wantErr: &cliErr.BuildRequestError{}, + }, + { + name: "nil model", + args: args{ + model: nil, + client: &mockAPIClient{}, + }, + wantErr: &commonErr.NoIdentifierError{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := run(testCtx, tt.args.model, tt.args.client) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + tests := []struct { + name string + args args + want *deleteRequestSpec + wantErr error + }{ + { + name: "by id", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + deleteInstanceMock: &mockExecutable{}, + }, + }, + want: &deleteRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceId: testInstanceId, + }, + }, + { + name: "by name", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + deleteInstanceByNameMock: &mockExecutable{}, + }, + }, + want: &deleteRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceName: testDisplayName, + }, + }, + { + name: "no identifier", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + wantErr: &commonErr.NoIdentifierError{}, + }, + { + name: "invalid identifier", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = &commonValidation.Identifier{Flag: "unknown", Value: "val"} + }), + client: &mockAPIClient{}, + }, + wantErr: &cliErr.BuildRequestError{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + if got != nil { + if got.Execute == nil { + t.Error("expected non-nil Execute function") + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(deleteRequestSpec{}, "Execute")) + } + }) + } +} + +func TestGetWaiterFactory(t *testing.T) { + type args struct { + model *inputModel + } + + tests := []struct { + name string + wantErr error + want bool + args args + }{ + { + name: "by id identifier", + want: true, + args: args{ + model: fixtureByIdInputModel(), + }, + }, + { + name: "by name identifier", + want: true, + args: args{ + model: fixtureByNameInputModel(), + }, + }, + { + name: "nil model", + wantErr: &commonErr.NoIdentifierError{}, + want: false, + args: args{ + model: nil, + }, + }, + { + name: "nil identifier", + wantErr: &commonErr.NoIdentifierError{}, + want: false, + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = nil + }), + }, + }, + { + name: "invalid identifier", + wantErr: &commonErr.InvalidIdentifierError{}, + want: false, + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = &commonValidation.Identifier{Flag: "unsupported", Value: "value"} + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getWaiterFactory(testCtx, tt.args.model) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + if tt.want && got == nil { + t.Fatal("expected non-nil waiter factory") + } + if !tt.want && got != nil { + t.Fatal("expected nil waiter factory") + } + }) + } +} diff --git a/internal/cmd/beta/edge/instance/describe/describe.go b/internal/cmd/beta/edge/instance/describe/describe.go new file mode 100755 index 000000000..5a7d85ed6 --- /dev/null +++ b/internal/cmd/beta/edge/instance/describe/describe.go @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + identifier *commonValidation.Identifier +} + +// describeRequestSpec captures the details of the request for testing. +type describeRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + InstanceId string // Set if describing by ID + InstanceName string // Set if describing by Name + + // Execute is a closure that wraps the actual SDK call + Execute func() (*edge.Instance, error) +} + +// Command constructor +// Instance id and displayname are likely to be refactored in future. For the time being we decided to use flags +// instead of args to provide the instance-id xor displayname to uniquely identify an instance. The displayname +// is guaranteed to be unique within a given project as of today. The chosen flag over args approach ensures we +// won't need a breaking change of the CLI when we refactor the commands to take the identifier as arg at some point. +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "describe", + Short: "Describes an edge instance", + Long: "Describes a STACKIT Edge Cloud (STEC) instance.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + fmt.Sprintf(`Describe an edge instance with %s "xxx"`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance describe --%s `, commonInstance.InstanceIdFlag)), + examples.NewExample( + fmt.Sprintf(`Describe an edge instance with %s "xxx"`, commonInstance.DisplayNameFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance describe --%s `, commonInstance.DisplayNameFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + resp, err := run(ctx, model, apiClient) + if err != nil { + return err + } + + // Handle output to printer + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(commonInstance.InstanceIdFlag, commonInstance.InstanceIdShorthand, "", commonInstance.InstanceIdUsage) + cmd.Flags().StringP(commonInstance.DisplayNameFlag, commonInstance.DisplayNameShorthand, "", commonInstance.DisplayNameUsage) + + identifierFlags := []string{commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag} + cmd.MarkFlagsMutuallyExclusive(identifierFlags...) // InstanceId xor DisplayName + cmd.MarkFlagsOneRequired(identifierFlags...) +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Generate input model based on chosen flags + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + // Parse and validate user input then add it to the model + id, err := commonValidation.GetValidatedInstanceIdentifier(p, cmd) + if err != nil { + return nil, err + } + model.identifier = id + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) (*edge.Instance, error) { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return nil, err + } + + resp, err := spec.Execute() + if err != nil { + return nil, cliErr.NewRequestFailedError(err) + } + + return resp, nil +} + +// buildRequest constructs the spec that can be tested. +// It handles the logic of choosing between GetInstance and GetInstanceByName. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*describeRequestSpec, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + spec := &describeRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + } + + // Switch the concrete client based on the identifier flag used + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + spec.InstanceId = model.identifier.Value + req := apiClient.GetInstance(ctx, model.ProjectId, model.Region, model.identifier.Value) + spec.Execute = req.Execute + case commonInstance.DisplayNameFlag: + spec.InstanceName = model.identifier.Value + req := apiClient.GetInstanceByName(ctx, model.ProjectId, model.Region, model.identifier.Value) + spec.Execute = req.Execute + default: + return nil, fmt.Errorf("%w: %w", cliErr.NewBuildRequestError("invalid identifier flag", nil), commonErr.NewInvalidIdentifierError(model.identifier.Flag)) + } + + return spec, nil +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, outputFormat string, instance *edge.Instance) error { + if instance == nil { + // This is only to prevent nil pointer deref. + // As long as the API behaves as defined by it's spec, instance can not be empty (HTTP 200 with an empty body) + return commonErr.NewNoInstanceError("") + } + + return p.OutputResult(outputFormat, instance, func() error { + table := tables.NewTable() + // Describe: output all fields. Be sure to filter for any non-required fields. + table.AddRow("CREATED", utils.PtrString(instance.Created)) + table.AddSeparator() + table.AddRow("ID", utils.PtrString(instance.Id)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(instance.DisplayName)) + table.AddSeparator() + if instance.HasDescription() { + table.AddRow("DESCRIPTION", utils.PtrString(instance.Description)) + table.AddSeparator() + } + table.AddRow("UI", utils.PtrString(instance.FrontendUrl)) + table.AddSeparator() + table.AddRow("STATE", utils.PtrString(instance.Status)) + table.AddSeparator() + table.AddRow("PLAN", utils.PtrString(instance.PlanId)) + table.AddSeparator() + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/edge/instance/describe/describe_test.go b/internal/cmd/beta/edge/instance/describe/describe_test.go new file mode 100755 index 000000000..1f08cd0c6 --- /dev/null +++ b/internal/cmd/beta/edge/instance/describe/describe_test.go @@ -0,0 +1,575 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package describe + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" + + testInstanceId = "instance" + testDisplayName = "test" +) + +// mockExecutable is a mock for the Executable interface +type mockExecutable struct { + executeFails bool + executeNotFound bool + executeResp *edge.Instance +} + +func (m *mockExecutable) Execute() (*edge.Instance, error) { + if m.executeFails { + return nil, errors.New("API error") + } + if m.executeNotFound { + return nil, &oapierror.GenericOpenAPIError{ + StatusCode: http.StatusNotFound, + } + } + return m.executeResp, nil +} + +// mockAPIClient is a mock for the edge.APIClient interface +type mockAPIClient struct { + getInstanceMock edge.ApiGetInstanceRequest + getInstanceByNameMock edge.ApiGetInstanceByNameRequest +} + +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + if m.getInstanceMock != nil { + return m.getInstanceMock + } + return &mockExecutable{} +} + +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + if m.getInstanceByNameMock != nil { + return m.getInstanceByNameMock + } + return &mockExecutable{} +} + +// Unused methods to satisfy the interface +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + commonInstance.InstanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureByIdInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(false, mods...) +} + +func fixtureByNameInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(true, mods...) +} + +func fixtureInputModel(useName bool, mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + + if useName { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.DisplayNameFlag, + Value: testDisplayName, + } + } else { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.InstanceIdFlag, + Value: testInstanceId, + } + } + + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "by id", + want: fixtureByIdInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by name", + want: fixtureByNameInputModel(), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by id and name", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "instanceId missing", + want: fixtureByNameInputModel(), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "instanceId empty", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "" + }), + }, + }, + { + name: "instanceId too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "invalid-instance-id" + }), + }, + }, + { + name: "instanceId too short", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "id" + }), + }, + }, + { + name: "name too short", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foo" + }), + }, + }, + { + name: "name too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foofoofoo" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *edge.Instance + args args + }{ + { + name: "get by id success", + want: &edge.Instance{ + Id: &testInstanceId, + DisplayName: &testDisplayName, + }, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + getInstanceMock: &mockExecutable{ + executeResp: &edge.Instance{ + Id: &testInstanceId, + DisplayName: &testDisplayName, + }, + }, + }, + }, + }, + { + name: "get by name success", + want: &edge.Instance{ + Id: &testInstanceId, + DisplayName: &testDisplayName, + }, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + getInstanceByNameMock: &mockExecutable{ + executeResp: &edge.Instance{ + Id: &testInstanceId, + DisplayName: &testDisplayName, + }, + }, + }, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + }, + { + name: "instance not found error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + getInstanceMock: &mockExecutable{ + executeNotFound: true, + }, + }, + }, + }, + { + name: "get by id API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + getInstanceMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + { + name: "get by name API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + getInstanceByNameMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := run(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestOutputResult(t *testing.T) { + type outputArgs struct { + model *inputModel + instance *edge.Instance + } + + tests := []struct { + name string + wantErr error + args outputArgs + }{ + { + name: "no instance", + wantErr: &commonErr.NoInstanceError{}, + args: outputArgs{ + model: fixtureByIdInputModel(), + instance: nil, + }, + }, + { + name: "output json", + args: outputArgs{ + model: fixtureInputModel(false, func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + model.identifier = nil + }), + instance: &edge.Instance{}, + }, + }, + { + name: "output yaml", + args: outputArgs{ + model: fixtureInputModel(false, func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + model.identifier = nil + }), + instance: &edge.Instance{}, + }, + }, + { + name: "output default", + args: outputArgs{ + model: fixtureByIdInputModel(), + instance: &edge.Instance{Id: &testInstanceId}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + err := outputResult(p, tt.args.model.OutputFormat, tt.args.instance) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *describeRequestSpec + args args + }{ + { + name: "get by id", + want: &describeRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceId: testInstanceId, + }, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + getInstanceMock: &mockExecutable{}, + }, + }, + }, + { + name: "get by name", + want: &describeRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceName: testDisplayName, + }, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + getInstanceByNameMock: &mockExecutable{}, + }, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(describeRequestSpec{}, "Execute")) + }) + } +} diff --git a/internal/cmd/beta/edge/instance/instance.go b/internal/cmd/beta/edge/instance/instance.go new file mode 100644 index 000000000..748371cda --- /dev/null +++ b/internal/cmd/beta/edge/instance/instance.go @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package instance + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance/update" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "instance", + Short: "Provides functionality for edge instances.", + Long: "Provides functionality for STACKIT Edge Cloud (STEC) instance management.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) +} diff --git a/internal/cmd/beta/edge/instance/list/list.go b/internal/cmd/beta/edge/instance/list/list.go new file mode 100755 index 000000000..ca84cca87 --- /dev/null +++ b/internal/cmd/beta/edge/instance/list/list.go @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +const ( + limitFlag = "limit" +) + +// Struct to model user input (arguments and/or flags) +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +// listRequestSpec captures the details of the request for testing. +type listRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + Limit *int64 + + // Execute is a closure that wraps the actual SDK call + Execute func() (*edge.InstanceList, error) +} + +// Command constructor +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists edge instances", + Long: "Lists STACKIT Edge Cloud (STEC) instances of a project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Lists all edge instances of a given project`, + `$ stackit beta edge-cloud instance list`), + examples.NewExample( + `Lists all edge instances of a given project and limits the output to two instances`, + fmt.Sprintf(`$ stackit beta edge-cloud instance list --%s 2`, limitFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + // If project label can't be determined, fall back to project ID + projectLabel = model.ProjectId + } + + // Call API + resp, err := run(ctx, model, apiClient) + if err != nil { + return err + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Parse and validate user input then add it to the model + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &cliErr.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) ([]edge.Instance, error) { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return nil, err + } + + resp, err := spec.Execute() + if err != nil { + return nil, cliErr.NewRequestFailedError(err) + } + if resp == nil { + return nil, fmt.Errorf("list instances: empty response from API") + } + if resp.Instances == nil { + return nil, fmt.Errorf("list instances: instances missing in response") + } + instances := *resp.Instances + + // Truncate output if limit is set + if spec.Limit != nil && len(instances) > int(*spec.Limit) { + instances = instances[:*spec.Limit] + } + + return instances, nil +} + +// buildRequest constructs the spec that can be tested. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*listRequestSpec, error) { + req := apiClient.GetInstances(ctx, model.ProjectId, model.Region) + + return &listRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + Limit: model.Limit, + Execute: req.Execute, + }, nil +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []edge.Instance) error { + return p.OutputResult(outputFormat, instances, func() error { + // No instances found for project + if len(instances) == 0 { + p.Outputf("No instances found for project %q\n", projectLabel) + return nil + } + + // Display instances found for project in a table + table := tables.NewTable() + // List: only output the most important fields. Be sure to filter for any non-required fields. + table.SetHeader("ID", "NAME", "UI", "STATE") + for i := range instances { + instance := instances[i] + table.AddRow( + utils.PtrString(instance.Id), + utils.PtrString(instance.DisplayName), + utils.PtrString(instance.FrontendUrl), + utils.PtrString(instance.Status)) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/edge/instance/list/list_test.go b/internal/cmd/beta/edge/instance/list/list_test.go new file mode 100755 index 000000000..2c809d95f --- /dev/null +++ b/internal/cmd/beta/edge/instance/list/list_test.go @@ -0,0 +1,460 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package list + +import ( + "context" + "errors" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" +) + +// mockExecutable is a mock for the Executable interface +type mockExecutable struct { + executeFails bool + executeResp *edge.InstanceList +} + +func (m *mockExecutable) Execute() (*edge.InstanceList, error) { + if m.executeFails { + return nil, errors.New("API error") + } + + if m.executeResp != nil { + return m.executeResp, nil + } + return &edge.InstanceList{ + Instances: &[]edge.Instance{ + {Id: utils.Ptr("instance-1"), DisplayName: utils.Ptr("namea")}, + {Id: utils.Ptr("instance-2"), DisplayName: utils.Ptr("nameb")}, + }, + }, nil +} + +// mockAPIClient is a mock for the edge.APIClient interface +type mockAPIClient struct { + getInstancesMock edge.ApiGetInstancesRequest +} + +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + if m.getInstancesMock != nil { + return m.getInstancesMock + } + return &mockExecutable{} +} + +// Unused methods to satisfy the interface +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "success", + want: fixtureInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "with limit", + want: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(10)) + }), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "10" + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "limit invalid", + wantErr: "invalid syntax", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + }, + }, + { + name: "limit less than 1", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want []edge.Instance + args args + }{ + { + name: "list success", + want: []edge.Instance{ + {Id: utils.Ptr("instance-1"), DisplayName: utils.Ptr("namea")}, + {Id: utils.Ptr("instance-2"), DisplayName: utils.Ptr("nameb")}, + }, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{}, + }, + }, + { + name: "list success with limit", + want: []edge.Instance{ + {Id: utils.Ptr("instance-1"), DisplayName: utils.Ptr("namea")}, + }, + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(1)) + }), + client: &mockAPIClient{}, + }, + }, + { + name: "list success with limit greater than items", + want: []edge.Instance{ + {Id: utils.Ptr("instance-1"), DisplayName: utils.Ptr("namea")}, + {Id: utils.Ptr("instance-2"), DisplayName: utils.Ptr("nameb")}, + }, + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(5)) + }), + client: &mockAPIClient{}, + }, + }, + { + name: "list success with no items", + want: []edge.Instance{}, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + getInstancesMock: &mockExecutable{ + executeResp: &edge.InstanceList{Instances: &[]edge.Instance{}}, + }, + }, + }, + }, + { + name: "list API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + getInstancesMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := run(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + instances []edge.Instance + projectLabel string + } + + tests := []struct { + name string + wantErr error + args args + }{ + { + name: "no instance", + args: args{ + model: fixtureInputModel(), + }, + }, + { + name: "output json", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + instances: []edge.Instance{ + {Id: utils.Ptr("instance-1"), DisplayName: utils.Ptr("namea")}, + }, + projectLabel: "test-project", + }, + }, + { + name: "output yaml", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + }), + instances: []edge.Instance{ + {Id: utils.Ptr("instance-1"), DisplayName: utils.Ptr("namea")}, + }, + projectLabel: "test-project", + }, + }, + { + name: "output default with instances", + args: args{ + model: fixtureInputModel(), + instances: []edge.Instance{ + { + Id: utils.Ptr("instance-1"), + DisplayName: utils.Ptr("namea"), + FrontendUrl: utils.Ptr("https://example.com"), + }, + { + Id: utils.Ptr("instance-2"), + DisplayName: utils.Ptr("nameb"), + FrontendUrl: utils.Ptr("https://example2.com"), + }, + }, + projectLabel: "test-project", + }, + }, + { + name: "output default with no instances", + args: args{ + model: fixtureInputModel(), + instances: []edge.Instance{}, + projectLabel: "test-project", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + err := outputResult(p, tt.args.model.OutputFormat, tt.args.projectLabel, tt.args.instances) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *listRequestSpec + args args + }{ + { + name: "success", + want: &listRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + }, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + getInstancesMock: &mockExecutable{}, + }, + }, + }, + { + name: "success with limit", + want: &listRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + Limit: utils.Ptr(int64(10)), + }, + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(10)) + }), + client: &mockAPIClient{ + getInstancesMock: &mockExecutable{}, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(listRequestSpec{}, "Execute")) + }) + } +} diff --git a/internal/cmd/beta/edge/instance/update/update.go b/internal/cmd/beta/edge/instance/update/update.go new file mode 100755 index 000000000..28ec3437a --- /dev/null +++ b/internal/cmd/beta/edge/instance/update/update.go @@ -0,0 +1,281 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" +) + +// Struct to model user input (arguments and/or flags) +type inputModel struct { + *globalflags.GlobalFlagModel + identifier *commonValidation.Identifier + Description *string + PlanId *string +} + +// updateRequestSpec captures the details of the request for testing. +type updateRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + InstanceId string // Set if updating by ID + InstanceName string // Set if updating by Name + Payload edge.UpdateInstancePayload + + // Execute is a closure that wraps the actual SDK call + Execute func() error +} + +// OpenApi generated code will have different types for by-instance-id and by-display-name API calls and therefore different wait handlers. +// InstanceWaiter is an interface to abstract the different wait handlers so they can be used interchangeably. +type instanceWaiter interface { + WaitWithContext(context.Context) (*edge.Instance, error) +} + +// A function that creates an instance waiter +type instanceWaiterFactory = func(client *edge.APIClient) instanceWaiter + +// Command constructor +// Instance id and displayname are likely to be refactored in future. For the time being we decided to use flags +// instead of args to provide the instance-id xor displayname to uniquely identify an instance. The displayname +// is guaranteed to be unique within a given project as of today. The chosen flag over args approach ensures we +// won't need a breaking change of the CLI when we refactor the commands to take the identifier as arg at some point. +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "update", + Short: "Updates an edge instance", + Long: "Updates a STACKIT Edge Cloud (STEC) instance.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + fmt.Sprintf(`Updates the description of an edge instance with %s "xxx"`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance update --%s "xxx" --%s "yyy"`, commonInstance.InstanceIdFlag, commonInstance.DescriptionFlag)), + examples.NewExample( + fmt.Sprintf(`Updates the plan of an edge instance with %s "xxx"`, commonInstance.DisplayNameFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance update --%s "xxx" --%s "yyy"`, commonInstance.DisplayNameFlag, commonInstance.PlanIdFlag)), + examples.NewExample( + fmt.Sprintf(`Updates the description and plan of an edge instance with %s "xxx"`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud instance update --%s "xxx" --%s "yyy" --%s "zzz"`, commonInstance.InstanceIdFlag, commonInstance.DescriptionFlag, commonInstance.PlanIdFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + // If project label can't be determined, fall back to project ID + projectLabel = model.ProjectId + } + + // Prompt for confirmation + if !model.AssumeYes { + prompt := fmt.Sprintf("Are you sure you want to update the edge instance %q of project %q?", model.identifier.Value, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + } + + // Call API + err = run(ctx, model, apiClient) + if err != nil { + return err + } + + // Wait for async operation, if async mode not enabled + operationState := "Triggered update of" + if !model.Async { + // Wait for async operation, if async mode not enabled + // Show spinner while waiting + s := spinner.New(params.Printer) + s.Start("Updating instance") + // Determine identifier and waiter to use + waiterFactory, err := getWaiterFactory(ctx, model) + if err != nil { + return err + } + // The waiter handler needs a concrete client type. We can safely cast here as the real implementation will always match. + client, ok := apiClient.(*edge.APIClient) + if !ok { + return fmt.Errorf("failed to configure API client") + } + waiter := waiterFactory(client) + + if _, err = waiter.WaitWithContext(ctx); err != nil { + return fmt.Errorf("wait for edge instance update: %w", err) + } + operationState = "Updated" + s.Stop() + } + + params.Printer.Info("%s instance with %q %q of project %q.\n", operationState, model.identifier.Flag, model.identifier.Value, projectLabel) + + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(commonInstance.InstanceIdFlag, commonInstance.InstanceIdShorthand, "", commonInstance.InstanceIdUsage) + cmd.Flags().StringP(commonInstance.DisplayNameFlag, commonInstance.DisplayNameShorthand, "", commonInstance.DisplayNameUsage) + cmd.Flags().StringP(commonInstance.DescriptionFlag, commonInstance.DescriptionShorthand, "", commonInstance.DescriptionUsage) + cmd.Flags().StringP(commonInstance.PlanIdFlag, "", "", commonInstance.PlanIdUsage) + + identifierFlags := []string{commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag} + cmd.MarkFlagsMutuallyExclusive(identifierFlags...) // InstanceId xor DisplayName + cmd.MarkFlagsOneRequired(identifierFlags...) + + // Make sure at least one updatable field is provided, otherwise it would be a no-op + updatedFields := []string{commonInstance.DescriptionFlag, commonInstance.PlanIdFlag} + cmd.MarkFlagsOneRequired(updatedFields...) +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Generate input model based on chosen flags + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + // Parse and validate user input then add it to the model + id, err := commonValidation.GetValidatedInstanceIdentifier(p, cmd) + if err != nil { + return nil, err + } + model.identifier = id + + if planIdValue := flags.FlagToStringPointer(p, cmd, commonInstance.PlanIdFlag); planIdValue != nil { + if err := commonInstance.ValidatePlanId(planIdValue); err != nil { + return nil, err + } + model.PlanId = planIdValue + } + + if descriptionValue := flags.FlagToStringPointer(p, cmd, commonInstance.DescriptionFlag); descriptionValue != nil { + if err := commonInstance.ValidateDescription(*descriptionValue); err != nil { + return nil, err + } + model.Description = descriptionValue + } + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) error { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return err + } + + err = spec.Execute() + if err != nil { + return cliErr.NewRequestFailedError(err) + } + + return nil +} + +// buildRequest constructs the spec that can be tested. +// It handles the logic of choosing between UpdateInstance and UpdateInstanceByName. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*updateRequestSpec, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + spec := &updateRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + Payload: edge.UpdateInstancePayload{ + Description: model.Description, + PlanId: model.PlanId, + }, + } + + // Switch the concrete client based on the identifier flag used + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + spec.InstanceId = model.identifier.Value + req := apiClient.UpdateInstance(ctx, model.ProjectId, model.Region, model.identifier.Value) + req = req.UpdateInstancePayload(spec.Payload) + spec.Execute = req.Execute + case commonInstance.DisplayNameFlag: + spec.InstanceName = model.identifier.Value + req := apiClient.UpdateInstanceByName(ctx, model.ProjectId, model.Region, model.identifier.Value) + req = req.UpdateInstanceByNamePayload(edge.UpdateInstanceByNamePayload{ + Description: spec.Payload.Description, + PlanId: spec.Payload.PlanId, + }) + spec.Execute = req.Execute + default: + return nil, fmt.Errorf("%w: %w", cliErr.NewBuildRequestError("invalid identifier flag", nil), commonErr.NewInvalidIdentifierError(model.identifier.Flag)) + } + + return spec, nil +} + +// Returns a factory function to create the appropriate waiter based on the input model. +func getWaiterFactory(ctx context.Context, model *inputModel) (instanceWaiterFactory, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + factory := func(c *edge.APIClient) instanceWaiter { + return wait.CreateOrUpdateInstanceWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value) + } + return factory, nil + case commonInstance.DisplayNameFlag: + factory := func(c *edge.APIClient) instanceWaiter { + return wait.CreateOrUpdateInstanceByNameWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value) + } + return factory, nil + default: + return nil, commonErr.NewInvalidIdentifierError(model.identifier.Flag) + } +} diff --git a/internal/cmd/beta/edge/instance/update/update_test.go b/internal/cmd/beta/edge/instance/update/update_test.go new file mode 100755 index 000000000..434a74337 --- /dev/null +++ b/internal/cmd/beta/edge/instance/update/update_test.go @@ -0,0 +1,541 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package update + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" + testInstanceId = "instance" + testDisplayName = "test" + testDescription = "new description" + testPlanId = uuid.NewString() +) + +type mockExecutable struct { + executeFails bool + executeNotFound bool + capturedUpdatePayload *edge.UpdateInstancePayload + capturedUpdateByNamePayload *edge.UpdateInstanceByNamePayload +} + +func (m *mockExecutable) Execute() error { + if m.executeFails { + return errors.New("API error") + } + if m.executeNotFound { + return &oapierror.GenericOpenAPIError{ + StatusCode: http.StatusNotFound, + } + } + return nil +} + +func (m *mockExecutable) UpdateInstancePayload(payload edge.UpdateInstancePayload) edge.ApiUpdateInstanceRequest { + if m.capturedUpdatePayload != nil { + *m.capturedUpdatePayload = payload + } + return m +} + +func (m *mockExecutable) UpdateInstanceByNamePayload(payload edge.UpdateInstanceByNamePayload) edge.ApiUpdateInstanceByNameRequest { + if m.capturedUpdateByNamePayload != nil { + *m.capturedUpdateByNamePayload = payload + } + return m +} + +type mockAPIClient struct { + updateInstanceMock edge.ApiUpdateInstanceRequest + updateInstanceByNameMock edge.ApiUpdateInstanceByNameRequest +} + +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + if m.updateInstanceMock != nil { + return m.updateInstanceMock + } + return &mockExecutable{} +} + +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + if m.updateInstanceByNameMock != nil { + return m.updateInstanceByNameMock + } + return &mockExecutable{} +} + +// Unused methods to satisfy the interface +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + commonInstance.InstanceIdFlag: testInstanceId, + commonInstance.DescriptionFlag: testDescription, + commonInstance.PlanIdFlag: testPlanId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureByIdInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(false, mods...) +} + +func fixtureByNameInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(true, mods...) +} + +func fixtureInputModel(useName bool, mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Description: &testDescription, + PlanId: &testPlanId, + } + + if useName { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.DisplayNameFlag, + Value: testDisplayName, + } + } else { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.InstanceIdFlag, + Value: testInstanceId, + } + } + + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "by id", + want: fixtureByIdInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by name", + want: fixtureByNameInputModel(), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by id and name", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "no update flags", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.DescriptionFlag) + delete(flagValues, commonInstance.PlanIdFlag) + }), + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "plan id invalid", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.PlanIdFlag] = "not-a-uuid" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + tests := []struct { + name string + args args + want *updateRequestSpec + wantErr error + }{ + { + name: "by id", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + updateInstanceMock: &mockExecutable{}, + }, + }, + want: &updateRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceId: testInstanceId, + Payload: edge.UpdateInstancePayload{ + Description: &testDescription, + PlanId: &testPlanId, + }, + }, + }, + { + name: "by name", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + updateInstanceByNameMock: &mockExecutable{}, + }, + }, + want: &updateRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceName: testDisplayName, + Payload: edge.UpdateInstancePayload{ + Description: &testDescription, + PlanId: &testPlanId, + }, + }, + }, + { + name: "no identifier", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + wantErr: &commonErr.NoIdentifierError{}, + }, + { + name: "invalid identifier", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.identifier = &commonValidation.Identifier{Flag: "unknown", Value: "val"} + }), + client: &mockAPIClient{}, + }, + wantErr: &cliErr.BuildRequestError{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + if got != nil { + if got.Execute == nil { + t.Error("expected non-nil Execute function") + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(updateRequestSpec{}, "Execute")) + } + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + args args + }{ + { + name: "update by id success", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + updateInstanceMock: &mockExecutable{}, + }, + }, + }, + { + name: "update by name success", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + updateInstanceByNameMock: &mockExecutable{}, + }, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + }, + { + name: "instance not found error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + updateInstanceMock: &mockExecutable{ + executeNotFound: true, + }, + }, + }, + }, + { + name: "update by id API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{ + updateInstanceMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + { + name: "update by name API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{ + updateInstanceByNameMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := run(testCtx, tt.args.model, tt.args.client) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} + +func TestGetWaiterFactory(t *testing.T) { + type args struct { + model *inputModel + } + + tests := []struct { + name string + wantErr error + want bool + args args + }{ + { + name: "by id", + want: true, + args: args{ + model: fixtureByIdInputModel(), + }, + }, + { + name: "by name", + want: true, + args: args{ + model: fixtureByNameInputModel(), + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + want: false, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + }, + }, + { + name: "unknown identifier", + wantErr: &commonErr.InvalidIdentifierError{}, + want: false, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier.Flag = "unknown" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getWaiterFactory(testCtx, tt.args.model) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + if tt.want && got == nil { + t.Fatal("expected non-nil waiter factory") + } + if !tt.want && got != nil { + t.Fatal("expected nil waiter factory") + } + }) + } +} diff --git a/internal/cmd/beta/edge/kubeconfig/create/create.go b/internal/cmd/beta/edge/kubeconfig/create/create.go new file mode 100755 index 000000000..b22b7a1b3 --- /dev/null +++ b/internal/cmd/beta/edge/kubeconfig/create/create.go @@ -0,0 +1,396 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package create + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/goccy/go-yaml" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonKubeconfig "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/kubeconfig" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + identifier *commonValidation.Identifier + DisableWriting bool + Filepath *string + Overwrite bool + Expiration uint64 + SwitchContext bool +} + +// createRequestSpec captures the details of the request for testing. +type createRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + InstanceId string + InstanceName string + Expiration int64 + + // Execute is a closure that wraps the actual SDK call + Execute func() (*edge.Kubeconfig, error) +} + +// OpenApi generated code will have different types for by-instance-id and by-display-name API calls and therefore different wait handlers. +// KubeconfigWaiter is an interface to abstract the different wait handlers so they can be used interchangeably. +type kubeconfigWaiter interface { + WaitWithContext(context.Context) (*edge.Kubeconfig, error) +} + +// A function that creates a kubeconfig waiter +type kubeconfigWaiterFactory = func(client *edge.APIClient) kubeconfigWaiter + +// waiterFactoryProvider is an interface that provides kubeconfig waiters so we can inject different impl. while testing. +type waiterFactoryProvider interface { + getKubeconfigWaiter(ctx context.Context, model *inputModel, apiClient client.APIClient) (kubeconfigWaiter, error) +} + +// productionWaiterFactoryProvider is the real implementation used in production. +// It handles the concrete client type casting required by the SDK's wait handlers. +type productionWaiterFactoryProvider struct{} + +func (p *productionWaiterFactoryProvider) getKubeconfigWaiter(ctx context.Context, model *inputModel, apiClient client.APIClient) (kubeconfigWaiter, error) { + waiterFactory, err := getWaiterFactory(ctx, model) + if err != nil { + return nil, err + } + // The waiter handler needs a concrete client type. We can safely cast here as the real implementation will always match. + edgeClient, ok := apiClient.(*edge.APIClient) + if !ok { + return nil, cliErr.NewBuildRequestError("failed to configure API client", nil) + } + return waiterFactory(edgeClient), nil +} + +// waiterProvider is the package-level variable used to get the waiter. +// It is initialized with the production implementation but can be overridden in tests. +var waiterProvider waiterFactoryProvider = &productionWaiterFactoryProvider{} + +// Command constructor +// Instance id and displayname are likely to be refactored in future. For the time being we decided to use flags +// instead of args to provide the instance-id xor displayname to uniquely identify an instance. The displayname +// is guaranteed to be unique within a given project as of today. The chosen flag over args approach ensures we +// won't need a breaking change of the CLI when we refactor the commands to take the identifier as arg at some point. +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates or updates a local kubeconfig file of an edge instance", + Long: fmt.Sprintf("%s\n\n%s\n%s\n%s\n%s", + "Creates or updates a local kubeconfig file of a STACKIT Edge Cloud (STEC) instance. If the config exists in the kubeconfig file, the information will be updated.", + "By default, the kubeconfig information of the edge instance is merged into the current kubeconfig file which is determined by Kubernetes client logic. If the kubeconfig file doesn't exist, a new one will be created.", + fmt.Sprintf("You can override this behavior by specifying a custom filepath with the --%s flag or disable writing with the --%s flag.", commonKubeconfig.FilepathFlag, commonKubeconfig.DisableWritingFlag), + fmt.Sprintf("An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is %d seconds.", commonKubeconfig.ExpirationSecondsDefault), + "Note: the format for the duration is , e.g. 30d for 30 days. You may not combine units."), + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + fmt.Sprintf(`Create or update a kubeconfig for the edge instance with %s "xxx". If the config exists in the kubeconfig file, the information will be updated.`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud kubeconfig create --%s "xxx"`, commonInstance.InstanceIdFlag)), + examples.NewExample( + fmt.Sprintf(`Create or update a kubeconfig for the edge instance with %s "xxx" in a custom filepath.`, commonInstance.DisplayNameFlag), + fmt.Sprintf(`$ stackit beta edge-cloud kubeconfig create --%s "xxx" --filepath "yyy"`, commonInstance.DisplayNameFlag)), + examples.NewExample( + fmt.Sprintf(`Get a kubeconfig for the edge instance with %s "xxx" without writing it to a file and format the output as json.`, commonInstance.DisplayNameFlag), + fmt.Sprintf(`$ stackit beta edge-cloud kubeconfig create --%s "xxx" --disable-writing --output-format json`, commonInstance.DisplayNameFlag)), + examples.NewExample( + fmt.Sprintf(`Create a kubeconfig for the edge instance with %s "xxx". This will replace your current kubeconfig file.`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud kubeconfig create --%s "xxx" --overwrite`, commonInstance.InstanceIdFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Prompt for confirmation is handled in outputResult + + if model.Async { + return fmt.Errorf("async mode is not supported for kubeconfig create") + } + + // Call API via waiter (which handles both the API call and waiting) + kubeconfig, err := run(ctx, model, apiClient) + if err != nil { + return err + } + + // Handle file operations or output to printer + return outputResult(params.Printer, model.OutputFormat, model, kubeconfig) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(commonInstance.InstanceIdFlag, commonInstance.InstanceIdShorthand, "", commonInstance.InstanceIdUsage) + cmd.Flags().StringP(commonInstance.DisplayNameFlag, commonInstance.DisplayNameShorthand, "", commonInstance.DisplayNameUsage) + cmd.Flags().Bool(commonKubeconfig.DisableWritingFlag, false, commonKubeconfig.DisableWritingUsage) + cmd.Flags().StringP(commonKubeconfig.FilepathFlag, commonKubeconfig.FilepathShorthand, "", commonKubeconfig.FilepathUsage) + cmd.Flags().StringP(commonKubeconfig.ExpirationFlag, commonKubeconfig.ExpirationShorthand, "", commonKubeconfig.ExpirationUsage) + cmd.Flags().Bool(commonKubeconfig.OverwriteFlag, false, commonKubeconfig.OverwriteUsage) + cmd.Flags().Bool(commonKubeconfig.SwitchContextFlag, false, commonKubeconfig.SwitchContextUsage) + + identifierFlags := []string{commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag} + cmd.MarkFlagsMutuallyExclusive(identifierFlags...) // InstanceId xor DisplayName + cmd.MarkFlagsOneRequired(identifierFlags...) + cmd.MarkFlagsMutuallyExclusive(commonKubeconfig.DisableWritingFlag, commonKubeconfig.FilepathFlag) // DisableWriting xor Filepath + cmd.MarkFlagsMutuallyExclusive(commonKubeconfig.DisableWritingFlag, commonKubeconfig.OverwriteFlag) // DisableWriting xor Overwrite +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Generate input model based on chosen flags + model := inputModel{ + GlobalFlagModel: globalFlags, + Filepath: flags.FlagToStringPointer(p, cmd, commonKubeconfig.FilepathFlag), + Overwrite: flags.FlagToBoolValue(p, cmd, commonKubeconfig.OverwriteFlag), + SwitchContext: flags.FlagToBoolValue(p, cmd, commonKubeconfig.SwitchContextFlag), + } + + // Parse and validate user input then add it to the model + id, err := commonValidation.GetValidatedInstanceIdentifier(p, cmd) + if err != nil { + return nil, err + } + model.identifier = id + + // Parse and validate kubeconfig expiration time + if expString := flags.FlagToStringPointer(p, cmd, commonKubeconfig.ExpirationFlag); expString != nil { + expTime, err := utils.ConvertToSeconds(*expString) + if err != nil { + return nil, &cliErr.FlagValidationError{ + Flag: commonKubeconfig.ExpirationFlag, + Details: err.Error(), + } + } + if err := commonKubeconfig.ValidateExpiration(&expTime); err != nil { + return nil, &cliErr.FlagValidationError{ + Flag: commonKubeconfig.ExpirationFlag, + Details: err.Error(), + } + } + model.Expiration = expTime + } else { + // Default expiration is 1 hour + defaultExp := uint64(commonKubeconfig.ExpirationSecondsDefault) + model.Expiration = defaultExp + } + + disableWriting := flags.FlagToBoolValue(p, cmd, commonKubeconfig.DisableWritingFlag) + model.DisableWriting = disableWriting + // Make sure to only output if the format is explicitly set + if disableWriting { + if globalFlags.OutputFormat == "" || globalFlags.OutputFormat == print.NoneOutputFormat { + return nil, &cliErr.FlagValidationError{ + Flag: commonKubeconfig.DisableWritingFlag, + Details: fmt.Sprintf("must be used with --%s", globalflags.OutputFormatFlag), + } + } + if globalFlags.OutputFormat != print.JSONOutputFormat && globalFlags.OutputFormat != print.YAMLOutputFormat { + return nil, &cliErr.FlagValidationError{ + Flag: globalflags.OutputFormatFlag, + Details: fmt.Sprintf("valid output formats for this command are: %s", fmt.Sprintf("%s, %s", print.JSONOutputFormat, print.YAMLOutputFormat)), + } + } + } + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) (*edge.Kubeconfig, error) { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return nil, err + } + + resp, err := spec.Execute() + if err != nil { + return nil, cliErr.NewRequestFailedError(err) + } + + return resp, nil +} + +// buildRequest constructs the spec that can be tested. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*createRequestSpec, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + spec := &createRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + Expiration: int64(model.Expiration), // #nosec G115 ValidateExpiration ensures safe bounds, conversion is safe + } + + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + spec.InstanceId = model.identifier.Value + case commonInstance.DisplayNameFlag: + spec.InstanceName = model.identifier.Value + default: + return nil, fmt.Errorf("%w: %w", cliErr.NewBuildRequestError("invalid identifier flag", nil), commonErr.NewInvalidIdentifierError(model.identifier.Flag)) + } + + // Closure used to decouple the actual SDK call for easier testing + spec.Execute = func() (*edge.Kubeconfig, error) { + // Get the waiter from the provider (handles client type casting internally) + waiter, err := waiterProvider.getKubeconfigWaiter(ctx, model, apiClient) + if err != nil { + return nil, err + } + + return waiter.WaitWithContext(ctx) + } + + return spec, nil +} + +// Returns a factory function to create the appropriate waiter based on the input model. +func getWaiterFactory(ctx context.Context, model *inputModel) (kubeconfigWaiterFactory, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + // The KubeconfigWaitHandlers don't wait for the kubeconfig to be created, but for the instance to be ready to return a kubeconfig. + // Convert uint64 to int64 to match the API's type. + var expiration = int64(model.Expiration) // #nosec G115 ValidateExpiration ensures safe bounds, conversion is safe + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + factory := func(c *edge.APIClient) kubeconfigWaiter { + return wait.KubeconfigWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value, &expiration) + } + return factory, nil + case commonInstance.DisplayNameFlag: + factory := func(c *edge.APIClient) kubeconfigWaiter { + return wait.KubeconfigByInstanceNameWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value, &expiration) + } + return factory, nil + default: + return nil, commonErr.NewInvalidIdentifierError(model.identifier.Flag) + } +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, outputFormat string, model *inputModel, kubeconfig *edge.Kubeconfig) error { + // Ensure kubeconfig data is present + if kubeconfig == nil || kubeconfig.Kubeconfig == nil { + return fmt.Errorf("no kubeconfig returned from the API") + } + kubeconfigMap := *kubeconfig.Kubeconfig + + // Determine output format for terminal or file output + var format string + switch outputFormat { + case print.JSONOutputFormat: + // JSON if explicitly requested + format = print.JSONOutputFormat + case print.YAMLOutputFormat: + // YAML if explicitly requested + format = print.YAMLOutputFormat + default: + if model.DisableWriting { + // If not explicitly requested, use JSON as default for terminal output + format = print.JSONOutputFormat + } else { + // If not explicitly requested, use YAML as default for file output + format = print.YAMLOutputFormat + } + } + + // Marshal kubeconfig data based on the determined format + kubeconfigData, err := marshalKubeconfig(kubeconfigMap, format) + if err != nil { + return err + } + + // Handle file writing and output + if !model.DisableWriting { + // Build options for writing kubeconfig + opts := commonKubeconfig.NewWriteOptions(). + WithOverwrite(model.Overwrite). + WithSwitchContext(model.SwitchContext) + + // Add confirmation callback if not assumeYes + if !model.AssumeYes { + confirmFn := func(message string) error { + return p.PromptForConfirmation(message) + } + opts = opts.WithConfirmation(confirmFn) + } + + path, err := commonKubeconfig.WriteKubeconfig(model.Filepath, kubeconfigData, opts) + if err != nil { + return err + } + + // Inform the user about the successful write operation + p.Outputf("Wrote kubeconfig for instance %q to %q.\n", model.identifier.Value, *path) + + if model.SwitchContext { + p.Outputln("Switched context as requested.") + } + } else { + p.Outputln(kubeconfigData) + } + return nil +} + +// Marshal kubeconfig data to the specified format +func marshalKubeconfig(kubeconfigMap map[string]interface{}, format string) (string, error) { + switch format { + case print.JSONOutputFormat: + kubeconfigJSON, err := json.MarshalIndent(kubeconfigMap, "", " ") + if err != nil { + return "", fmt.Errorf("marshal kubeconfig to JSON: %w", err) + } + return string(kubeconfigJSON), nil + case print.YAMLOutputFormat: + kubeconfigYAML, err := yaml.MarshalWithOptions(kubeconfigMap, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + if err != nil { + return "", fmt.Errorf("marshal kubeconfig to YAML: %w", err) + } + return string(kubeconfigYAML), nil + default: + return "", fmt.Errorf("%w: %s", commonErr.NewNoIdentifierError(""), format) + } +} diff --git a/internal/cmd/beta/edge/kubeconfig/create/create_test.go b/internal/cmd/beta/edge/kubeconfig/create/create_test.go new file mode 100755 index 000000000..b1fbe2810 --- /dev/null +++ b/internal/cmd/beta/edge/kubeconfig/create/create_test.go @@ -0,0 +1,820 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package create + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/goccy/go-yaml" + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonKubeconfig "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/kubeconfig" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" + testInstanceId = "instance" + testDisplayName = "test" + testExpiration = "1h" +) + +const ( + testKubeconfig = ` +apiVersion: v1 +clusters: +- cluster: + server: https://server-1.com + name: cluster-1 +contexts: +- context: + cluster: cluster-1 + user: user-1 + name: context-1 +current-context: context-1 +kind: Config +preferences: {} +users: +- name: user-1 + user: {} +` +) + +// Helper function to create a new instance of Kubeconfig +// +//nolint:gocritic // ptrToRefParam: Required by edge.Kubeconfig API which expects *map[string]interface{} +func testKubeconfigMap() *map[string]interface{} { + var kubeconfigMap map[string]interface{} + err := yaml.Unmarshal([]byte(testKubeconfig), &kubeconfigMap) + if err != nil { + // This should never happen in tests with valid YAML + panic(err) + } + return utils.Ptr(kubeconfigMap) +} + +// mockKubeconfigWaiter is a mock for the kubeconfigWaiter interface +type mockKubeconfigWaiter struct { + waitFails bool + waitNotFound bool + waitResp *edge.Kubeconfig +} + +func (m *mockKubeconfigWaiter) WaitWithContext(_ context.Context) (*edge.Kubeconfig, error) { + if m.waitFails { + return nil, errors.New("wait error") + } + if m.waitNotFound { + return nil, &oapierror.GenericOpenAPIError{ + StatusCode: http.StatusNotFound, + } + } + if m.waitResp != nil { + return m.waitResp, nil + } + + // Default kubeconfig response + return &edge.Kubeconfig{ + Kubeconfig: testKubeconfigMap(), + }, nil +} + +// testWaiterFactoryProvider is a test implementation that returns mock waiters. +type testWaiterFactoryProvider struct { + waiter kubeconfigWaiter +} + +func (t *testWaiterFactoryProvider) getKubeconfigWaiter(_ context.Context, model *inputModel, _ client.APIClient) (kubeconfigWaiter, error) { + if model == nil || model.identifier == nil { + return nil, &commonErr.NoIdentifierError{} + } + + // Validate identifier like the real implementation + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag: + // Return our mock waiter directly, bypassing the client type casting issue + return t.waiter, nil + default: + return nil, commonErr.NewInvalidIdentifierError(model.identifier.Flag) + } +} + +// mockAPIClient is a mock for the edge.APIClient interface +type mockAPIClient struct{} + +// Unused methods to satisfy the interface +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} + +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} + +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} + +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} + +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} + +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} + +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} + +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} + +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} + +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + commonInstance.InstanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureByIdInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(false, mods...) +} + +func fixtureByNameInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(true, mods...) +} + +func fixtureInputModel(useName bool, mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + DisableWriting: false, + Filepath: nil, + Overwrite: false, + Expiration: uint64(3600), // Default 1 hour + SwitchContext: false, + } + + if useName { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.DisplayNameFlag, + Value: testDisplayName, + } + } else { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.InstanceIdFlag, + Value: testInstanceId, + } + } + + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "by id", + want: fixtureByIdInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by name", + want: fixtureByNameInputModel(), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "with expiration", + want: fixtureByIdInputModel(func(model *inputModel) { + model.Expiration = uint64(3600) + }), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = testExpiration + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by id and name", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "instance id missing", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + }), + }, + }, + { + name: "instance id empty", + wantErr: "id may not be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "" + }), + }, + }, + { + name: "instance id too long", + wantErr: "id is too long", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "invalid-instance-id" + }), + }, + }, + { + name: "instance id too short", + wantErr: "id is too short", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "id" + }), + }, + }, + { + name: "name too short", + wantErr: "name is too short", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foo" + }), + }, + }, + { + name: "name too long", + wantErr: "name is too long", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foofoofoo" + }), + }, + }, + { + name: "disable writing and invalid output format", + wantErr: "valid output formats for this command are", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.DisableWritingFlag] = "true" + flagValues[globalflags.OutputFormatFlag] = print.PrettyOutputFormat + }), + }, + }, + { + name: "disable writing and default output format", + wantErr: "must be used with --output-format", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.DisableWritingFlag] = "true" + }), + }, + }, + { + name: "disable writing and valid output format", + want: fixtureByIdInputModel(func(model *inputModel) { + model.DisableWriting = true + model.OutputFormat = print.YAMLOutputFormat + }), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.DisableWritingFlag] = "true" + flagValues[globalflags.OutputFormatFlag] = print.YAMLOutputFormat + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "invalid expiration format", + wantErr: "invalid time string format", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = "invalid" + }), + }, + }, + { + name: "expiration too short", + wantErr: "expiration is too small", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = "1s" + }), + }, + }, + { + name: "expiration too long", + wantErr: "expiration is too large", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = "13M" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + waiter kubeconfigWaiter + } + + tests := []struct { + name string + wantErr error + args args + }{ + { + name: "run by id success", + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{}, + }, + }, + { + name: "run by name success", + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{}, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{}, + }, + }, + { + name: "instance not found error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{waitNotFound: true}, + }, + }, + { + name: "get kubeconfig by id API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{waitFails: true}, + }, + }, + { + name: "get kubeconfig by name API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{waitFails: true}, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + waiter: &mockKubeconfigWaiter{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Override production waiterProvider package level variable for testing + prodWaiterProvider := waiterProvider + waiterProvider = &testWaiterFactoryProvider{waiter: tt.args.waiter} + defer func() { waiterProvider = prodWaiterProvider }() + + _, err := run(testCtx, tt.args.model, tt.args.client) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *createRequestSpec + args args + }{ + { + name: "by id", + want: &createRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceId: testInstanceId, + Expiration: int64(commonKubeconfig.ExpirationSecondsDefault), + }, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + }, + }, + { + name: "by name", + want: &createRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceName: testDisplayName, + Expiration: int64(commonKubeconfig.ExpirationSecondsDefault), + }, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{}, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(createRequestSpec{}, "Execute")) + }) + } +} + +func TestGetWaiterFactory(t *testing.T) { + type args struct { + model *inputModel + } + + tests := []struct { + name string + wantErr error + want bool + args args + }{ + { + name: "by id", + want: true, + args: args{ + model: fixtureByIdInputModel(), + }, + }, + { + name: "by name", + want: true, + args: args{ + model: fixtureByNameInputModel(), + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + want: false, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + }, + }, + { + name: "unknown identifier", + wantErr: &commonErr.InvalidIdentifierError{}, + want: false, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier.Flag = "unknown" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getWaiterFactory(testCtx, tt.args.model) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + if tt.want && got == nil { + t.Fatal("expected non-nil waiter factory") + } + if !tt.want && got != nil { + t.Fatal("expected nil waiter factory") + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + kubeconfig *edge.Kubeconfig + } + + tests := []struct { + name string + wantErr any + args args + }{ + { + name: "no kubeconfig", + wantErr: true, + args: args{ + model: fixtureByIdInputModel(), + kubeconfig: nil, + }, + }, + { + name: "kubeconfig with nil kubeconfig data", + wantErr: true, + args: args{ + model: fixtureByIdInputModel(), + kubeconfig: &edge.Kubeconfig{Kubeconfig: nil}, + }, + }, + { + name: "output json with disable writing", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + model.DisableWriting = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "output yaml with disable writing", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + model.DisableWriting = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "output default with disable writing", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.DisableWriting = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "output by name with json format and disable writing", + args: args{ + model: fixtureByNameInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + model.DisableWriting = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "output by name with yaml format and disable writing", + args: args{ + model: fixtureByNameInputModel(func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + model.DisableWriting = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "output by name default with disable writing", + args: args{ + model: fixtureByNameInputModel(func(model *inputModel) { + model.DisableWriting = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "file writing enabled (default behavior)", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.AssumeYes = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "file writing with overwrite enabled", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.Overwrite = true + model.AssumeYes = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + { + name: "file writing with switch context enabled", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.SwitchContext = true + model.AssumeYes = true + }), + kubeconfig: &edge.Kubeconfig{Kubeconfig: testKubeconfigMap()}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + err := outputResult(p, tt.args.model.OutputFormat, tt.args.model, tt.args.kubeconfig) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} diff --git a/internal/cmd/beta/edge/kubeconfig/kubeconfig.go b/internal/cmd/beta/edge/kubeconfig/kubeconfig.go new file mode 100644 index 000000000..b44c2e1a4 --- /dev/null +++ b/internal/cmd/beta/edge/kubeconfig/kubeconfig.go @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package kubeconfig + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/kubeconfig/create" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "kubeconfig", + Short: "Provides functionality for edge kubeconfig.", + Long: "Provides functionality for STACKIT Edge Cloud (STEC) kubeconfig management.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) +} diff --git a/internal/cmd/beta/edge/plans/list/list.go b/internal/cmd/beta/edge/plans/list/list.go new file mode 100755 index 000000000..ad4c3e178 --- /dev/null +++ b/internal/cmd/beta/edge/plans/list/list.go @@ -0,0 +1,193 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +// User input struct for the command +const ( + limitFlag = "limit" +) + +// Struct to model user input (arguments and/or flags) +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +// listRequestSpec captures the details of the request for testing. +type listRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Limit *int64 + + // Execute is a closure that wraps the actual SDK call + Execute func() (*edge.PlanList, error) +} + +// Command constructor +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists available edge service plans", + Long: "Lists available STACKIT Edge Cloud (STEC) service plans of a project", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Lists all edge plans for a given project`, + `$ stackit beta edge-cloud plan list`), + examples.NewExample( + `Lists all edge plans for a given project and limits the output to two plans`, + fmt.Sprintf(`$ stackit beta edge-cloud plan list --%s 2`, limitFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + // If project label can't be determined, fall back to project ID + projectLabel = model.ProjectId + } + + // Call API + resp, err := run(ctx, model, apiClient) + if err != nil { + return err + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Parse and validate user input then add it to the model + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &cliErr.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) ([]edge.Plan, error) { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return nil, err + } + + resp, err := spec.Execute() + if err != nil { + return nil, cliErr.NewRequestFailedError(err) + } + if resp == nil { + return nil, fmt.Errorf("list plans: empty response from API") + } + if resp.ValidPlans == nil { + return nil, fmt.Errorf("list plans: valid plans missing in response") + } + plans := *resp.ValidPlans + + // Truncate output + if spec.Limit != nil && len(plans) > int(*spec.Limit) { + plans = plans[:*spec.Limit] + } + + return plans, nil +} + +// buildRequest constructs the spec that can be tested. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*listRequestSpec, error) { + req := apiClient.ListPlansProject(ctx, model.ProjectId) + + return &listRequestSpec{ + ProjectID: model.ProjectId, + Limit: model.Limit, + Execute: req.Execute, + }, nil +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, outputFormat, projectLabel string, plans []edge.Plan) error { + return p.OutputResult(outputFormat, plans, func() error { + // No plans found for project + if len(plans) == 0 { + p.Outputf("No plans found for project %q\n", projectLabel) + return nil + } + + // Display plans found for project in a table + table := tables.NewTable() + // List: only output the most important fields. Be sure to filter for any non-required fields. + table.SetHeader("ID", "NAME", "DESCRIPTION", "MAX EDGE HOSTS") + for i := range plans { + plan := plans[i] + table.AddRow( + utils.PtrString(plan.Id), + utils.PtrString(plan.Name), + utils.PtrString(plan.Description), + utils.PtrString(plan.MaxEdgeHosts)) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/edge/plans/list/list_test.go b/internal/cmd/beta/edge/plans/list/list_test.go new file mode 100755 index 000000000..6b6f78275 --- /dev/null +++ b/internal/cmd/beta/edge/plans/list/list_test.go @@ -0,0 +1,450 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package list + +import ( + "context" + "errors" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" +) + +// mockExecutable is a mock for the Executable interface +type mockExecutable struct { + executeFails bool + executeResp *edge.PlanList +} + +func (m *mockExecutable) Execute() (*edge.PlanList, error) { + if m.executeFails { + return nil, errors.New("API error") + } + + if m.executeResp != nil { + return m.executeResp, nil + } + return &edge.PlanList{ + ValidPlans: &[]edge.Plan{ + {Id: utils.Ptr("plan-1"), Name: utils.Ptr("Standard")}, + {Id: utils.Ptr("plan-2"), Name: utils.Ptr("Premium")}, + }, + }, nil +} + +// mockAPIClient is a mock for the edge.APIClient interface +type mockAPIClient struct { + getPlansMock edge.ApiListPlansProjectRequest +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + if m.getPlansMock != nil { + return m.getPlansMock + } + return &mockExecutable{} +} + +// Unused methods to satisfy the interface +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} + +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} + +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Limit: utils.Ptr(int64(10)), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "list success", + want: fixtureInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "limit invalid value", + wantErr: "invalid syntax", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + }, + }, + { + name: "limit is zero", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + }, + }, + { + name: "limit is negative", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-0" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want []edge.Plan + args args + }{ + { + name: "list success", + want: []edge.Plan{ + {Id: utils.Ptr("plan-1"), Name: utils.Ptr("Standard")}, + {Id: utils.Ptr("plan-2"), Name: utils.Ptr("Premium")}, + }, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{}, + }, + }, + { + name: "list success with limit", + want: []edge.Plan{ + {Id: utils.Ptr("plan-1"), Name: utils.Ptr("Standard")}, + }, + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(1)) + }), + client: &mockAPIClient{}, + }, + }, + { + name: "list success with limit greater than items", + want: []edge.Plan{ + {Id: utils.Ptr("plan-1"), Name: utils.Ptr("Standard")}, + {Id: utils.Ptr("plan-2"), Name: utils.Ptr("Premium")}, + }, + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(int64(5)) + }), + client: &mockAPIClient{}, + }, + }, + { + name: "list success with no items", + want: []edge.Plan{}, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + getPlansMock: &mockExecutable{ + executeResp: &edge.PlanList{ValidPlans: &[]edge.Plan{}}, + }, + }, + }, + }, + { + name: "list API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + getPlansMock: &mockExecutable{ + executeFails: true, + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := run(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + plans []edge.Plan + projectLabel string + } + + tests := []struct { + name string + wantErr error + args args + }{ + { + name: "output json", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + plans: []edge.Plan{ + {Id: utils.Ptr("plan-1"), Name: utils.Ptr("Standard")}, + }, + projectLabel: "test-project", + }, + }, + { + name: "output yaml", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + }), + plans: []edge.Plan{ + {Id: utils.Ptr("plan-1"), Name: utils.Ptr("Standard")}, + }, + projectLabel: "test-project", + }, + }, + { + name: "output default with plans", + args: args{ + model: fixtureInputModel(), + plans: []edge.Plan{ + { + Id: utils.Ptr("plan-1"), + Name: utils.Ptr("Standard"), + Description: utils.Ptr("Standard plan description"), + }, + { + Id: utils.Ptr("plan-2"), + Name: utils.Ptr("Premium"), + Description: utils.Ptr("Premium plan description"), + }, + }, + projectLabel: "test-project", + }, + }, + { + name: "output default with no plans", + args: args{ + model: fixtureInputModel(), + plans: []edge.Plan{}, + projectLabel: "test-project", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + err := outputResult(p, tt.args.model.OutputFormat, tt.args.projectLabel, tt.args.plans) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *listRequestSpec + args args + }{ + { + name: "success", + want: &listRequestSpec{ + ProjectID: testProjectId, + }, + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Limit = nil + }), + client: &mockAPIClient{ + getPlansMock: &mockExecutable{}, + }, + }, + }, + { + name: "success with limit", + want: &listRequestSpec{ + ProjectID: testProjectId, + Limit: utils.Ptr(int64(10)), + }, + args: args{ + model: fixtureInputModel(), + client: &mockAPIClient{ + getPlansMock: &mockExecutable{}, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(listRequestSpec{}, "Execute")) + }) + } +} diff --git a/internal/cmd/beta/edge/plans/plans.go b/internal/cmd/beta/edge/plans/plans.go new file mode 100644 index 000000000..d5ccb0721 --- /dev/null +++ b/internal/cmd/beta/edge/plans/plans.go @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package plans + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/plans/list" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "plans", + Short: "Provides functionality for edge service plans.", + Long: "Provides functionality for STACKIT Edge Cloud (STEC) service plan management.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) +} diff --git a/internal/cmd/beta/edge/token/create/create.go b/internal/cmd/beta/edge/token/create/create.go new file mode 100755 index 000000000..f28e196ab --- /dev/null +++ b/internal/cmd/beta/edge/token/create/create.go @@ -0,0 +1,291 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonKubeconfig "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/kubeconfig" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + identifier *commonValidation.Identifier + Expiration uint64 +} + +// createRequestSpec captures the details of the request for testing. +type createRequestSpec struct { + // Exported fields allow tests to inspect the request inputs + ProjectID string + Region string + InstanceId string + InstanceName string + Expiration int64 + + // Execute is a closure that wraps the actual SDK call + Execute func() (*edge.Token, error) +} + +// OpenApi generated code will have different types for by-instance-id and by-display-name API calls and therefore different wait handlers. +// tokenWaiter is an interface to abstract the different wait handlers so they can be used interchangeably. +type tokenWaiter interface { + WaitWithContext(context.Context) (*edge.Token, error) +} + +// A function that creates a token waiter +type tokenWaiterFactory = func(client *edge.APIClient) tokenWaiter + +// waiterFactoryProvider is an interface that provides token waiters so we can inject different impl. while testing. +type waiterFactoryProvider interface { + getTokenWaiter(ctx context.Context, model *inputModel, apiClient client.APIClient) (tokenWaiter, error) +} + +// productionWaiterFactoryProvider is the real implementation used in production. +// It handles the concrete client type casting required by the SDK's wait handlers. +type productionWaiterFactoryProvider struct{} + +func (p *productionWaiterFactoryProvider) getTokenWaiter(ctx context.Context, model *inputModel, apiClient client.APIClient) (tokenWaiter, error) { + waiterFactory, err := getWaiterFactory(ctx, model) + if err != nil { + return nil, err + } + // The waiter handler needs a concrete client type. We can safely cast here as the real implementation will always match. + edgeClient, ok := apiClient.(*edge.APIClient) + if !ok { + return nil, cliErr.NewBuildRequestError("failed to configure API client", nil) + } + return waiterFactory(edgeClient), nil +} + +// waiterProvider is the package-level variable used to get the waiter. +// It is initialized with the production implementation but can be overridden in tests. +var waiterProvider waiterFactoryProvider = &productionWaiterFactoryProvider{} + +// Command constructor +// Instance id and displayname are likely to be refactored in future. For the time being we decided to use flags +// instead of args to provide the instance-id xor displayname to uniquely identify an instance. The displayname +// is guaranteed to be unique within a given project as of today. The chosen flag over args approach ensures we +// won't need a breaking change of the CLI when we refactor the commands to take the identifier as arg at some point. +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a token for an edge instance", + Long: fmt.Sprintf("%s\n\n%s\n%s", + "Creates a token for a STACKIT Edge Cloud (STEC) instance.", + fmt.Sprintf("An expiration time can be set for the token. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is %d seconds.", commonKubeconfig.ExpirationSecondsDefault), + "Note: the format for the duration is , e.g. 30d for 30 days. You may not combine units."), + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + fmt.Sprintf(`Create a token for the edge instance with %s "xxx".`, commonInstance.InstanceIdFlag), + fmt.Sprintf(`$ stackit beta edge-cloud token create --%s "xxx"`, commonInstance.InstanceIdFlag)), + examples.NewExample( + fmt.Sprintf(`Create a token for the edge instance with %s "xxx". The token will be valid for one day.`, commonInstance.DisplayNameFlag), + fmt.Sprintf(`$ stackit beta edge-cloud token create --%s "xxx" --expiration 1d`, commonInstance.DisplayNameFlag)), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + + // Parse user input (arguments and/or flags) + model, err := parseInput(params.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + if model.Async { + return fmt.Errorf("async mode is not supported for token create") + } + + // Call API + resp, err := run(ctx, model, apiClient) + if err != nil { + return err + } + + // Handle output to printer + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(commonInstance.InstanceIdFlag, commonInstance.InstanceIdShorthand, "", commonInstance.InstanceIdUsage) + cmd.Flags().StringP(commonInstance.DisplayNameFlag, commonInstance.DisplayNameShorthand, "", commonInstance.DisplayNameUsage) + cmd.Flags().StringP(commonKubeconfig.ExpirationFlag, commonKubeconfig.ExpirationShorthand, "", commonKubeconfig.ExpirationUsage) + + identifierFlags := []string{commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag} + cmd.MarkFlagsMutuallyExclusive(identifierFlags...) // InstanceId xor DisplayName + cmd.MarkFlagsOneRequired(identifierFlags...) +} + +// Parse user input (arguments and/or flags) +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + // Generate input model based on chosen flags + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + // Parse and validate user input then add it to the model + id, err := commonValidation.GetValidatedInstanceIdentifier(p, cmd) + if err != nil { + return nil, err + } + model.identifier = id + + // Parse and validate kubeconfig expiration time + if expString := flags.FlagToStringPointer(p, cmd, commonKubeconfig.ExpirationFlag); expString != nil { + expTime, err := utils.ConvertToSeconds(*expString) + if err != nil { + return nil, &cliErr.FlagValidationError{ + Flag: commonKubeconfig.ExpirationFlag, + Details: err.Error(), + } + } + if err := commonKubeconfig.ValidateExpiration(&expTime); err != nil { + return nil, &cliErr.FlagValidationError{ + Flag: commonKubeconfig.ExpirationFlag, + Details: err.Error(), + } + } + model.Expiration = expTime + } else { + // Default expiration is 1 hour + defaultExp := uint64(commonKubeconfig.ExpirationSecondsDefault) + model.Expiration = defaultExp + } + + // Make sure to only output if the format is not none + if globalFlags.OutputFormat == print.NoneOutputFormat { + return nil, &cliErr.FlagValidationError{ + Flag: globalflags.OutputFormatFlag, + Details: fmt.Sprintf("valid formats for this command are: %s", fmt.Sprintf("%s, %s, %s", print.PrettyOutputFormat, print.JSONOutputFormat, print.YAMLOutputFormat)), + } + } + + // Log the parsed model if --verbosity is set to debug + p.DebugInputModel(model) + return &model, nil +} + +// Run is the main execution function used by the command runner. +// It is decoupled from TTY output to have the ability to mock the API client during testing. +func run(ctx context.Context, model *inputModel, apiClient client.APIClient) (*edge.Token, error) { + spec, err := buildRequest(ctx, model, apiClient) + if err != nil { + return nil, err + } + + resp, err := spec.Execute() + if err != nil { + return nil, cliErr.NewRequestFailedError(err) + } + + return resp, nil +} + +// buildRequest constructs the spec that can be tested. +func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*createRequestSpec, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + spec := &createRequestSpec{ + ProjectID: model.ProjectId, + Region: model.Region, + Expiration: int64(model.Expiration), // #nosec G115 ValidateExpiration ensures safe bounds, conversion is safe + } + + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + spec.InstanceId = model.identifier.Value + case commonInstance.DisplayNameFlag: + spec.InstanceName = model.identifier.Value + default: + return nil, fmt.Errorf("%w: %w", cliErr.NewBuildRequestError("invalid identifier flag", nil), commonErr.NewInvalidIdentifierError(model.identifier.Flag)) + } + + // Closure used to decouple the actual SDK call for easier testing + spec.Execute = func() (*edge.Token, error) { + // Get the waiter from the provider (handles client type casting internally) + waiter, err := waiterProvider.getTokenWaiter(ctx, model, apiClient) + if err != nil { + return nil, err + } + + return waiter.WaitWithContext(ctx) + } + + return spec, nil +} + +// Returns a factory function to create the appropriate waiter based on the input model. +func getWaiterFactory(ctx context.Context, model *inputModel) (tokenWaiterFactory, error) { + if model == nil || model.identifier == nil { + return nil, commonErr.NewNoIdentifierError("") + } + + // The tokenWaitHandlers don't wait for the token to be created, but for the instance to be ready to return a token. + // Convert uint64 to int64 to match the API's type. + var expiration = int64(model.Expiration) // #nosec G115 ValidateExpiration ensures safe bounds, conversion is safe + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag: + factory := func(c *edge.APIClient) tokenWaiter { + return wait.TokenWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value, &expiration) + } + return factory, nil + case commonInstance.DisplayNameFlag: + factory := func(c *edge.APIClient) tokenWaiter { + return wait.TokenByInstanceNameWaitHandler(ctx, c, model.ProjectId, model.Region, model.identifier.Value, &expiration) + } + return factory, nil + default: + return nil, commonErr.NewInvalidIdentifierError(model.identifier.Flag) + } +} + +// Output result based on the configured output format +func outputResult(p *print.Printer, outputFormat string, token *edge.Token) error { + if token == nil || token.Token == nil { + // This is only to prevent nil pointer deref. + // As long as the API behaves as defined by it's spec, instance can not be empty (HTTP 200 with an empty body) + return fmt.Errorf("no token returned from the API") + } + tokenString := *token.Token + + return p.OutputResult(outputFormat, token, func() error { + p.Outputln(tokenString) + return nil + }) +} diff --git a/internal/cmd/beta/edge/token/create/create_test.go b/internal/cmd/beta/edge/token/create/create_test.go new file mode 100755 index 000000000..8a78d5e29 --- /dev/null +++ b/internal/cmd/beta/edge/token/create/create_test.go @@ -0,0 +1,675 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package create + +import ( + "context" + "errors" + "net/http" + "testing" + + "github.com/google/uuid" + "github.com/spf13/cobra" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/client" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + commonKubeconfig "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/kubeconfig" + commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testProjectId = uuid.NewString() + testRegion = "eu01" + testInstanceId = "instance" + testDisplayName = "test" + testExpiration = "1h" +) + +// mockTokenWaiter is a mock for the tokenWaiter interface +type mockTokenWaiter struct { + waitFails bool + waitNotFound bool + waitResp *edge.Token +} + +func (m *mockTokenWaiter) WaitWithContext(_ context.Context) (*edge.Token, error) { + if m.waitFails { + return nil, errors.New("wait error") + } + if m.waitNotFound { + return nil, &oapierror.GenericOpenAPIError{ + StatusCode: http.StatusNotFound, + } + } + if m.waitResp != nil { + return m.waitResp, nil + } + + // Default token response + tokenString := "test-token-string" + return &edge.Token{ + Token: &tokenString, + }, nil +} + +// testWaiterFactoryProvider is a test implementation that returns mock waiters. +type testWaiterFactoryProvider struct { + waiter tokenWaiter +} + +func (t *testWaiterFactoryProvider) getTokenWaiter(_ context.Context, model *inputModel, _ client.APIClient) (tokenWaiter, error) { + if model == nil || model.identifier == nil { + return nil, &commonErr.NoIdentifierError{} + } + + // Validate identifier like the real implementation + switch model.identifier.Flag { + case commonInstance.InstanceIdFlag, commonInstance.DisplayNameFlag: + // Return our mock waiter directly, bypassing the client type casting issue + return t.waiter, nil + default: + return nil, commonErr.NewInvalidIdentifierError(model.identifier.Flag) + } +} + +// mockAPIClient is a mock for the edge.APIClient interface +type mockAPIClient struct{} + +// Unused methods to satisfy the interface +func (m *mockAPIClient) GetTokenByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceIdRequest { + return nil +} + +func (m *mockAPIClient) GetTokenByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetTokenByInstanceNameRequest { + return nil +} + +func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiListPlansProjectRequest { + return nil +} + +func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { + return nil +} +func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { + return nil +} +func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { + return nil +} +func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { + return nil +} +func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { + return nil +} +func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceByNameRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceId(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceIdRequest { + return nil +} +func (m *mockAPIClient) GetKubeconfigByInstanceName(_ context.Context, _, _, _ string) edge.ApiGetKubeconfigByInstanceNameRequest { + return nil +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + commonInstance.InstanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureByIdInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(false, mods...) +} + +func fixtureByNameInputModel(mods ...func(model *inputModel)) *inputModel { + return fixtureInputModel(true, mods...) +} + +func fixtureInputModel(useName bool, mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Expiration: uint64(commonKubeconfig.ExpirationSecondsDefault), // Default 1 hour + } + + if useName { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.DisplayNameFlag, + Value: testDisplayName, + } + } else { + model.identifier = &commonValidation.Identifier{ + Flag: commonInstance.InstanceIdFlag, + Value: testInstanceId, + } + } + + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + type args struct { + flags map[string]string + cmpOpts []testUtils.ValueComparisonOption + } + + tests := []struct { + name string + wantErr any + want *inputModel + args args + }{ + { + name: "by id", + want: fixtureByIdInputModel(), + args: args{ + flags: fixtureFlagValues(), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by name", + want: fixtureByNameInputModel(), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "with expiration", + want: fixtureByIdInputModel(func(model *inputModel) { + model.Expiration = uint64(3600) + }), + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = testExpiration + }), + cmpOpts: []testUtils.ValueComparisonOption{ + testUtils.WithAllowUnexported(inputModel{}), + }, + }, + }, + { + name: "by id and name", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.DisplayNameFlag] = testDisplayName + }), + }, + }, + { + name: "no flag values", + wantErr: true, + args: args{ + flags: map[string]string{}, + }, + }, + { + name: "project id missing", + wantErr: &cliErr.ProjectIdError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + }, + }, + { + name: "project id empty", + wantErr: "value cannot be empty", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + }, + }, + { + name: "project id invalid", + wantErr: "invalid UUID length", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + }, + }, + { + name: "instance id missing", + wantErr: true, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + }), + }, + }, + { + name: "instance id empty", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "" + }), + }, + }, + { + name: "instance id too long", + wantErr: &cliErr.FlagValidationError{}, + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "invalid-instance-id" + }), + }, + }, + { + name: "instance id too short", + wantErr: "id is too short", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonInstance.InstanceIdFlag] = "id" + }), + }, + }, + { + name: "name too short", + wantErr: "name is too short", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foo" + }), + }, + }, + { + name: "name too long", + wantErr: "name is too long", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, commonInstance.InstanceIdFlag) + flagValues[commonInstance.DisplayNameFlag] = "foofoofoo" + }), + }, + }, + { + name: "invalid expiration format", + wantErr: "invalid time string format", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = "invalid" + }), + }, + }, + { + name: "expiration too short", + wantErr: "expiration is too small", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = "1s" + }), + }, + }, + { + name: "expiration too long", + wantErr: "expiration is too large", + args: args{ + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[commonKubeconfig.ExpirationFlag] = "13M" + }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caseOpts := []testUtils.ParseInputCaseOption{} + if len(tt.args.cmpOpts) > 0 { + caseOpts = append(caseOpts, testUtils.WithParseInputCmpOptions(tt.args.cmpOpts...)) + } + + testUtils.RunParseInputCase(t, testUtils.ParseInputTestCase[*inputModel]{ + Name: tt.name, + Flags: tt.args.flags, + WantModel: tt.want, + WantErr: tt.wantErr, + CmdFactory: NewCmd, + ParseInputFunc: func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, + }, caseOpts...) + }) + } +} + +func TestRun(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + waiter tokenWaiter + } + tests := []struct { + name string + wantErr any + wantToken bool + args args + }{ + { + name: "run by id success", + wantToken: true, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{}, + }, + }, + { + name: "run by name success", + wantToken: true, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{}, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{}, + }, + }, + { + name: "instance not found error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{waitNotFound: true}, + }, + }, + { + name: "get token by id API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{waitFails: true}, + }, + }, + { + name: "get token by name API error", + wantErr: &cliErr.RequestFailedError{}, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{waitFails: true}, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + waiter: &mockTokenWaiter{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Override production waiterProvider package level variable for testing + prodWaiterProvider := waiterProvider + waiterProvider = &testWaiterFactoryProvider{waiter: tt.args.waiter} + defer func() { waiterProvider = prodWaiterProvider }() + + got, err := run(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + if tt.wantToken && got == nil { + t.Fatal("expected non-nil token") + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + type args struct { + model *inputModel + client client.APIClient + } + + tests := []struct { + name string + wantErr error + want *createRequestSpec + args args + }{ + { + name: "by id", + want: &createRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceId: testInstanceId, + Expiration: int64(commonKubeconfig.ExpirationSecondsDefault), + }, + args: args{ + model: fixtureByIdInputModel(), + client: &mockAPIClient{}, + }, + }, + { + name: "by name", + want: &createRequestSpec{ + ProjectID: testProjectId, + Region: testRegion, + InstanceName: testDisplayName, + Expiration: int64(commonKubeconfig.ExpirationSecondsDefault), + }, + args: args{ + model: fixtureByNameInputModel(), + client: &mockAPIClient{}, + }, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + }), + client: &mockAPIClient{}, + }, + }, + { + name: "identifier invalid", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{ + model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = &commonValidation.Identifier{ + Flag: "unknown-flag", + Value: "some-value", + } + }), + client: &mockAPIClient{}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := buildRequest(testCtx, tt.args.model, tt.args.client) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + testUtils.AssertValue(t, got, tt.want, testUtils.WithIgnoreFields(createRequestSpec{}, "Execute")) + }) + } +} + +func TestGetWaiterFactory(t *testing.T) { + type args struct { + model *inputModel + } + tests := []struct { + name string + want bool + wantErr error + args args + }{ + { + name: "by id", + want: true, + args: args{model: fixtureByIdInputModel()}, + }, + { + name: "by name", + want: true, + args: args{model: fixtureByNameInputModel()}, + }, + { + name: "no id or name", + wantErr: &commonErr.NoIdentifierError{}, + args: args{model: fixtureInputModel(false, func(model *inputModel) { + model.identifier = nil + })}, + }, + { + name: "unknown identifier", + wantErr: &commonErr.InvalidIdentifierError{}, + args: args{model: fixtureInputModel(false, func(model *inputModel) { + model.identifier.Flag = "unknown" + })}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := getWaiterFactory(testCtx, tt.args.model) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + if tt.want && got == nil { + t.Fatal("expected non-nil waiter factory") + } + if !tt.want && got != nil { + t.Fatal("expected nil waiter factory") + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + token *edge.Token + } + tests := []struct { + name string + wantErr any + args args + }{ + { + name: "default output format", + args: args{ + model: fixtureByIdInputModel(), + token: &edge.Token{ + Token: func() *string { s := "test-token"; return &s }(), + }, + }, + }, + { + name: "JSON output format", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + token: &edge.Token{ + Token: func() *string { s := "test-token"; return &s }(), + }, + }, + }, + { + name: "YAML output format", + args: args{ + model: fixtureByIdInputModel(func(model *inputModel) { + model.OutputFormat = print.YAMLOutputFormat + }), + token: &edge.Token{ + Token: func() *string { s := "test-token"; return &s }(), + }, + }, + }, + { + name: "nil token", + wantErr: true, + args: args{ + model: fixtureByIdInputModel(), + token: nil, + }, + }, + { + name: "nil token string", + wantErr: true, + args: args{ + model: fixtureByIdInputModel(), + token: &edge.Token{Token: nil}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + err := outputResult(p, tt.args.model.OutputFormat, tt.args.token) + testUtils.AssertError(t, err, tt.wantErr) + }) + } +} diff --git a/internal/cmd/beta/edge/token/token.go b/internal/cmd/beta/edge/token/token.go new file mode 100644 index 000000000..8fd725a72 --- /dev/null +++ b/internal/cmd/beta/edge/token/token.go @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package token + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/token/create" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "token", + Short: "Provides functionality for edge service token.", + Long: "Provides functionality for STACKIT Edge Cloud (STEC) token management.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) +} diff --git a/internal/cmd/config/profile/import/template/profile.json b/internal/cmd/config/profile/import/template/profile.json index fd14150d7..ed2702e7e 100644 --- a/internal/cmd/config/profile/import/template/profile.json +++ b/internal/cmd/config/profile/import/template/profile.json @@ -3,6 +3,7 @@ "async": false, "authorization_custom_endpoint": "", "dns_custom_endpoint": "", + "edge_custom_endpoint": "", "iaas_custom_endpoint": "", "identity_provider_custom_client_id": "", "identity_provider_custom_well_known_configuration": "", @@ -31,4 +32,4 @@ "sqlserverflex_custom_endpoint": "", "token_custom_endpoint": "", "verbosity": "info" -} \ No newline at end of file +} diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index cf81c4906..64ee916f4 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -26,6 +26,7 @@ const ( authorizationCustomEndpointFlag = "authorization-custom-endpoint" dnsCustomEndpointFlag = "dns-custom-endpoint" + edgeCustomEndpointFlag = "edge-custom-endpoint" loadBalancerCustomEndpointFlag = "load-balancer-custom-endpoint" logMeCustomEndpointFlag = "logme-custom-endpoint" mariaDBCustomEndpointFlag = "mariadb-custom-endpoint" @@ -143,6 +144,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(observabilityCustomEndpointFlag, "", "Observability API base URL, used in calls to this API") cmd.Flags().String(authorizationCustomEndpointFlag, "", "Authorization API base URL, used in calls to this API") cmd.Flags().String(dnsCustomEndpointFlag, "", "DNS API base URL, used in calls to this API") + cmd.Flags().String(edgeCustomEndpointFlag, "", "Edge API base URL, used in calls to this API") cmd.Flags().String(loadBalancerCustomEndpointFlag, "", "Load Balancer API base URL, used in calls to this API") cmd.Flags().String(logMeCustomEndpointFlag, "", "LogMe API base URL, used in calls to this API") cmd.Flags().String(mariaDBCustomEndpointFlag, "", "MariaDB API base URL, used in calls to this API") @@ -182,6 +184,8 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) err = viper.BindPFlag(config.DNSCustomEndpointKey, cmd.Flags().Lookup(dnsCustomEndpointFlag)) cobra.CheckErr(err) + err = viper.BindPFlag(config.EdgeCustomEndpointKey, cmd.Flags().Lookup(edgeCustomEndpointFlag)) + cobra.CheckErr(err) err = viper.BindPFlag(config.LoadBalancerCustomEndpointKey, cmd.Flags().Lookup(loadBalancerCustomEndpointFlag)) cobra.CheckErr(err) err = viper.BindPFlag(config.LogMeCustomEndpointKey, cmd.Flags().Lookup(logMeCustomEndpointFlag)) diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index a3ce21e73..c20aa131c 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -30,6 +30,7 @@ const ( authorizationCustomEndpointFlag = "authorization-custom-endpoint" dnsCustomEndpointFlag = "dns-custom-endpoint" + edgeCustomEndpointFlag = "edge-custom-endpoint" loadBalancerCustomEndpointFlag = "load-balancer-custom-endpoint" logMeCustomEndpointFlag = "logme-custom-endpoint" mariaDBCustomEndpointFlag = "mariadb-custom-endpoint" @@ -70,6 +71,7 @@ type inputModel struct { AuthorizationCustomEndpoint bool DNSCustomEndpoint bool + EdgeCustomEndpoint bool LoadBalancerCustomEndpoint bool LogMeCustomEndpoint bool MariaDBCustomEndpoint bool @@ -154,6 +156,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.DNSCustomEndpoint { viper.Set(config.DNSCustomEndpointKey, "") } + if model.EdgeCustomEndpoint { + viper.Set(config.EdgeCustomEndpointKey, "") + } if model.LoadBalancerCustomEndpoint { viper.Set(config.LoadBalancerCustomEndpointKey, "") } @@ -250,6 +255,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(observabilityCustomEndpointFlag, false, "Observability API base URL. If unset, uses the default base URL") cmd.Flags().Bool(authorizationCustomEndpointFlag, false, "Authorization API base URL. If unset, uses the default base URL") cmd.Flags().Bool(dnsCustomEndpointFlag, false, "DNS API base URL. If unset, uses the default base URL") + cmd.Flags().Bool(edgeCustomEndpointFlag, false, "Edge API base URL. If unset, uses the default base URL") cmd.Flags().Bool(loadBalancerCustomEndpointFlag, false, "Load Balancer API base URL. If unset, uses the default base URL") cmd.Flags().Bool(logMeCustomEndpointFlag, false, "LogMe API base URL. If unset, uses the default base URL") cmd.Flags().Bool(mariaDBCustomEndpointFlag, false, "MariaDB API base URL. If unset, uses the default base URL") @@ -290,6 +296,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { AuthorizationCustomEndpoint: flags.FlagToBoolValue(p, cmd, authorizationCustomEndpointFlag), DNSCustomEndpoint: flags.FlagToBoolValue(p, cmd, dnsCustomEndpointFlag), + EdgeCustomEndpoint: flags.FlagToBoolValue(p, cmd, edgeCustomEndpointFlag), LoadBalancerCustomEndpoint: flags.FlagToBoolValue(p, cmd, loadBalancerCustomEndpointFlag), LogMeCustomEndpoint: flags.FlagToBoolValue(p, cmd, logMeCustomEndpointFlag), MariaDBCustomEndpoint: flags.FlagToBoolValue(p, cmd, mariaDBCustomEndpointFlag), diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index 4ebb6cde7..37ee8f7d2 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -25,6 +25,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool authorizationCustomEndpointFlag: true, dnsCustomEndpointFlag: true, + edgeCustomEndpointFlag: true, loadBalancerCustomEndpointFlag: true, logMeCustomEndpointFlag: true, mariaDBCustomEndpointFlag: true, @@ -67,6 +68,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { AuthorizationCustomEndpoint: true, DNSCustomEndpoint: true, + EdgeCustomEndpoint: true, LoadBalancerCustomEndpoint: true, LogMeCustomEndpoint: true, MariaDBCustomEndpoint: true, @@ -125,6 +127,7 @@ func TestParseInput(t *testing.T) { model.AuthorizationCustomEndpoint = false model.DNSCustomEndpoint = false + model.EdgeCustomEndpoint = false model.LoadBalancerCustomEndpoint = false model.LogMeCustomEndpoint = false model.MariaDBCustomEndpoint = false @@ -218,6 +221,16 @@ func TestParseInput(t *testing.T) { model.DNSCustomEndpoint = false }), }, + { + description: "edge custom endpoint empty", + flagValues: fixtureFlagValues(func(flagValues map[string]bool) { + flagValues[edgeCustomEndpointFlag] = false + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.EdgeCustomEndpoint = false + }), + }, { description: "secrets manager custom endpoint empty", flagValues: fixtureFlagValues(func(flagValues map[string]bool) { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 03170f650..a60bbd17b 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -25,6 +25,7 @@ const ( AuthorizationCustomEndpointKey = "authorization_custom_endpoint" AlbCustomEndpoint = "alb_custom _endpoint" DNSCustomEndpointKey = "dns_custom_endpoint" + EdgeCustomEndpointKey = "edge_custom_endpoint" LoadBalancerCustomEndpointKey = "load_balancer_custom_endpoint" LogMeCustomEndpointKey = "logme_custom_endpoint" MariaDBCustomEndpointKey = "mariadb_custom_endpoint" @@ -85,6 +86,7 @@ var ConfigKeys = []string{ AllowedUrlDomainKey, DNSCustomEndpointKey, + EdgeCustomEndpointKey, LoadBalancerCustomEndpointKey, LogMeCustomEndpointKey, MariaDBCustomEndpointKey, @@ -179,6 +181,7 @@ func setConfigDefaults() { viper.SetDefault(IdentityProviderCustomClientIdKey, "") viper.SetDefault(AllowedUrlDomainKey, AllowedUrlDomainDefault) viper.SetDefault(DNSCustomEndpointKey, "") + viper.SetDefault(EdgeCustomEndpointKey, "") viper.SetDefault(ObservabilityCustomEndpointKey, "") viper.SetDefault(AuthorizationCustomEndpointKey, "") viper.SetDefault(MongoDBFlexCustomEndpointKey, "") diff --git a/internal/pkg/config/template/test_profile.json b/internal/pkg/config/template/test_profile.json index fd14150d7..ed2702e7e 100644 --- a/internal/pkg/config/template/test_profile.json +++ b/internal/pkg/config/template/test_profile.json @@ -3,6 +3,7 @@ "async": false, "authorization_custom_endpoint": "", "dns_custom_endpoint": "", + "edge_custom_endpoint": "", "iaas_custom_endpoint": "", "identity_provider_custom_client_id": "", "identity_provider_custom_well_known_configuration": "", @@ -31,4 +32,4 @@ "sqlserverflex_custom_endpoint": "", "token_custom_endpoint": "", "verbosity": "info" -} \ No newline at end of file +} diff --git a/internal/pkg/errors/errors.go b/internal/pkg/errors/errors.go index 814929497..d690259ea 100644 --- a/internal/pkg/errors/errors.go +++ b/internal/pkg/errors/errors.go @@ -1,10 +1,13 @@ package errors import ( + "encoding/json" + sysErrors "errors" "fmt" "strings" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" ) const ( @@ -548,3 +551,136 @@ type OneOfFlagsIsMissing struct { func (e *OneOfFlagsIsMissing) Error() string { return fmt.Sprintf(ONE_OF_THE_FLAGS_MUST_BE_PROVIDED_WHEN_ANOTHER_FLAG_IS_SET, e.MissingFlags, e.SetFlag) } + +// ___FORMATTING_ERRORS_________________________________________________________ + +// InvalidFormatError indicates that an unsupported format was provided. +type InvalidFormatError struct { + Format string // The invalid format that was provided +} + +func (e *InvalidFormatError) Error() string { + if e.Format != "" { + return fmt.Sprintf("unsupported format provided: %s", e.Format) + } + return "unsupported format provided" +} + +// NewInvalidFormatError creates a new InvalidFormatError with the provided format. +func NewInvalidFormatError(format string) *InvalidFormatError { + return &InvalidFormatError{ + Format: format, + } +} + +// ___BUILD_REQUEST_ERRORS______________________________________________________ +// BuildRequestError indicates that a request could not be built. +type BuildRequestError struct { + Reason string // Optional: specific reason why the request failed to build + Err error // Optional: underlying error +} + +func (e *BuildRequestError) Error() string { + if e.Reason != "" && e.Err != nil { + return fmt.Sprintf("could not build request (%s): %v", e.Reason, e.Err) + } + if e.Reason != "" { + return fmt.Sprintf("could not build request: %s", e.Reason) + } + if e.Err != nil { + return fmt.Sprintf("could not build request: %v", e.Err) + } + return "could not build request" +} + +func (e *BuildRequestError) Unwrap() error { + return e.Err +} + +// NewBuildRequestError creates a new BuildRequestError with optional reason and underlying error. +func NewBuildRequestError(reason string, err error) *BuildRequestError { + return &BuildRequestError{ + Reason: reason, + Err: err, + } +} + +// ___REQUESTS_ERRORS___________________________________________________________ +// RequestFailedError indicates that an API request failed. +// If the provided error is an OpenAPI error, the status code and message from the error body will be included in the error message. +type RequestFailedError struct { + Err error // Optional: underlying error +} + +func (e *RequestFailedError) Error() string { + var msg = "request failed" + + if e.Err != nil { + var oApiErr *oapierror.GenericOpenAPIError + if sysErrors.As(e.Err, &oApiErr) { + // Extract status code from OpenAPI error header if it exists + if oApiErr.StatusCode > 0 { + msg += fmt.Sprintf(" (%d)", oApiErr.StatusCode) + } + + // Try to extract message from OpenAPI error body + if bodyMsg := extractOpenApiMessageFromBody(oApiErr.Body); bodyMsg != "" { + msg += fmt.Sprintf(": %s", bodyMsg) + } else if trimmedBody := strings.TrimSpace(string(oApiErr.Body)); trimmedBody != "" { + msg += fmt.Sprintf(": %s", trimmedBody) + } else { + // Otherwise use the Go error + msg += fmt.Sprintf(": %v", e.Err) + } + } else { + // If this can't be cased into a OpenApi error use the Go error + msg += fmt.Sprintf(": %v", e.Err) + } + } + + return msg +} + +func (e *RequestFailedError) Unwrap() error { + return e.Err +} + +// NewRequestFailedError creates a new RequestFailedError with optional details. +func NewRequestFailedError(err error) *RequestFailedError { + return &RequestFailedError{ + Err: err, + } +} + +// ___HELPERS___________________________________________________________________ +// extractOpenApiMessageFromBody attempts to parse a JSON body and extract the "message" +// field. It returns an empty string if parsing fails or if no message is found. +func extractOpenApiMessageFromBody(body []byte) string { + trimmedBody := strings.TrimSpace(string(body)) + // Return early if empty. + if trimmedBody == "" { + return "" + } + + // Try to unmarshal as a structured error first + var errorBody struct { + Message string `json:"message"` + } + if err := json.Unmarshal(body, &errorBody); err == nil && errorBody.Message != "" { + if msg := strings.TrimSpace(errorBody.Message); msg != "" { + return msg + } + } + + // If that fails, try to unmarshal as a plain string + var plainBody string + if err := json.Unmarshal(body, &plainBody); err == nil && plainBody != "" { + if msg := strings.TrimSpace(plainBody); msg != "" { + return msg + } + return "" + } + + // All parsing attempts failed or yielded no message + return "" +} diff --git a/internal/pkg/errors/errors_test.go b/internal/pkg/errors/errors_test.go index d2942e87f..8a1c3d117 100644 --- a/internal/pkg/errors/errors_test.go +++ b/internal/pkg/errors/errors_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" ) var cmd *cobra.Command @@ -13,6 +14,13 @@ var service *cobra.Command var resource *cobra.Command var operation *cobra.Command +var ( + testErrorMessage = "test error message" + errStringErrTest = errors.New(testErrorMessage) + errOpenApi404 = &oapierror.GenericOpenAPIError{StatusCode: 404, Body: []byte(`{"message":"not found"}`)} + errOpenApi500 = &oapierror.GenericOpenAPIError{StatusCode: 500, Body: []byte(`invalid-json`)} +) + func setupCmd() { cmd = &cobra.Command{ Use: "stackit", @@ -686,3 +694,238 @@ func TestAppendUsageTip(t *testing.T) { }) } } + +func TestInvalidFormatError(t *testing.T) { + type args struct { + format string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty", + args: args{ + format: "", + }, + want: "unsupported format provided", + }, + { + name: "with format", + args: args{ + format: "yaml", + }, + want: "unsupported format provided: yaml", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&InvalidFormatError{Format: tt.args.format}).Error() + if got != tt.want { + t.Errorf("got %q, want %q", got, tt.want) + } + }) + } +} + +func TestBuildRequestError(t *testing.T) { + type args struct { + reason string + err error + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty", + args: args{ + reason: "", + err: nil, + }, + want: "could not build request", + }, + { + name: "reason only", + args: args{ + reason: testErrorMessage, + err: nil, + }, + want: fmt.Sprintf("could not build request: %s", testErrorMessage), + }, + { + name: "error only", + args: args{ + reason: "", + err: errStringErrTest, + }, + want: fmt.Sprintf("could not build request: %s", testErrorMessage), + }, + { + name: "reason and error", + args: args{ + reason: testErrorMessage, + err: errStringErrTest, + }, + want: fmt.Sprintf("could not build request (%s): %s", testErrorMessage, testErrorMessage), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&BuildRequestError{Reason: tt.args.reason, Err: tt.args.err}).Error() + if got != tt.want { + t.Errorf("got %q, want %q", got, tt.want) + } + }) + } +} + +func TestRequestFailedError(t *testing.T) { + type args struct { + err error + } + tests := []struct { + name string + args args + want string + }{ + { + name: "nil underlying", + args: args{ + err: nil, + }, + want: "request failed", + }, + { + name: "non-openapi error", + args: args{ + err: errStringErrTest, + }, + want: fmt.Sprintf("request failed: %s", testErrorMessage), + }, + { + name: "openapi error with message", + args: args{ + err: errOpenApi404, + }, + want: "request failed (404): not found", + }, + { + name: "openapi error without message", + args: args{ + err: errOpenApi500, + }, + want: "request failed (500): invalid-json", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&RequestFailedError{Err: tt.args.err}).Error() + if got != tt.want { + t.Errorf("got %q, want %q", got, tt.want) + } + }) + } +} + +func TestExtractMessageFromBody(t *testing.T) { + type args struct { + body []byte + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty body", + args: args{ + body: []byte(""), + }, + want: "", + }, + { + name: "invalid json", + args: args{ + body: []byte("not-json"), + }, + want: "", + }, + { + name: "missing message field", + args: args{ + body: []byte(`{"error":"oops"}`), + }, + want: "", + }, + { + name: "with message field", + args: args{ + body: []byte(`{"message":"the reason"}`), + }, + want: "the reason", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := extractOpenApiMessageFromBody(tt.args.body) + if got != tt.want { + t.Errorf("got %q, want %q", got, tt.want) + } + }) + } +} + +func TestConstructorsReturnExpected(t *testing.T) { + buildRequestError := NewBuildRequestError(testErrorMessage, errStringErrTest) + + tests := []struct { + name string + got any + want any + }{ + { + name: "InvalidFormat format", + got: NewInvalidFormatError("fmt").Format, + want: "fmt", + }, + { + name: "BuildRequestError error", + got: buildRequestError.Err, + want: errStringErrTest, + }, + { + name: "BuildRequestError reason", + got: buildRequestError.Reason, + want: testErrorMessage, + }, + { + name: "RequestFailed error", + got: NewRequestFailedError(errStringErrTest).Err, + want: errStringErrTest, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + wantErr, wantIsErr := tt.want.(error) + gotErr, gotIsErr := tt.got.(error) + if wantIsErr { + if !gotIsErr { + t.Fatalf("expected error but got %T", tt.got) + } + if !errors.Is(gotErr, wantErr) { + t.Errorf("got error %v, want %v", gotErr, wantErr) + } + return + } + + if tt.got != tt.want { + t.Errorf("got %v, want %v", tt.got, tt.want) + } + }) + } +} diff --git a/internal/pkg/services/edge/client/client.go b/internal/pkg/services/edge/client/client.go new file mode 100644 index 000000000..566e4cc05 --- /dev/null +++ b/internal/pkg/services/edge/client/client.go @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package client + +import ( + "context" + + "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/edge" +) + +// APIClient is an interface that consolidates all client functionality to allow for mocking of the API client during testing. +type APIClient interface { + PostInstances(ctx context.Context, projectId, region string) edge.ApiPostInstancesRequest + DeleteInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiDeleteInstanceRequest + DeleteInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiDeleteInstanceByNameRequest + GetInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiGetInstanceRequest + GetInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetInstanceByNameRequest + GetInstances(ctx context.Context, projectId, region string) edge.ApiGetInstancesRequest + UpdateInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiUpdateInstanceRequest + UpdateInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiUpdateInstanceByNameRequest + GetKubeconfigByInstanceId(ctx context.Context, projectId, region, instanceId string) edge.ApiGetKubeconfigByInstanceIdRequest + GetKubeconfigByInstanceName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetKubeconfigByInstanceNameRequest + GetTokenByInstanceId(ctx context.Context, projectId, region, instanceId string) edge.ApiGetTokenByInstanceIdRequest + GetTokenByInstanceName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetTokenByInstanceNameRequest + ListPlansProject(ctx context.Context, projectId string) edge.ApiListPlansProjectRequest +} + +// ConfigureClient configures and returns a new API client for the Edge service. +func ConfigureClient(p *print.Printer, cliVersion string) (APIClient, error) { + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.EdgeCustomEndpointKey), false, edge.NewAPIClient) +} diff --git a/internal/pkg/services/edge/common/error/error.go b/internal/pkg/services/edge/common/error/error.go new file mode 100755 index 000000000..2fd1433c3 --- /dev/null +++ b/internal/pkg/services/edge/common/error/error.go @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +// Package error provides custom error types for STACKIT Edge Cloud operations. +// +// This package defines structured error types that provide better error handling +// and type checking compared to simple string errors. Each error type can carry +// additional context and implements the standard error interface. +package error + +import ( + "fmt" +) + +// NoIdentifierError indicates that no identifier was provided when one was required. +type NoIdentifierError struct { + Operation string // Optional: which operation failed +} + +func (e *NoIdentifierError) Error() string { + if e.Operation != "" { + return fmt.Sprintf("no identifier provided for %s", e.Operation) + } + return "no identifier provided" +} + +// InvalidIdentifierError indicates that an unsupported identifier was provided. +type InvalidIdentifierError struct { + Identifier string // The invalid identifier that was provided +} + +func (e *InvalidIdentifierError) Error() string { + if e.Identifier != "" { + return fmt.Sprintf("unsupported identifier provided: %s", e.Identifier) + } + return "unsupported identifier provided" +} + +// InstanceExistsError indicates that a specific instance already exists. +type InstanceExistsError struct { + DisplayName string // Optional: the display name that was searched for +} + +func (e *InstanceExistsError) Error() string { + if e.DisplayName != "" { + return fmt.Sprintf("instance already exists: %s", e.DisplayName) + } + return "instance already exists" +} + +// NoInstanceError indicates that no instance was provided in a context where one was expected. +type NoInstanceError struct { + Context string // Optional: context where no instance was found (e.g., "in response", "in project") +} + +func (e *NoInstanceError) Error() string { + if e.Context != "" { + return fmt.Sprintf("no instance provided %s", e.Context) + } + return "no instance provided" +} + +// NewNoIdentifierError creates a new NoIdentifierError with optional context. +func NewNoIdentifierError(operation string) *NoIdentifierError { + return &NoIdentifierError{Operation: operation} +} + +// NewInvalidIdentifierError creates a new InvalidIdentifierError with the provided identifier. +func NewInvalidIdentifierError(identifier string) *InvalidIdentifierError { + return &InvalidIdentifierError{ + Identifier: identifier, + } +} + +// NewInstanceExistsError creates a new InstanceExistsError with optional instance details. +func NewInstanceExistsError(displayName string) *InstanceExistsError { + return &InstanceExistsError{ + DisplayName: displayName, + } +} + +// NewNoInstanceError creates a new NoInstanceError with optional context. +func NewNoInstanceError(context string) *NoInstanceError { + return &NoInstanceError{Context: context} +} diff --git a/internal/pkg/services/edge/common/error/error_test.go b/internal/pkg/services/edge/common/error/error_test.go new file mode 100755 index 000000000..1268d898a --- /dev/null +++ b/internal/pkg/services/edge/common/error/error_test.go @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +// Unit tests for package error +package error + +import ( + "testing" + + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" +) + +func TestNoIdentifierError(t *testing.T) { + type args struct { + operation string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty", + args: args{ + operation: "", + }, + want: "no identifier provided", + }, + { + name: "with operation", + args: args{ + operation: "create", + }, + want: "no identifier provided for create", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&NoIdentifierError{Operation: tt.args.operation}).Error() + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestInvalidIdentifierError(t *testing.T) { + type args struct { + id string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty", + args: args{ + id: "", + }, + want: "unsupported identifier provided", + }, + { + name: "with identifier", + args: args{ + id: "x-123", + }, + want: "unsupported identifier provided: x-123", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&InvalidIdentifierError{Identifier: tt.args.id}).Error() + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestInstanceExistsError(t *testing.T) { + type args struct { + name string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty", + args: args{name: ""}, + want: "instance already exists"}, + { + name: "with display name", + args: args{name: "my-inst"}, + want: "instance already exists: my-inst", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&InstanceExistsError{DisplayName: tt.args.name}).Error() + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestNoInstanceError(t *testing.T) { + type args struct { + ctx string + } + tests := []struct { + name string + args args + want string + }{ + { + name: "empty", + args: args{ + ctx: "", + }, + want: "no instance provided", + }, + { + name: "with context", + args: args{ + ctx: "in project", + }, + want: "no instance provided in project", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := (&NoInstanceError{Context: tt.args.ctx}).Error() + testUtils.AssertValue(t, got, tt.want) + }) + } +} + +func TestConstructorsReturnExpected(t *testing.T) { + tests := []struct { + name string + got any + want any + }{ + { + name: "NoIdentifier operation", + got: NewNoIdentifierError("op").Operation, + want: "op", + }, + { + name: "InvalidIdentifier identifier", + got: NewInvalidIdentifierError("id").Identifier, + want: "id", + }, + { + name: "InstanceExists displayName", + got: NewInstanceExistsError("name").DisplayName, + want: "name", + }, + { + name: "NoInstance context", + got: NewNoInstanceError("ctx").Context, + want: "ctx", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + wantErr, wantIsErr := tt.want.(error) + gotErr, gotIsErr := tt.got.(error) + if wantIsErr { + if !gotIsErr { + t.Fatalf("expected error but got %T", tt.got) + } + testUtils.AssertError(t, gotErr, wantErr) + return + } + + testUtils.AssertValue(t, tt.got, tt.want) + }) + } +} diff --git a/internal/pkg/services/edge/common/instance/instance.go b/internal/pkg/services/edge/common/instance/instance.go new file mode 100644 index 000000000..6dc35c672 --- /dev/null +++ b/internal/pkg/services/edge/common/instance/instance.go @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package instance + +import ( + "fmt" + "regexp" + + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + cliUtils "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +// Validation constants taken from OpenApi spec. +const ( + displayNameMinimumChars = 4 + displayNameMaximumChars = 8 + displayNameRegex = `^[a-z]([-a-z0-9]*[a-z0-9])?$` + descriptionMaxLength = 256 + instanceIdMaxLength = 16 + instanceIdMinLength = displayNameMinimumChars + 1 // Instance ID is generated by extending the display name. +) + +// User input flags for instance commands +const ( + DisplayNameFlag = "name" // > displayNameMinimumChars <= displayNameMaximumChars characters + regex displayNameRegex + DescriptionFlag = "description" // <= descriptionMaxLength characters + PlanIdFlag = "plan-id" // UUID + InstanceIdFlag = "id" // instance id (unique per project) +) + +// Flag usage texts +const ( + DisplayNameUsage = "The displayed name to distinguish multiple instances." + DescriptionUsage = "A user chosen description to distinguish multiple instances." + PlanIdUsage = "Service Plan configures the size of the Instance." + InstanceIdUsage = "The project-unique identifier of this instance." +) + +// Flag shorthands +const ( + DisplayNameShorthand = "n" + DescriptionShorthand = "d" + InstanceIdShorthand = "i" +) + +// OpenApi generated code will have different types for by-instance-id and by-display-name API calls, which are currently impl. as separate endpoints. +// To make the code more flexible, we use a struct to hold the request model. +type RequestModel struct { + Value any +} + +func ValidateDisplayName(displayName *string) error { + if displayName == nil { + return &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s may not be empty", DisplayNameFlag), + } + } + + if len(*displayName) > displayNameMaximumChars { + return &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", DisplayNameFlag, displayNameMaximumChars), + } + } + if len(*displayName) < displayNameMinimumChars { + return &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s is too short (minimum length is %d characters)", DisplayNameFlag, displayNameMinimumChars), + } + } + displayNameRegex := regexp.MustCompile(displayNameRegex) + if !displayNameRegex.MatchString(*displayName) { + return &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s didn't match the required regex expression %s", DisplayNameFlag, displayNameRegex), + } + } + return nil +} + +func ValidatePlanId(planId *string) error { + if planId == nil { + return &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s may not be empty", PlanIdFlag), + } + } + + err := cliUtils.ValidateUUID(*planId) + if err != nil { + return &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s is not a valid UUID: %v", PlanIdFlag, err), + } + } + return nil +} + +func ValidateDescription(description string) error { + if len(description) > descriptionMaxLength { + return &cliErr.FlagValidationError{ + Flag: DescriptionFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", DescriptionFlag, descriptionMaxLength), + } + } + + return nil +} + +func ValidateInstanceId(instanceId *string) error { + if instanceId == nil { + return &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s may not be empty", InstanceIdFlag), + } + } + + if *instanceId == "" { + return &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s may not be empty", InstanceIdFlag), + } + } + if len(*instanceId) < instanceIdMinLength { + return &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s is too short (minimum length is %d characters)", InstanceIdFlag, instanceIdMinLength), + } + } + if len(*instanceId) > instanceIdMaxLength { + return &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", InstanceIdFlag, instanceIdMaxLength), + } + } + + return nil +} diff --git a/internal/pkg/services/edge/common/instance/instance_test.go b/internal/pkg/services/edge/common/instance/instance_test.go new file mode 100755 index 000000000..70a7dd11d --- /dev/null +++ b/internal/pkg/services/edge/common/instance/instance_test.go @@ -0,0 +1,348 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package instance + +import ( + "fmt" + "strings" + "testing" + + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func TestValidateDisplayName(t *testing.T) { + type args struct { + displayName *string + } + tests := []struct { + name string + args *args + want error + }{ + // Valid cases + { + name: "valid minimum length", + args: &args{displayName: utils.Ptr("test")}, + }, + { + name: "valid maximum length", + args: &args{displayName: utils.Ptr("testname")}, + }, + { + name: "valid with hyphens", + args: &args{displayName: utils.Ptr("test-app")}, + }, + { + name: "valid with numbers", + args: &args{displayName: utils.Ptr("test123")}, + }, + { + name: "valid starting with letter", + args: &args{displayName: utils.Ptr("a-test")}, + }, + + // Error cases - nil pointer + { + name: "nil display name", + args: &args{displayName: nil}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s may not be empty", DisplayNameFlag), + }, + }, + + // Error cases - length validation + { + name: "too short", + args: &args{displayName: utils.Ptr("abc")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s is too short (minimum length is %d characters)", DisplayNameFlag, displayNameMinimumChars), + }, + }, + { + name: "too long", + args: &args{displayName: utils.Ptr("verylongname")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", DisplayNameFlag, displayNameMaximumChars), + }, + }, + + // Error cases - regex validation + { + name: "starts with number", + args: &args{displayName: utils.Ptr("1test")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s didn't match the required regex expression %s", DisplayNameFlag, displayNameRegex), + }, + }, + { + name: "starts with hyphen", + args: &args{displayName: utils.Ptr("-test")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s didn't match the required regex expression %s", DisplayNameFlag, displayNameRegex), + }, + }, + { + name: "ends with hyphen", + args: &args{displayName: utils.Ptr("test-")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s didn't match the required regex expression %s", DisplayNameFlag, displayNameRegex), + }, + }, + { + name: "contains uppercase", + args: &args{displayName: utils.Ptr("Test")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s didn't match the required regex expression %s", DisplayNameFlag, displayNameRegex), + }, + }, + { + name: "contains special characters", + args: &args{displayName: utils.Ptr("test@")}, + want: &cliErr.FlagValidationError{ + Flag: DisplayNameFlag, + Details: fmt.Sprintf("%s didn't match the required regex expression %s", DisplayNameFlag, displayNameRegex), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidateDisplayName(tt.args.displayName) + testUtils.AssertError(t, err, tt.want) + }) + } +} + +func TestValidatePlanId(t *testing.T) { + type args struct { + planId *string + } + tests := []struct { + name string + args *args + want error + }{ + // Valid cases + { + name: "valid UUID v4", + args: &args{planId: utils.Ptr("550e8400-e29b-41d4-a716-446655440000")}, + }, + { + name: "valid UUID lowercase", + args: &args{planId: utils.Ptr("6ba7b810-9dad-11d1-80b4-00c04fd430c8")}, + }, + { + name: "valid UUID uppercase", + args: &args{planId: utils.Ptr("6BA7B810-9DAD-11D1-80B4-00C04FD430C8")}, + }, + { + name: "valid UUID without hyphens", + args: &args{planId: utils.Ptr("550e8400e29b41d4a716446655440000")}, + }, + + // Error cases - nil pointer + { + name: "nil plan id", + args: &args{planId: nil}, + want: &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s may not be empty", PlanIdFlag), + }, + }, + + // Error cases - invalid UUID format + { + name: "invalid UUID - too short", + args: &args{planId: utils.Ptr("550e8400-e29b-41d4-a716")}, + want: &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s is not a valid UUID: parse 550e8400-e29b-41d4-a716 as UUID: invalid UUID length: 23", PlanIdFlag), + }, + }, + { + name: "invalid UUID - invalid characters", + args: &args{planId: utils.Ptr("550e8400-e29b-41d4-a716-44665544000g")}, + want: &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s is not a valid UUID: parse 550e8400-e29b-41d4-a716-44665544000g as UUID: invalid UUID format", PlanIdFlag), + }, + }, + { + name: "not a UUID", + args: &args{planId: utils.Ptr("not-a-uuid")}, + want: &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s is not a valid UUID: parse not-a-uuid as UUID: invalid UUID length: 10", PlanIdFlag), + }, + }, + { + name: "empty string", + args: &args{planId: utils.Ptr("")}, + want: &cliErr.FlagValidationError{ + Flag: PlanIdFlag, + Details: fmt.Sprintf("%s is not a valid UUID: parse as UUID: invalid UUID length: 0", PlanIdFlag), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidatePlanId(tt.args.planId) + testUtils.AssertError(t, err, tt.want) + }) + } +} + +func TestValidateDescription(t *testing.T) { + type args struct { + description string + } + tests := []struct { + name string + args *args + want error + }{ + // Valid cases + { + name: "empty description", + args: &args{description: ""}, + }, + { + name: "short description", + args: &args{description: "A short description"}, + }, + { + name: "description at maximum length", + args: &args{description: strings.Repeat("a", descriptionMaxLength)}, + }, + { + name: "description with special characters", + args: &args{description: "Description with special chars: !@#$%^&*()"}, + }, + { + name: "description with unicode", + args: &args{description: "Description with unicode: 你好世界 🌍"}, + }, + + // Error cases + { + name: "description too long", + args: &args{description: strings.Repeat("a", descriptionMaxLength+1)}, + want: &cliErr.FlagValidationError{ + Flag: DescriptionFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", DescriptionFlag, descriptionMaxLength), + }, + }, + { + name: "description way too long", + args: &args{description: strings.Repeat("a", descriptionMaxLength+100)}, + want: &cliErr.FlagValidationError{ + Flag: DescriptionFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", DescriptionFlag, descriptionMaxLength), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidateDescription(tt.args.description) + testUtils.AssertError(t, err, tt.want) + }) + } +} + +func TestValidateInstanceId(t *testing.T) { + type args struct { + instanceId *string + } + tests := []struct { + name string + args *args + want error + }{ + // Valid cases + { + name: "valid instance id at minimum length", + args: &args{instanceId: utils.Ptr(strings.Repeat("a", instanceIdMinLength))}, + }, + { + name: "valid instance id at maximum length", + args: &args{instanceId: utils.Ptr(strings.Repeat("a", instanceIdMaxLength))}, + }, + { + name: "valid instance id with mixed characters", + args: &args{instanceId: utils.Ptr("test-instance")}, + }, + + // Error cases - nil pointer + { + name: "nil instance id", + args: &args{instanceId: nil}, + want: &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s may not be empty", InstanceIdFlag), + }, + }, + + // Error cases - empty string + { + name: "empty string", + args: &args{instanceId: utils.Ptr("")}, + want: &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s may not be empty", InstanceIdFlag), + }, + }, + + // Error cases - length validation + { + name: "too short", + args: &args{instanceId: utils.Ptr(strings.Repeat("a", instanceIdMinLength-1))}, + want: &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s is too short (minimum length is %d characters)", InstanceIdFlag, instanceIdMinLength), + }, + }, + { + name: "way too short", + args: &args{instanceId: utils.Ptr("a")}, + want: &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s is too short (minimum length is %d characters)", InstanceIdFlag, instanceIdMinLength), + }, + }, + { + name: "too long", + args: &args{instanceId: utils.Ptr(strings.Repeat("a", instanceIdMaxLength+1))}, + want: &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", InstanceIdFlag, instanceIdMaxLength), + }, + }, + { + name: "way too long", + args: &args{instanceId: utils.Ptr(strings.Repeat("a", instanceIdMaxLength+10))}, + want: &cliErr.FlagValidationError{ + Flag: InstanceIdFlag, + Details: fmt.Sprintf("%s is too long (maximum length is %d characters)", InstanceIdFlag, instanceIdMaxLength), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidateInstanceId(tt.args.instanceId) + testUtils.AssertError(t, err, tt.want) + }) + } +} diff --git a/internal/pkg/services/edge/common/kubeconfig/kubeconfig.go b/internal/pkg/services/edge/common/kubeconfig/kubeconfig.go new file mode 100755 index 000000000..ef0918c8b --- /dev/null +++ b/internal/pkg/services/edge/common/kubeconfig/kubeconfig.go @@ -0,0 +1,361 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package kubeconfig + +import ( + "fmt" + "maps" + "math" + "os" + "path/filepath" + + "k8s.io/client-go/tools/clientcmd" +) + +// Validation constants taken from OpenApi spec. +const ( + expirationSecondsMax = 15552000 // 60 * 60 * 24 * 180 seconds = 180 days + expirationSecondsMin = 600 // 60 * 10 seconds = 10 minutes +) + +// Defaults taken from OpenApi spec. +const ( + ExpirationSecondsDefault = 3600 // 60 * 60 seconds = 1 hour +) + +// User input flags for kubeconfig commands +const ( + ExpirationFlag = "expiration" + DisableWritingFlag = "disable-writing" + FilepathFlag = "filepath" + OverwriteFlag = "overwrite" + SwitchContextFlag = "switch-context" +) + +// Flag usage texts +const ( + ExpirationUsage = "Expiration time for the kubeconfig, e.g. 5d. By default, the token is valid for 1h." + FilepathUsage = "Path to the kubeconfig file. A default is chosen by Kubernetes if not set." + DisableWritingUsage = "Disable writing the kubeconfig to a file." + OverwriteUsage = "Force overwrite the kubeconfig file if it exists." + SwitchContextUsage = "Switch to the context in the kubeconfig file to the new context." +) + +// Flag shorthands +const ( + ExpirationShorthand = "e" + DisableWritingShorthand = "" + FilepathShorthand = "f" + OverwriteShorthand = "" + SwitchContextShorthand = "" +) + +func ValidateExpiration(expiration *uint64) error { + if expiration != nil { + // We're using utils.ConvertToSeconds to convert the user input string to seconds, which is using + // math.MaxUint64 internally, if no special limits are set. However: the OpenApi v3 Spec + // only allows integers (int64). So we could end up in a overflow IF expirationSecondsMax + // ever is changed beyond the maximum value of int64. This check makes sure this won't happen. + maxExpiration := uint64(math.Min(expirationSecondsMax, math.MaxInt64)) + if *expiration > maxExpiration { + return fmt.Errorf("%s is too large (maximum is %d seconds)", ExpirationFlag, maxExpiration) + } + // If expiration is ever changed to int64 this check makes sure we never end up with negative expiration times. + minExpiration := uint64(math.Max(expirationSecondsMin, 0)) + if *expiration < minExpiration { + return fmt.Errorf("%s is too small (minimum is %d seconds)", ExpirationFlag, minExpiration) + } + } + return nil +} + +// EmptyKubeconfigError is returned when the kubeconfig content is empty. +type EmptyKubeconfigError struct{} + +// Error returns the error message. +func (e *EmptyKubeconfigError) Error() string { + return "no data for kubeconfig" +} + +// LoadKubeconfigError is returned when loading the kubeconfig fails. +type LoadKubeconfigError struct { + Err error +} + +// Error returns the error message. +func (e *LoadKubeconfigError) Error() string { + return fmt.Sprintf("load kubeconfig: %v", e.Err) +} + +// Unwrap returns the underlying error. +func (e *LoadKubeconfigError) Unwrap() error { + return e.Err +} + +// WriteKubeconfigError is returned when writing the kubeconfig fails. +type WriteKubeconfigError struct { + Err error +} + +// Error returns the error message. +func (e *WriteKubeconfigError) Error() string { + return fmt.Sprintf("write kubeconfig: %v", e.Err) +} + +// Unwrap returns the underlying error. +func (e *WriteKubeconfigError) Unwrap() error { + return e.Err +} + +// InvalidKubeconfigPathError is returned when an invalid kubeconfig path is provided. +type InvalidKubeconfigPathError struct { + Path string +} + +// Error returns the error message. +func (e *InvalidKubeconfigPathError) Error() string { + return fmt.Sprintf("invalid path: %s", e.Path) +} + +// mergeKubeconfig merges new kubeconfig data into a kubeconfig file. +// +// If the destination file does not exist, it will be created. If the file exists, +// the new data (clusters, contexts, and users) is merged into the existing +// configuration, overwriting entries with the same name and replacing the +// current-context if defined in the new data. +// +// The function takes the following parameters: +// - configPath: The path to the destination file. The file and the directory tree +// for the file will be created if it does not exist. +// - data: The new kubeconfig content to merge. Merge is performed based on standard +// kubeconfig structure. +// - switchContext: If true, the function will switch to the new context in the +// kubeconfig file after merging. +// +// It returns a nil error on success. On failure, it returns an error indicating +// if the provided data was empty, malformed, or if there were issues reading from +// or writing to the filesystem. +func mergeKubeconfig(filePath *string, data string, switchContext bool) error { + if filePath == nil { + return fmt.Errorf("no kubeconfig file provided to be merged") + } + path := *filePath + + // Check if the new kubeconfig data is empty + if data == "" { + return &EmptyKubeconfigError{} + } + + // Load and validate the data into a kubeconfig object + newConfig, err := clientcmd.Load([]byte(data)) + if err != nil { + return &LoadKubeconfigError{Err: err} + } + + // If the destination kubeconfig does not exist, create a new one. IsNotExist will ignore other errors. + // Other errors are handled separately by the following clientcmd.LoadFromFile clientcmd.LoadFromFile + if _, err := os.Stat(path); os.IsNotExist(err) { + return writeKubeconfig(&path, data) + } + + // If the file exists load and validate the existing kubeconfig into a config object + existingConfig, err := clientcmd.LoadFromFile(path) + if err != nil { + return &LoadKubeconfigError{Err: err} + } + + // Merge the new kubeconfig data into the existing config object + maps.Copy(existingConfig.AuthInfos, newConfig.AuthInfos) + maps.Copy(existingConfig.Clusters, newConfig.Clusters) + maps.Copy(existingConfig.Contexts, newConfig.Contexts) + + // If no CurrentContext is set or switchContext is true, set the CurrentContext to the CurrentContext of the new kubeconfig + if newConfig.CurrentContext != "" && (switchContext || existingConfig.CurrentContext == "") { + existingConfig.CurrentContext = newConfig.CurrentContext + } + + // Save the merged config to the file, creating missing directories as needed. + if err := clientcmd.WriteToFile(*existingConfig, path); err != nil { + return &WriteKubeconfigError{Err: err} + } + + return nil +} + +// writeKubeconfig writes kubeconfig data to a file, overwriting it if it exists. +// +// The function takes the following parameters: +// - configPath: The path to the destination file. The file and the directory tree +// for the file will be created if it does not exist. +// - data: The new kubeconfig content to write to the file. +// +// It returns a nil error on success. On failure, it returns an error indicating +// if the provided data was empty, malformed, or if there were issues reading from +// or writing to the filesystem. +func writeKubeconfig(filePath *string, data string) error { + if filePath == nil { + return fmt.Errorf("no kubeconfig file provided to be written") + } + path := *filePath + + // Check if the new kubeconfig data is empty + if data == "" { + return &EmptyKubeconfigError{} + } + + // Load and validate the data into a kubeconfig object + config, err := clientcmd.Load([]byte(data)) + if err != nil { + return &LoadKubeconfigError{Err: err} + } + + // Save the merged config to the file, creating missing directories as needed. + if err := clientcmd.WriteToFile(*config, path); err != nil { + return &WriteKubeconfigError{Err: err} + } + + return nil +} + +// getDefaultKubeconfigPath returns the default location for the kubeconfig file, +// following standard Kubernetes loading rules. +// +// It returns a string containing the absolute path to the default kubeconfig file. +func getDefaultKubeconfigPath() string { + return clientcmd.NewDefaultClientConfigLoadingRules().GetDefaultFilename() +} + +// Returns the absolute path to the kubeconfig file. +// If a file path is provided, it is validated and, if valid, returned as an absolute path. +// If nil is provided the default kubeconfig path is loaded and returned as an absolute path. +func getKubeconfigPath(filePath *string) (string, error) { + if filePath == nil { + return getDefaultKubeconfigPath(), nil + } + + if isValidFilePath(filePath) { + return filepath.Abs(*filePath) + } + return "", &InvalidKubeconfigPathError{Path: *filePath} +} + +// Basic filesystem path validation. Returns true if the provided string is a path. Returns false otherwise. +func isValidFilePath(filePath *string) bool { + if filePath == nil || *filePath == "" { + return false + } + + // Clean the path and check if it's valid + cleaned := filepath.Clean(*filePath) + if cleaned == "." || cleaned == string(filepath.Separator) { + return false + } + + // Try to get absolute path (this will fail for invalid paths) + _, err := filepath.Abs(*filePath) + // If no error, the path is valid (return true). Otherwise, it's invalid (return false). + return err == nil +} + +// Basic filesystem file existence check. Returns true if the file exists. Returns false otherwise. +func isExistingFile(filePath *string) bool { + // Check if the kubeconfig file exists + _, errStat := os.Stat(*filePath) + return !os.IsNotExist(errStat) +} + +// ConfirmationCallback is a function that prompts for confirmation with the given message +// and returns true if confirmed, false otherwise +type ConfirmationCallback func(message string) error + +// WriteOptions contains options for writing kubeconfig files +type WriteOptions struct { + Overwrite bool + SwitchContext bool + ConfirmFn ConfirmationCallback +} + +// WithOverwrite sets whether to overwrite existing files instead of merging +func (w WriteOptions) WithOverwrite(overwrite bool) WriteOptions { + w.Overwrite = overwrite + return w +} + +// WithSwitchContext sets whether to switch to the new context after writing +func (w WriteOptions) WithSwitchContext(switchContext bool) WriteOptions { + w.SwitchContext = switchContext + return w +} + +// WithConfirmation sets the confirmation callback function +func (w WriteOptions) WithConfirmation(fn ConfirmationCallback) WriteOptions { + w.ConfirmFn = fn + return w +} + +// NewWriteOptions creates a new WriteOptions with default values +func NewWriteOptions() WriteOptions { + return WriteOptions{ + Overwrite: false, + SwitchContext: false, + ConfirmFn: nil, + } +} + +// WriteKubeconfig writes the provided kubeconfig data to a file on the filesystem. +// By default, if the file already exists, it will be merged with the provided data. +// This behavior can be controlled using the provided options. +// +// The function takes the following parameters: +// - filePath: The path to the destination file. The file and the directory tree for the +// file will be created if it does not exist. If nil, the default kubeconfig path is used. +// - kubeconfig: The kubeconfig content to write. +// - options: Options for controlling the write behavior. +// +// It returns the file path actually used to write to on success. +func WriteKubeconfig(filePath *string, kubeconfig string, options WriteOptions) (*string, error) { + // Check if the provided filePath is valid or use the default kubeconfig path no filePath is provided + path, err := getKubeconfigPath(filePath) + if err != nil { + return nil, err + } + + if isExistingFile(&path) { + // If the file exists + if !options.Overwrite { + // If overwrite was not requested the default it to merge + if options.ConfirmFn != nil { + // If confirmation callback is provided, prompt the user for confirmation + prompt := fmt.Sprintf("Update your kubeconfig %q?", path) + err := options.ConfirmFn(prompt) + if err != nil { + // If the user doesn't confirm do not proceed with the merge + return nil, err + } + } + err := mergeKubeconfig(&path, kubeconfig, options.SwitchContext) + if err != nil { + return nil, err + } + return &path, err + } + // If overwrite was requested overwrite the existing file + if options.ConfirmFn != nil { + // If confirmation callback is provided, prompt the user for confirmation + prompt := fmt.Sprintf("Replace your kubeconfig %q?", path) + err := options.ConfirmFn(prompt) + if err != nil { + // If the user doesn't confirm do not proceed with the overwrite + return nil, err + } + // Fallthrough + } + } + // If the file doesn't exist or in case the user confirmed the overwrite (fallthrough) write the file + err = writeKubeconfig(&path, kubeconfig) + if err != nil { + return nil, err + } + return &path, err +} diff --git a/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go b/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go new file mode 100755 index 000000000..59bbba0b0 --- /dev/null +++ b/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go @@ -0,0 +1,744 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package kubeconfig + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "testing" + + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "k8s.io/client-go/tools/clientcmd" +) + +var ( + testErrorMessage = "test error message" + errStringErrTest = errors.New(testErrorMessage) +) + +const ( + kubeconfig_1_yaml = ` +apiVersion: v1 +clusters: +- cluster: + server: https://server-1.com + name: cluster-1 +contexts: +- context: + cluster: cluster-1 + user: user-1 + name: context-1 +current-context: context-1 +kind: Config +preferences: {} +users: +- name: user-1 + user: {} +` + kubeconfig_2_yaml = ` +apiVersion: v1 +clusters: +- cluster: + server: https://server-2.com + name: cluster-2 +contexts: +- context: + cluster: cluster-2 + user: user-2 + name: context-2 +current-context: context-2 +kind: Config +users: +- name: user-2 + user: {} +` + overwriteKubeconfigTarget = ` +apiVersion: v1 +clusters: +- cluster: + server: https://server-1.com + name: cluster-1 +contexts: +- context: + cluster: cluster-1 + user: user-1 + name: context-1 +current-context: context-1 +kind: Config +users: +- name: user-1 + user: + token: old-token +` + overwriteKubeconfigSource = ` +apiVersion: v1 +clusters: +- cluster: + server: https://server-1-new.com + name: cluster-1 +contexts: +- context: + cluster: cluster-1 + user: user-1 + name: context-1 +current-context: context-1 +kind: Config +users: +- name: user-1 + user: + token: new-token +` +) + +func TestValidateExpiration(t *testing.T) { + type args struct { + expiration *uint64 + } + tests := []struct { + name string + args *args + want error + }{ + // Valid cases + { + name: "nil expiration", + args: &args{ + expiration: nil, + }, + }, + { + name: "valid expiration - minimum value", + args: &args{ + expiration: utils.Ptr(uint64(expirationSecondsMin)), + }, + }, + { + name: "valid expiration - maximum value", + args: &args{ + expiration: utils.Ptr(uint64(expirationSecondsMax)), + }, + }, + { + name: "valid expiration - default value", + args: &args{ + expiration: utils.Ptr(uint64(ExpirationSecondsDefault)), + }, + }, + { + name: "valid expiration - middle value", + args: &args{ + expiration: utils.Ptr(uint64(86400)), // 1 day + }, + }, + + // Error cases - below minimum + { + name: "expiration too small - below minimum", + args: &args{ + expiration: utils.Ptr(uint64(expirationSecondsMin - 1)), + }, + want: fmt.Errorf("%s is too small (minimum is %d seconds)", ExpirationFlag, expirationSecondsMin), + }, + { + name: "expiration too small - zero", + args: &args{ + expiration: utils.Ptr(uint64(0)), + }, + want: fmt.Errorf("%s is too small (minimum is %d seconds)", ExpirationFlag, expirationSecondsMin), + }, + + // Error cases - above maximum + { + name: "expiration too large - above maximum", + args: &args{ + expiration: utils.Ptr(uint64(expirationSecondsMax + 1)), + }, + want: fmt.Errorf("%s is too large (maximum is %d seconds)", ExpirationFlag, expirationSecondsMax), + }, + { + name: "expiration too large - way above maximum", + args: &args{ + expiration: utils.Ptr(uint64(9999999999999999999)), + }, + want: fmt.Errorf("%s is too large (maximum is %d seconds)", ExpirationFlag, expirationSecondsMax), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidateExpiration(tt.args.expiration) + testUtils.AssertError(t, err, tt.want) + }) + } +} + +func TestErrors(t *testing.T) { + type args struct { + err error + } + tests := []struct { + name string + args *args + wantErr error + }{ + // EmptyKubeconfigError + { + name: "EmptyKubeconfigError", + args: &args{ + err: &EmptyKubeconfigError{}, + }, + wantErr: &EmptyKubeconfigError{}, + }, + + // LoadKubeconfigError + { + name: "LoadKubeconfigError", + args: &args{ + err: &LoadKubeconfigError{Err: errStringErrTest}, + }, + wantErr: errStringErrTest, + }, + + // WriteKubeconfigError + { + name: "WriteKubeconfigError", + args: &args{ + err: &WriteKubeconfigError{Err: errStringErrTest}, + }, + wantErr: errStringErrTest, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testUtils.AssertError(t, tt.args.err, tt.wantErr) + }) + } +} + +// Already have comprehensive tests for WriteKubeconfig + +func TestWriteOptions(t *testing.T) { + confirmFn := func(_ string) error { return nil } + + type args struct { + modify func(WriteOptions) WriteOptions + check func(*testing.T, WriteOptions) + } + tests := []struct { + name string + args *args + }{ + // Default options + { + name: "NewWriteOptions creates default options", + args: &args{ + modify: func(o WriteOptions) WriteOptions { return o }, + check: func(t *testing.T, opts WriteOptions) { + if opts.Overwrite { + t.Error("expected Overwrite to be false by default") + } + if opts.SwitchContext { + t.Error("expected SwitchContext to be false by default") + } + if opts.ConfirmFn != nil { + t.Error("expected ConfirmFn to be nil by default") + } + }, + }, + }, + + // Individual option tests + { + name: "WithOverwrite sets overwrite flag", + args: &args{ + modify: func(o WriteOptions) WriteOptions { return o.WithOverwrite(true) }, + check: func(t *testing.T, opts WriteOptions) { + if !opts.Overwrite { + t.Error("expected Overwrite to be true") + } + }, + }, + }, + { + name: "WithSwitchContext sets switch context flag", + args: &args{ + modify: func(o WriteOptions) WriteOptions { return o.WithSwitchContext(true) }, + check: func(t *testing.T, opts WriteOptions) { + if !opts.SwitchContext { + t.Error("expected SwitchContext to be true") + } + }, + }, + }, + { + name: "WithConfirmation sets confirmation callback", + args: &args{ + modify: func(o WriteOptions) WriteOptions { return o.WithConfirmation(confirmFn) }, + check: func(t *testing.T, opts WriteOptions) { + if opts.ConfirmFn == nil { + t.Error("expected ConfirmFn to be set") + } + }, + }, + }, + + // Chained options + { + name: "options are chainable", + args: &args{ + modify: func(o WriteOptions) WriteOptions { + return o.WithOverwrite(true). + WithSwitchContext(true). + WithConfirmation(confirmFn) + }, + check: func(t *testing.T, opts WriteOptions) { + if !opts.Overwrite { + t.Error("expected Overwrite to be true") + } + if !opts.SwitchContext { + t.Error("expected SwitchContext to be true") + } + if opts.ConfirmFn == nil { + t.Error("expected ConfirmFn to be set") + } + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + opts := tt.args.modify(NewWriteOptions()) + tt.args.check(t, opts) + }) + } +} + +func TestGetDefaultKubeconfigPath(t *testing.T) { + type args struct { + kubeconfigEnv *string // nil means unset + } + tests := []struct { + name string + args *args + want string + }{ + // KUBECONFIG not set + { + name: "returns a non-empty path when KUBECONFIG is not set", + args: &args{kubeconfigEnv: nil}, + want: "", + }, + + // Single path + { + name: "returns path from KUBECONFIG if set", + args: &args{kubeconfigEnv: utils.Ptr("/test/kubeconfig_1_yaml")}, + want: "/test/kubeconfig_1_yaml", + }, + + // Multiple paths + { + name: "returns first path from KUBECONFIG if multiple are set", + args: &args{kubeconfigEnv: utils.Ptr("/test/kubeconfig_1_yaml" + string(os.PathListSeparator) + "/test/kubeconfig_2_yaml")}, + want: "/test/kubeconfig_1_yaml", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Save original env and restore after test + oldKubeconfig := os.Getenv("KUBECONFIG") + defer func() { + if err := os.Setenv("KUBECONFIG", oldKubeconfig); err != nil { + t.Logf("failed to restore KUBECONFIG: %v", err) + } + }() + + // Setup test environment + if tt.args.kubeconfigEnv == nil { + if err := os.Unsetenv("KUBECONFIG"); err != nil { + t.Fatalf("failed to unset KUBECONFIG: %v", err) + } + } else { + if err := os.Setenv("KUBECONFIG", *tt.args.kubeconfigEnv); err != nil { + t.Fatalf("failed to set KUBECONFIG: %v", err) + } + } + + // Run test + got := getDefaultKubeconfigPath() + + // If want is empty only make sure the returned path is not empty + // In that case we don't care about what path is default, only that one is. + want := filepath.Clean(tt.want) + if want == filepath.Clean("") { + if filepath.Clean(got) != "" { + return + } + } + + // Verify results + testUtils.AssertValue(t, filepath.Clean(got), want) + }) + } +} + +func TestGetKubeconfigPath(t *testing.T) { + type args struct { + path *string + checkPath func(t *testing.T, path string) + } + tests := []struct { + name string + args *args + wantErr error + }{ + { + name: "uses default path when nil provided", + args: &args{ + path: nil, + checkPath: func(t *testing.T, path string) { + if path == "" { + t.Error("expected non-empty path") + } + }, + }, + }, + { + name: "validates and returns absolute path when valid path provided", + args: &args{ + path: utils.Ptr("/tmp/kubeconfig"), + checkPath: func(t *testing.T, path string) { + if !filepath.IsAbs(path) { + t.Error("expected absolute path") + } + }, + }, + }, + { + name: "returns error for invalid path", + args: &args{ + path: utils.Ptr("."), + }, + wantErr: &InvalidKubeconfigPathError{Path: "."}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + path, err := getKubeconfigPath(tt.args.path) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + if tt.args.checkPath != nil { + tt.args.checkPath(t, path) + } + }) + } +} + +func TestIsValidFilePath(t *testing.T) { + type args struct { + path *string + } + tests := []struct { + name string + args *args + + want bool + }{ + { + name: "valid path", + args: &args{ + path: utils.Ptr("/test/kubeconfig"), + }, + want: true, + }, + { + name: "nil path", + args: &args{ + path: nil, + }, + want: false, + }, + { + name: "empty path", + args: &args{ + path: utils.Ptr(""), + }, + want: false, + }, + { + name: "single dot", + args: &args{ + path: utils.Ptr("."), + }, + want: false, + }, + { + name: "single slash", + args: &args{ + path: utils.Ptr("/"), + }, + want: false, + }, + { + name: "relative path with parent directory", + args: &args{ + path: utils.Ptr("../kubeconfig"), + }, + want: true, + }, + { + name: "path with spaces", + args: &args{ + path: utils.Ptr("/test/kube config"), + }, + want: true, + }, + { + name: "complex but valid path", + args: &args{ + path: utils.Ptr("/test/kube-config.d/cluster1/config"), + }, + want: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := isValidFilePath(tt.args.path); got != tt.want { + t.Errorf("isValidFilePath() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWriteKubeconfig(t *testing.T) { + testPath := filepath.Join(t.TempDir(), "config") + defaultTempFile := filepath.Join(t.TempDir(), "default-kubeconfig") + + type args struct { + path *string + content string + options WriteOptions + setupEnv func() + checkFile func(t *testing.T, path string) + } + tests := []struct { + name string + args *args + wantPath *string + wantErr any + }{ + { + name: "writes new file with default options", + args: &args{ + path: &testPath, + content: kubeconfig_1_yaml, + options: NewWriteOptions(), + checkFile: func(t *testing.T, path string) { + if !isExistingFile(&path) { + t.Error("file was not created") + } + }, + }, + wantPath: &testPath, + }, + { + name: "handles invalid file path", + args: &args{ + path: utils.Ptr("."), + content: kubeconfig_1_yaml, + options: NewWriteOptions(), + }, + wantErr: &InvalidKubeconfigPathError{Path: "."}, + }, + { + name: "handles empty kubeconfig", + args: &args{ + path: &testPath, + content: "", + options: NewWriteOptions(), + }, + wantErr: &EmptyKubeconfigError{}, + }, + { + name: "uses default path when nil provided", + args: &args{ + path: nil, + content: kubeconfig_1_yaml, + options: NewWriteOptions(), + setupEnv: func() { + t.Setenv("KUBECONFIG", defaultTempFile) + }, + }, + wantPath: &defaultTempFile, + }, + { + name: "overwrites existing file when option is set", + args: &args{ + path: &testPath, + content: kubeconfig_2_yaml, + options: NewWriteOptions().WithOverwrite(true), + setupEnv: func() { + // Pre-write first file + if _, err := WriteKubeconfig(&testPath, kubeconfig_1_yaml, NewWriteOptions()); err != nil { + t.Fatalf("failed to setup test: %v", err) + } + }, + checkFile: func(t *testing.T, path string) { + content, err := os.ReadFile(path) + if err != nil { + t.Fatalf("failed to read kubeconfig: %v", err) + } + if !strings.Contains(string(content), "server-2.com") { + t.Error("file was not overwritten") + } + }, + }, + wantPath: &testPath, + }, + { + name: "respects user confirmation - confirmed", + args: &args{ + path: &testPath, + content: kubeconfig_1_yaml, + options: NewWriteOptions().WithConfirmation(func(_ string) error { + return nil + }), + }, + wantPath: &testPath, + }, + { + name: "respects user confirmation - denied", + args: &args{ + path: &testPath, + content: kubeconfig_1_yaml, + options: NewWriteOptions().WithConfirmation(func(_ string) error { + return errStringErrTest + }), + }, + wantErr: errStringErrTest, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.setupEnv != nil { + tt.args.setupEnv() + } + + got, gotErr := WriteKubeconfig(tt.args.path, tt.args.content, tt.args.options) + if !testUtils.AssertError(t, gotErr, tt.wantErr) { + return + } + + testUtils.AssertValue(t, got, tt.wantPath) + + if tt.args.checkFile != nil { + tt.args.checkFile(t, *got) + } + }) + } +} + +func TestMergeKubeconfig(t *testing.T) { + type args struct { + path *string + content string + switchCtx bool + setupEnv func() + } + tests := []struct { + name string + args args + verify func(t *testing.T, path string) + wantErr error + }{ + { + name: "merges configs with conflicting names", + args: args{ + path: utils.Ptr(filepath.Join(t.TempDir(), "kubeconfig")), + content: overwriteKubeconfigSource, + switchCtx: true, + setupEnv: func() { + // Pre-write first file + if _, err := WriteKubeconfig(utils.Ptr(filepath.Join(t.TempDir(), "kubeconfig")), overwriteKubeconfigTarget, NewWriteOptions()); err != nil { + t.Fatalf("failed to setup test: %v", err) + } + }, + }, + verify: func(t *testing.T, path string) { + config, err := clientcmd.LoadFromFile(path) + if err != nil { + t.Fatalf("failed to load merged config: %v", err) + } + + cluster := config.Clusters["cluster-1"] + if cluster.Server != "https://server-1-new.com" { + t.Errorf("expected server to be 'https://server-1-new.com', got '%s'", cluster.Server) + } + + user := config.AuthInfos["user-1"] + if user.Token != "new-token" { + t.Errorf("expected token to be 'new-token', got '%s'", user.Token) + } + }, + }, + { + name: "handles nil file path", + args: args{ + path: nil, + content: kubeconfig_1_yaml, + switchCtx: false, + }, + wantErr: fmt.Errorf("no kubeconfig file provided to be merged"), + }, + { + name: "handles invalid config", + args: args{ + path: utils.Ptr(filepath.Join(t.TempDir(), "kubeconfig")), + content: "invalid yaml", + switchCtx: false, + }, + wantErr: &LoadKubeconfigError{}, + }, + { + name: "handles empty config", + args: args{ + path: utils.Ptr(filepath.Join(t.TempDir(), "kubeconfig")), + content: "", + switchCtx: false, + }, + wantErr: &EmptyKubeconfigError{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.setupEnv != nil { + tt.args.setupEnv() + } + + err := mergeKubeconfig(tt.args.path, tt.args.content, tt.args.switchCtx) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + + if tt.verify != nil { + if tt.args.path == nil { + t.Fatalf("expected path to be set") + } + tt.verify(t, *tt.args.path) + } + }) + } +} diff --git a/internal/pkg/services/edge/common/validation/input.go b/internal/pkg/services/edge/common/validation/input.go new file mode 100644 index 000000000..33a2d0c46 --- /dev/null +++ b/internal/pkg/services/edge/common/validation/input.go @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package validation + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" +) + +// Struct to model the instance identifier provided by the user (either instance-id or display-name) +type Identifier struct { + Flag string + Value string +} + +// GetValidatedInstanceIdentifier gets and validates the instance identifier provided by the user through the command-line flags. +// It checks for either an instance ID or a display name and validates the provided value. +// +// p is the printer used for logging. +// cmd is the cobra command that holds the flags. +// +// Returns an Identifier struct containing the flag and its value if a valid identifier is provided, otherwise returns an error. +// Indirect unit tests of GetValidatedInstanceIdentifier are done within the respective CLI packages. +func GetValidatedInstanceIdentifier(p *print.Printer, cmd *cobra.Command) (*Identifier, error) { + switch { + case cmd.Flags().Changed(commonInstance.InstanceIdFlag): + instanceIdValue := flags.FlagToStringPointer(p, cmd, commonInstance.InstanceIdFlag) + if err := commonInstance.ValidateInstanceId(instanceIdValue); err != nil { + return nil, err + } + return &Identifier{ + Flag: commonInstance.InstanceIdFlag, + Value: *instanceIdValue, + }, nil + case cmd.Flags().Changed(commonInstance.DisplayNameFlag): + displayNameValue := flags.FlagToStringPointer(p, cmd, commonInstance.DisplayNameFlag) + if err := commonInstance.ValidateDisplayName(displayNameValue); err != nil { + return nil, err + } + return &Identifier{ + Flag: commonInstance.DisplayNameFlag, + Value: *displayNameValue, + }, nil + default: + return nil, commonErr.NewNoIdentifierError("") + } +} diff --git a/internal/pkg/services/edge/common/validation/input_test.go b/internal/pkg/services/edge/common/validation/input_test.go new file mode 100755 index 000000000..0ccb2d3b2 --- /dev/null +++ b/internal/pkg/services/edge/common/validation/input_test.go @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package validation + +import ( + "testing" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" + commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" +) + +func TestGetValidatedInstanceIdentifier(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + setup func(*cobra.Command) + want *Identifier + wantErr any + }{ + { + name: "instance id success", + setup: func(cmd *cobra.Command) { + cmd.Flags().String(commonInstance.InstanceIdFlag, "", "") + _ = cmd.Flags().Set(commonInstance.InstanceIdFlag, "edgesvc01") + }, + want: &Identifier{Flag: commonInstance.InstanceIdFlag, Value: "edgesvc01"}, + }, + { + name: "display name success", + setup: func(cmd *cobra.Command) { + cmd.Flags().String(commonInstance.DisplayNameFlag, "", "") + _ = cmd.Flags().Set(commonInstance.DisplayNameFlag, "edge01") + }, + want: &Identifier{Flag: commonInstance.DisplayNameFlag, Value: "edge01"}, + }, + { + name: "instance id validation error", + setup: func(cmd *cobra.Command) { + cmd.Flags().String(commonInstance.InstanceIdFlag, "", "") + _ = cmd.Flags().Set(commonInstance.InstanceIdFlag, "id") + }, + wantErr: "too short", + }, + { + name: "display name validation error", + setup: func(cmd *cobra.Command) { + cmd.Flags().String(commonInstance.DisplayNameFlag, "", "") + _ = cmd.Flags().Set(commonInstance.DisplayNameFlag, "x") + }, + wantErr: "too short", + }, + { + name: "no identifier", + setup: func(_ *cobra.Command) {}, + wantErr: &commonErr.NoIdentifierError{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + printer := print.NewPrinter() + cmd := &cobra.Command{Use: "test"} + tt.setup(cmd) + + got, err := GetValidatedInstanceIdentifier(printer, cmd) + if !testUtils.AssertError(t, err, tt.wantErr) { + return + } + if tt.want != nil { + testUtils.AssertValue(t, got, tt.want) + } + }) + } +} diff --git a/internal/pkg/testutils/assert.go b/internal/pkg/testutils/assert.go new file mode 100755 index 000000000..42c280a71 --- /dev/null +++ b/internal/pkg/testutils/assert.go @@ -0,0 +1,181 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package testutils + +// Package test provides utilities for validating CLI command test results with +// explicit helpers for error expectations and value comparisons. By splitting +// error and value handling the package keeps assertions simple and removes the +// need for dynamic type checks in every test case. +// +// Example usage: +// +// // Expect a specific error type +// if !test.AssertError(t, run(), &cliErr.FlagValidationError{}) { +// return +// } +// +// // Expect any error +// if !test.AssertError(t, run(), true) { +// return +// } +// +// // Expect error message substring +// if !test.AssertError(t, run(), "not found") { +// return +// } +// +// // Compare complex structs with private fields +// test.AssertValue(t, got, want, test.WithAllowUnexported(MyStruct{})) + +import ( + "errors" + "reflect" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" +) + +// AssertError verifies that an observed error satisfies the expected condition. +// +// Returns: +// - bool: True if the test should continue to value checks (i.e., no error occurred). +// +// Behavior: +// 1. If err is nil: +// - If want is nil or false: Success. +// - If want is anything else: Fails test (Expected error but got nil). +// 2. If err is non-nil: +// - If want is nil or false: Fails test (Unexpected error). +// - If want is true: Success (Any error accepted). +// - If want is string: Asserts err.Error() contains the string. +// - If want is error: Asserts errors.Is(err, want) or type match. +func AssertError(t testing.TB, got error, want any) bool { + t.Helper() + + // Case 1: No error occurred + if got == nil { + if want == nil || want == false { + return true + } + t.Errorf("got nil error, want %v", want) + return false + } + + // Case 2: Error occurred + if want == nil || want == false { + t.Errorf("got unexpected error: %v", got) + return false + } + + if want == true { + return false // Error expected and received, stop test + } + + // Handle string error type expectation + if wantStr, ok := want.(string); ok { + if !strings.Contains(got.Error(), wantStr) { + t.Errorf("got error %q, want substring %q", got, wantStr) + } + return false + } + + // Handle specific error type expectation + if wantErr, ok := want.(error); ok { + if checkErrorMatch(got, wantErr) { + return false + } + t.Errorf("got error %v, want %v", got, wantErr) + return false + } + + t.Errorf("invalid want type %T for AssertError", want) + return false +} + +func checkErrorMatch(got, want error) bool { + if errors.Is(got, want) { + return true + } + + // Fallback to type check using errors.As to handle wrapped errors + if want != nil { + typ := reflect.TypeOf(want) + // errors.As requires a pointer to the target type. + // reflect.New(typ) returns *T where T is the type of want. + target := reflect.New(typ).Interface() + if errors.As(got, target) { + return true + } + } + + return false +} + +// DiffFunc compares two values and returns a diff string. An empty string means +// equality. +type DiffFunc func(got, want any) string + +// ValueComparisonOption configures how HandleValueResult applies cmp options or +// diffing strategies. +type ValueComparisonOption func(*valueComparisonConfig) + +type valueComparisonConfig struct { + diffFunc DiffFunc + cmpOptions []cmp.Option +} + +func (config *valueComparisonConfig) getDiffFunc() DiffFunc { + if config.diffFunc != nil { + return config.diffFunc + } + return func(got, want any) string { + return cmp.Diff(got, want, config.cmpOptions...) + } +} + +// WithCmpOptions accumulates cmp.Options used during value comparison. +func WithAssertionCmpOptions(opts ...cmp.Option) ValueComparisonOption { + return func(config *valueComparisonConfig) { + config.cmpOptions = append(config.cmpOptions, opts...) + } +} + +// WithAllowUnexported enables comparison of unexported fields for the provided +// struct types. +func WithAllowUnexported(types ...any) ValueComparisonOption { + return WithAssertionCmpOptions(cmp.AllowUnexported(types...)) +} + +// WithDiffFunc sets a custom diffing function. Providing this option overrides +// the default cmp-based diff logic. +func WithDiffFunc(diffFunc DiffFunc) ValueComparisonOption { + return func(config *valueComparisonConfig) { + config.diffFunc = diffFunc + } +} + +// WithIgnoreFields ignores the specified fields on the provided type during comparison. +// It uses cmpopts.IgnoreFields to ensure type-safe filtering. +func WithIgnoreFields(typ any, names ...string) ValueComparisonOption { + return WithAssertionCmpOptions(cmpopts.IgnoreFields(typ, names...)) +} + +// AssertValue compares two values with cmp.Diff while allowing callers to +// tweak the diff strategy via ValueComparisonOption. A non-empty diff is +// reported as an error containing the diff output. +func AssertValue[T any](t testing.TB, got, want T, opts ...ValueComparisonOption) { + t.Helper() + // Configure comparison options + config := &valueComparisonConfig{} + for _, opt := range opts { + opt(config) + } + // Perform comparison and report diff + diff := config.getDiffFunc()(got, want) + if diff != "" { + t.Errorf("values do not match: %s", diff) + } +} diff --git a/internal/pkg/testutils/assert_test.go b/internal/pkg/testutils/assert_test.go new file mode 100755 index 000000000..ae683a54b --- /dev/null +++ b/internal/pkg/testutils/assert_test.go @@ -0,0 +1,227 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package testutils + +import ( + "errors" + "fmt" + "reflect" + "testing" + + "github.com/google/go-cmp/cmp/cmpopts" +) + +type customError struct{ msg string } + +func (e *customError) Error() string { return e.msg } + +type anotherError struct{ code int } + +func (e *anotherError) Error() string { return fmt.Sprintf("code=%d", e.code) } + +type mockTB struct { + testing.TB + failed bool + msg string +} + +func (m *mockTB) Helper() {} +func (m *mockTB) Errorf(format string, args ...any) { + m.failed = true + m.msg = fmt.Sprintf(format, args...) +} + +func TestAssertError(t *testing.T) { + t.Parallel() + + sentinel := errors.New("sentinel") + + tests := map[string]struct { + got error // The input provided as got to AssertError() + want any // The input provided as want to AssertError() + wantErr bool // Whether this comparison is expected to fail + }{ + "exact match": { + got: &customError{msg: "boom"}, + want: &customError{}, + wantErr: false, + }, + "error string message match": { + got: errors.New("same message"), + want: "same message", + wantErr: false, + }, + "error string mismatch": { + got: errors.New("different"), + want: "same message", + wantErr: true, + }, + "sentinel via errors.Is": { + got: fmt.Errorf("wrap: %w", sentinel), + want: sentinel, + wantErr: false, + }, + "any error (true)": { + got: errors.New("any"), + want: true, + wantErr: false, + }, + "nil expectation (nil)": { + got: nil, + want: nil, + wantErr: false, + }, + "nil expectation (false)": { + got: nil, + want: false, + wantErr: false, + }, + "nil error input with error expectation": { + got: nil, + want: true, + wantErr: true, + }, + "unexpected error (nil want)": { + got: errors.New("unexpected"), + want: nil, + wantErr: true, + }, + "type match without message": { + got: &customError{msg: "alpha"}, + want: &customError{msg: "beta"}, + wantErr: false, + }, + "type mismatch": { + got: &customError{msg: "alpha"}, + want: &anotherError{}, + wantErr: true, + }, + "no error when none expected": { + got: nil, + want: false, + wantErr: false, + }, + "error but want false": { + got: errors.New("boom"), + want: false, + wantErr: true, + }, + } + + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + t.Parallel() + mock := &mockTB{} + result := AssertError(mock, tt.got, tt.want) + + // if the test failed but we didn't expect it to fail + if mock.failed != tt.wantErr { + t.Fatalf("AssertError() failed = %v, wantErr %v (msg: %s)", mock.failed, tt.wantErr, mock.msg) + } + // if we expected an error the result of AssertError() should be false (this is what AssertError() does in case of error) + if tt.wantErr && result != false { + t.Fatalf("AssertError() returned = %v, want %v", result, tt.wantErr) + } + }) + } +} + +func TestCheckErrorMatch(t *testing.T) { + t.Parallel() + + underlying := &customError{msg: "root"} + wrapped := fmt.Errorf("wrap: %w", underlying) + if !checkErrorMatch(wrapped, &customError{}) { + t.Fatalf("expected wrapped customError to match via errors.As") + } + + notMatch := errors.New("other") + if checkErrorMatch(notMatch, &anotherError{}) { + t.Fatalf("expected mismatch for unrelated error types") + } +} + +func TestAssertValue(t *testing.T) { + t.Parallel() + + type payload struct { + Visible string + hidden int + } + + customDiff := func(got, want any) string { + if reflect.DeepEqual(got, want) { + return "" + } + return "custom diff" + } + + tests := []struct { + name string + got any // The input provided as got to AssertValue() + want any // The input provided as want to AssertValue() + wantErr bool // Whether this comparison is expected to fail + opts []ValueComparisonOption + }{ + { + name: "allow unexported success", + got: payload{Visible: "ok", hidden: 1}, + want: payload{Visible: "ok", hidden: 1}, + opts: []ValueComparisonOption{WithAllowUnexported(payload{})}, + }, + { + name: "allow unexported mismatch", + got: payload{Visible: "oops", hidden: 1}, + want: payload{Visible: "ok", hidden: 1}, + opts: []ValueComparisonOption{WithAllowUnexported(payload{})}, + wantErr: true, + }, + { + name: "cmp options sort", + got: []string{"b", "a", "c"}, + want: []string{"a", "b", "c"}, + opts: []ValueComparisonOption{WithAssertionCmpOptions(cmpopts.SortSlices(func(a, b string) bool { return a < b }))}, + }, + { + name: "custom diff mismatch", + got: 1, + want: 2, + opts: []ValueComparisonOption{WithDiffFunc(customDiff)}, + wantErr: true, + }, + { + name: "default diff success", + got: 42, + want: 42, + }, + { + name: "default diff mismatch", + got: 1, + want: 2, + wantErr: true, + }, + { + name: "diff func overrides cmp options", + got: []string{"b"}, + want: []string{"a"}, + opts: []ValueComparisonOption{ + WithAssertionCmpOptions(cmpopts.SortSlices(func(a, b string) bool { return a < b })), + WithDiffFunc(func(_, _ any) string { return "" }), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + mock := &mockTB{} + AssertValue(mock, tt.got, tt.want, tt.opts...) + + // if the test failed but we didn't expect it to fail + if mock.failed != tt.wantErr { + t.Fatalf("AssertValue failed = %v, want %v (msg: %s)", mock.failed, tt.wantErr, mock.msg) + } + }) + } +} diff --git a/internal/pkg/testutils/parse_input.go b/internal/pkg/testutils/parse_input.go new file mode 100755 index 000000000..a0deafbc7 --- /dev/null +++ b/internal/pkg/testutils/parse_input.go @@ -0,0 +1,126 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package testutils + +import ( + "testing" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" +) + +// ParseInputTestCase aggregates all required elements to exercise a CLI parseInput +// function. It centralizes the common flag setup, validation, and result +// assertions used throughout the edge command test suites. +type ParseInputTestCase[T any] struct { + Name string + // Args simulates positional arguments passed to the command. + Args []string + // Flags sets simple single-value flags. + Flags map[string]string + // RepeatFlags sets flags that can be specified multiple times (e.g. slice flags). + RepeatFlags map[string][]string + WantModel T + WantErr any + CmdFactory func(*types.CmdParams) *cobra.Command + // ParseInputFunc is the function under test. It must accept the printer, command, and args. + ParseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error) +} + +// ParseInputCaseOption allows configuring the test execution behavior. +type ParseInputCaseOption func(*parseInputCaseConfig) + +type parseInputCaseConfig struct { + cmpOpts []ValueComparisonOption +} + +// WithParseInputCmpOptions sets custom comparison options for AssertValue. +func WithParseInputCmpOptions(opts ...ValueComparisonOption) ParseInputCaseOption { + return func(cfg *parseInputCaseConfig) { + cfg.cmpOpts = append(cfg.cmpOpts, opts...) + } +} + +func defaultParseInputCaseConfig() *parseInputCaseConfig { + return &parseInputCaseConfig{} +} + +// RunParseInputCase executes a single parse-input test case using the provided +// configuration. It mirrors the typical table-driven pattern while removing the +// boilerplate repeated across tests. The helper short-circuits as soon as an +// expected error is encountered. +func RunParseInputCase[T any](t *testing.T, tc ParseInputTestCase[T], opts ...ParseInputCaseOption) { + t.Helper() + + cfg := defaultParseInputCaseConfig() + for _, opt := range opts { + opt(cfg) + } + + if tc.CmdFactory == nil { + t.Fatalf("parse input case %q missing CmdFactory", tc.Name) + } + if tc.ParseInputFunc == nil { + t.Fatalf("parse input case %q missing ParseInputFunc", tc.Name) + } + + printer := print.NewPrinter() + cmd := tc.CmdFactory(&types.CmdParams{Printer: printer}) + if cmd == nil { + t.Fatalf("parse input case %q produced nil command", tc.Name) + } + if printer.Cmd == nil { + printer.Cmd = cmd + } + + if err := globalflags.Configure(cmd.Flags()); err != nil { + t.Fatalf("configure global flags: %v", err) + } + + // Set regular flag values. + for flag, value := range tc.Flags { + if err := cmd.Flags().Set(flag, value); err != nil { + AssertError(t, err, tc.WantErr) + return + } + } + + // Set repeated flag values. + for flag, values := range tc.RepeatFlags { + for _, value := range values { + if err := cmd.Flags().Set(flag, value); err != nil { + AssertError(t, err, tc.WantErr) + return + } + } + } + + // Test cobra argument validation. + if err := cmd.ValidateArgs(tc.Args); err != nil { + AssertError(t, err, tc.WantErr) + return + } + + // Test cobra required flags validation. + if err := cmd.ValidateRequiredFlags(); err != nil { + AssertError(t, err, tc.WantErr) + return + } + + // Test cobra flag group validation. + if err := cmd.ValidateFlagGroups(); err != nil { + AssertError(t, err, tc.WantErr) + return + } + + // Test parse input function. + got, err := tc.ParseInputFunc(printer, cmd, tc.Args) + if !AssertError(t, err, tc.WantErr) { + return + } + + AssertValue(t, got, tc.WantModel, cfg.cmpOpts...) +} diff --git a/internal/pkg/testutils/parse_input_test.go b/internal/pkg/testutils/parse_input_test.go new file mode 100755 index 000000000..32008eea3 --- /dev/null +++ b/internal/pkg/testutils/parse_input_test.go @@ -0,0 +1,169 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2025 STACKIT GmbH & Co. KG + +package testutils + +import ( + "errors" + "testing" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" +) + +type parseInputTestModel struct { + Value string + Args []string + RepeatValue []string + hidden string +} + +func newTestCmdFactory(flagSetup func(*cobra.Command)) func(*types.CmdParams) *cobra.Command { + return func(*types.CmdParams) *cobra.Command { + cmd := &cobra.Command{Use: "test"} + if flagSetup != nil { + flagSetup(cmd) + } + return cmd + } +} + +func TestRunParseInputCase(t *testing.T) { + sentinel := errors.New("parse failed") + tests := []struct { + name string + flagSetup func(*cobra.Command) + flags map[string]string + repeatFlags map[string][]string + args []string + cmpOpts []ParseInputCaseOption + wantModel *parseInputTestModel + wantErr any + parseFunc func(*print.Printer, *cobra.Command, []string) (*parseInputTestModel, error) + expectParseCall bool + }{ + { + name: "success", + flagSetup: func(cmd *cobra.Command) { + cmd.Flags().String("name", "", "") + }, + flags: map[string]string{"name": "edge"}, + cmpOpts: []ParseInputCaseOption{WithParseInputCmpOptions(WithAllowUnexported(parseInputTestModel{}))}, + wantModel: &parseInputTestModel{Value: "edge", hidden: "protected"}, + parseFunc: func(_ *print.Printer, cmd *cobra.Command, _ []string) (*parseInputTestModel, error) { + val, _ := cmd.Flags().GetString("name") + return &parseInputTestModel{Value: val, hidden: "protected"}, nil + }, + expectParseCall: true, + }, + { + name: "flag set failure", + flagSetup: func(cmd *cobra.Command) { + cmd.Flags().Int("count", 0, "") + }, + flags: map[string]string{"count": "invalid"}, + wantErr: "invalid syntax", + parseFunc: func(_ *print.Printer, _ *cobra.Command, _ []string) (*parseInputTestModel, error) { + return &parseInputTestModel{}, nil + }, + expectParseCall: false, + }, + { + name: "flag group validation", + flagSetup: func(cmd *cobra.Command) { + cmd.Flags().String("first", "", "") + cmd.Flags().String("second", "", "") + cmd.MarkFlagsRequiredTogether("first", "second") + }, + flags: map[string]string{"first": "only"}, + wantErr: "must all be set", + parseFunc: func(_ *print.Printer, _ *cobra.Command, _ []string) (*parseInputTestModel, error) { + return &parseInputTestModel{}, nil + }, + expectParseCall: false, + }, + { + name: "parse func error", + flagSetup: func(cmd *cobra.Command) { + cmd.Flags().Bool("ok", false, "") + }, + flags: map[string]string{"ok": "true"}, + wantErr: sentinel, + parseFunc: func(_ *print.Printer, _ *cobra.Command, _ []string) (*parseInputTestModel, error) { + return nil, sentinel + }, + expectParseCall: true, + }, + { + name: "args success", + flagSetup: func(cmd *cobra.Command) { + cmd.Args = cobra.ExactArgs(1) + }, + args: []string{"arg1"}, + cmpOpts: []ParseInputCaseOption{WithParseInputCmpOptions(WithAllowUnexported(parseInputTestModel{}))}, + wantModel: &parseInputTestModel{Args: []string{"arg1"}}, + parseFunc: func(_ *print.Printer, _ *cobra.Command, args []string) (*parseInputTestModel, error) { + return &parseInputTestModel{Args: args}, nil + }, + expectParseCall: true, + }, + { + name: "args validation failure", + flagSetup: func(cmd *cobra.Command) { + cmd.Args = cobra.NoArgs + }, + args: []string{"arg1"}, + wantErr: "unknown command", + parseFunc: func(_ *print.Printer, _ *cobra.Command, _ []string) (*parseInputTestModel, error) { + return &parseInputTestModel{}, nil + }, + expectParseCall: false, + }, + { + name: "repeat flags success", + flagSetup: func(cmd *cobra.Command) { + cmd.Flags().StringSlice("tags", []string{}, "") + }, + repeatFlags: map[string][]string{"tags": {"tag1", "tag2"}}, + cmpOpts: []ParseInputCaseOption{WithParseInputCmpOptions(WithAllowUnexported(parseInputTestModel{}))}, + wantModel: &parseInputTestModel{RepeatValue: []string{"tag1", "tag2"}}, + parseFunc: func(_ *print.Printer, cmd *cobra.Command, _ []string) (*parseInputTestModel, error) { + val, _ := cmd.Flags().GetStringSlice("tags") + return &parseInputTestModel{RepeatValue: val}, nil + }, + expectParseCall: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cmdFactory := newTestCmdFactory(tt.flagSetup) + var parseCalled bool + parseFn := tt.parseFunc + if parseFn == nil { + parseFn = func(*print.Printer, *cobra.Command, []string) (*parseInputTestModel, error) { + return &parseInputTestModel{}, nil + } + } + + RunParseInputCase(t, ParseInputTestCase[*parseInputTestModel]{ + Name: tt.name, + Flags: tt.flags, + RepeatFlags: tt.repeatFlags, + Args: tt.args, + WantModel: tt.wantModel, + WantErr: tt.wantErr, + CmdFactory: cmdFactory, + ParseInputFunc: func(pr *print.Printer, cmd *cobra.Command, args []string) (*parseInputTestModel, error) { + parseCalled = true + return parseFn(pr, cmd, args) + }, + }, tt.cmpOpts...) + + if parseCalled != tt.expectParseCall { + t.Fatalf("parseCalled = %v, expect %v", parseCalled, tt.expectParseCall) + } + }) + } +} From b8fe54983ef862da50af26ca31dcd7027d89408a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kce=20G=C3=B6k=20Klingel?= <161626272+GokceGK@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:02:54 +0100 Subject: [PATCH 312/422] escape html encoding to marshal json output completely (#1226) --- internal/pkg/print/print.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index 4098b9cb5..ea6ed1b6f 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -2,6 +2,7 @@ package print import ( "bufio" + "bytes" "encoding/json" "errors" "fmt" @@ -256,10 +257,15 @@ func (p *Printer) DebugInputModel(model any) { func (p *Printer) OutputResult(outputFormat string, output any, prettyOutputFunc func() error) error { switch outputFormat { case JSONOutputFormat: - details, err := json.MarshalIndent(output, "", " ") + buffer := &bytes.Buffer{} + encoder := json.NewEncoder(buffer) + encoder.SetEscapeHTML(false) + encoder.SetIndent("", " ") + err := encoder.Encode(output) if err != nil { return fmt.Errorf("marshal json: %w", err) } + details := buffer.Bytes() p.Outputln(string(details)) return nil From bde28f216a45178c4eb2eae7769a6d1d575f1b6e Mon Sep 17 00:00:00 2001 From: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:50:15 +0100 Subject: [PATCH 313/422] fix(deps): update module github.com/stackitcloud/stackit-sdk-go/services/secretsmanager to v0.14.0 (#1227) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 819818a8b..b5e4497c4 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 diff --git a/go.sum b/go.sum index 6c2cf3173..b8c231a84 100644 --- a/go.sum +++ b/go.sum @@ -642,8 +642,8 @@ github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXO github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRAVUMsbeoVQhCxb7GpNSmzq15jJuaBUSFo= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3 h1:9DZDISle23rdgWH8YBBujCWnEqUOQ9RAh6/G8wEHb3w= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.13.3/go.mod h1:dMBt/b/LXfXTDLQTCW6PRhBlbl41q7XS+5mAyBezSJk= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 h1:8cFo0UG2r9kWwUAHRBTAG5wEt4G80+wkWdjQW6DhU6Y= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0/go.mod h1:dMBt/b/LXfXTDLQTCW6PRhBlbl41q7XS+5mAyBezSJk= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2nwMi1JxDYW2p8LL4cSB3eoOjlqPHioDWU0= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= From 1931b7403c3bf05c37f4b60f4f99871b9c70d570 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:20:56 +0100 Subject: [PATCH 314/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/edge from 0.2.0 to 0.3.0 (#1228) --- go.mod | 2 +- go.sum | 4 ++-- internal/cmd/beta/edge/instance/create/create.go | 8 ++++---- internal/cmd/beta/edge/instance/create/create_test.go | 10 +++++----- internal/cmd/beta/edge/instance/delete/delete_test.go | 4 ++-- .../cmd/beta/edge/instance/describe/describe_test.go | 4 ++-- internal/cmd/beta/edge/instance/list/list.go | 2 +- internal/cmd/beta/edge/instance/list/list_test.go | 6 +++--- internal/cmd/beta/edge/instance/update/update_test.go | 4 ++-- .../cmd/beta/edge/kubeconfig/create/create_test.go | 4 ++-- internal/cmd/beta/edge/plans/list/list_test.go | 4 ++-- internal/cmd/beta/edge/token/create/create_test.go | 4 ++-- internal/pkg/services/edge/client/client.go | 4 ++-- 13 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index b5e4497c4..e76b34f45 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 - github.com/stackitcloud/stackit-sdk-go/services/edge v0.2.0 + github.com/stackitcloud/stackit-sdk-go/services/edge v0.3.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 diff --git a/go.sum b/go.sum index b8c231a84..6a84b55a3 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.2.0 h1:ElmnEg3V4MisAgqqJFxl3nCmKraxbHtN+vv1DNiWYfM= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.2.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.3.0 h1:JL34T5IjuZjt+XGOBqkutnZnUd41jz9J9Lr8ZgPUiZI= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.3.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= diff --git a/internal/cmd/beta/edge/instance/create/create.go b/internal/cmd/beta/edge/instance/create/create.go index bc264ddb5..72f7ec2d2 100755 --- a/internal/cmd/beta/edge/instance/create/create.go +++ b/internal/cmd/beta/edge/instance/create/create.go @@ -124,7 +124,7 @@ type createRequestSpec struct { // Exported fields allow tests to inspect the request inputs ProjectID string Region string - Payload edge.PostInstancesPayload + Payload edge.CreateInstancePayload // Execute is a closure that wraps the actual SDK call Execute func() (*edge.Instance, error) @@ -191,15 +191,15 @@ func run(ctx context.Context, model *inputModel, apiClient client.APIClient) (*e // buildRequest constructs the spec that can be tested. func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*createRequestSpec, error) { - req := apiClient.PostInstances(ctx, model.ProjectId, model.Region) + req := apiClient.CreateInstance(ctx, model.ProjectId, model.Region) // Build request payload - payload := edge.PostInstancesPayload{ + payload := edge.CreateInstancePayload{ DisplayName: &model.DisplayName, Description: &model.Description, PlanId: &model.PlanId, } - req = req.PostInstancesPayload(payload) + req = req.CreateInstancePayload(payload) return &createRequestSpec{ ProjectID: model.ProjectId, diff --git a/internal/cmd/beta/edge/instance/create/create_test.go b/internal/cmd/beta/edge/instance/create/create_test.go index bbec4b074..b3e873533 100755 --- a/internal/cmd/beta/edge/instance/create/create_test.go +++ b/internal/cmd/beta/edge/instance/create/create_test.go @@ -41,7 +41,7 @@ type mockExecutable struct { resp *edge.Instance } -func (m *mockExecutable) PostInstancesPayload(_ edge.PostInstancesPayload) edge.ApiPostInstancesRequest { +func (m *mockExecutable) CreateInstancePayload(_ edge.CreateInstancePayload) edge.ApiCreateInstanceRequest { // This method is needed to satisfy the interface. It allows chaining in buildRequest. return m } @@ -57,10 +57,10 @@ func (m *mockExecutable) Execute() (*edge.Instance, error) { // mockAPIClient is a mock for the client.APIClient interface type mockAPIClient struct { - postInstancesMock edge.ApiPostInstancesRequest + postInstancesMock edge.ApiCreateInstanceRequest } -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { if m.postInstancesMock != nil { return m.postInstancesMock } @@ -80,7 +80,7 @@ func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiG func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { @@ -291,7 +291,7 @@ func TestBuildRequest(t *testing.T) { want: &createRequestSpec{ ProjectID: testProjectId, Region: testRegion, - Payload: edge.PostInstancesPayload{ + Payload: edge.CreateInstancePayload{ DisplayName: &testName, Description: &testDescription, PlanId: &testPlanId, diff --git a/internal/cmd/beta/edge/instance/delete/delete_test.go b/internal/cmd/beta/edge/instance/delete/delete_test.go index 2772b8c97..c15a3e7d7 100755 --- a/internal/cmd/beta/edge/instance/delete/delete_test.go +++ b/internal/cmd/beta/edge/instance/delete/delete_test.go @@ -74,7 +74,7 @@ func (m *mockAPIClient) DeleteInstanceByName(_ context.Context, _, _, _ string) } // Unused methods to satisfy the client.APIClient interface. -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { @@ -83,7 +83,7 @@ func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiG func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { diff --git a/internal/cmd/beta/edge/instance/describe/describe_test.go b/internal/cmd/beta/edge/instance/describe/describe_test.go index 1f08cd0c6..913a9c221 100755 --- a/internal/cmd/beta/edge/instance/describe/describe_test.go +++ b/internal/cmd/beta/edge/instance/describe/describe_test.go @@ -75,10 +75,10 @@ func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edg } // Unused methods to satisfy the interface -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { diff --git a/internal/cmd/beta/edge/instance/list/list.go b/internal/cmd/beta/edge/instance/list/list.go index ca84cca87..6a589bfdd 100755 --- a/internal/cmd/beta/edge/instance/list/list.go +++ b/internal/cmd/beta/edge/instance/list/list.go @@ -154,7 +154,7 @@ func run(ctx context.Context, model *inputModel, apiClient client.APIClient) ([] // buildRequest constructs the spec that can be tested. func buildRequest(ctx context.Context, model *inputModel, apiClient client.APIClient) (*listRequestSpec, error) { - req := apiClient.GetInstances(ctx, model.ProjectId, model.Region) + req := apiClient.ListInstances(ctx, model.ProjectId, model.Region) return &listRequestSpec{ ProjectID: model.ProjectId, diff --git a/internal/cmd/beta/edge/instance/list/list_test.go b/internal/cmd/beta/edge/instance/list/list_test.go index 2c809d95f..a53214ed6 100755 --- a/internal/cmd/beta/edge/instance/list/list_test.go +++ b/internal/cmd/beta/edge/instance/list/list_test.go @@ -52,10 +52,10 @@ func (m *mockExecutable) Execute() (*edge.InstanceList, error) { // mockAPIClient is a mock for the edge.APIClient interface type mockAPIClient struct { - getInstancesMock edge.ApiGetInstancesRequest + getInstancesMock edge.ApiListInstancesRequest } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { if m.getInstancesMock != nil { return m.getInstancesMock } @@ -63,7 +63,7 @@ func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGet } // Unused methods to satisfy the interface -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { diff --git a/internal/cmd/beta/edge/instance/update/update_test.go b/internal/cmd/beta/edge/instance/update/update_test.go index 434a74337..61e78d50d 100755 --- a/internal/cmd/beta/edge/instance/update/update_test.go +++ b/internal/cmd/beta/edge/instance/update/update_test.go @@ -88,7 +88,7 @@ func (m *mockAPIClient) UpdateInstanceByName(_ context.Context, _, _, _ string) } // Unused methods to satisfy the interface -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { @@ -97,7 +97,7 @@ func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiG func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } func (m *mockAPIClient) DeleteInstance(_ context.Context, _, _, _ string) edge.ApiDeleteInstanceRequest { diff --git a/internal/cmd/beta/edge/kubeconfig/create/create_test.go b/internal/cmd/beta/edge/kubeconfig/create/create_test.go index b1fbe2810..1a353e303 100755 --- a/internal/cmd/beta/edge/kubeconfig/create/create_test.go +++ b/internal/cmd/beta/edge/kubeconfig/create/create_test.go @@ -142,7 +142,7 @@ func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiLi return nil } -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } @@ -162,7 +162,7 @@ func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edg return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } diff --git a/internal/cmd/beta/edge/plans/list/list_test.go b/internal/cmd/beta/edge/plans/list/list_test.go index 6b6f78275..d2fcb595f 100755 --- a/internal/cmd/beta/edge/plans/list/list_test.go +++ b/internal/cmd/beta/edge/plans/list/list_test.go @@ -63,14 +63,14 @@ func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiLi } // Unused methods to satisfy the interface -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } diff --git a/internal/cmd/beta/edge/token/create/create_test.go b/internal/cmd/beta/edge/token/create/create_test.go index 8a78d5e29..c41e62044 100755 --- a/internal/cmd/beta/edge/token/create/create_test.go +++ b/internal/cmd/beta/edge/token/create/create_test.go @@ -99,7 +99,7 @@ func (m *mockAPIClient) ListPlansProject(_ context.Context, _ string) edge.ApiLi return nil } -func (m *mockAPIClient) PostInstances(_ context.Context, _, _ string) edge.ApiPostInstancesRequest { +func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { return nil } func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiGetInstanceRequest { @@ -108,7 +108,7 @@ func (m *mockAPIClient) GetInstance(_ context.Context, _, _, _ string) edge.ApiG func (m *mockAPIClient) GetInstanceByName(_ context.Context, _, _, _ string) edge.ApiGetInstanceByNameRequest { return nil } -func (m *mockAPIClient) GetInstances(_ context.Context, _, _ string) edge.ApiGetInstancesRequest { +func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { return nil } func (m *mockAPIClient) UpdateInstance(_ context.Context, _, _, _ string) edge.ApiUpdateInstanceRequest { diff --git a/internal/pkg/services/edge/client/client.go b/internal/pkg/services/edge/client/client.go index 566e4cc05..1965fcb49 100644 --- a/internal/pkg/services/edge/client/client.go +++ b/internal/pkg/services/edge/client/client.go @@ -15,12 +15,12 @@ import ( // APIClient is an interface that consolidates all client functionality to allow for mocking of the API client during testing. type APIClient interface { - PostInstances(ctx context.Context, projectId, region string) edge.ApiPostInstancesRequest + CreateInstance(ctx context.Context, projectId, region string) edge.ApiCreateInstanceRequest DeleteInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiDeleteInstanceRequest DeleteInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiDeleteInstanceByNameRequest GetInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiGetInstanceRequest GetInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetInstanceByNameRequest - GetInstances(ctx context.Context, projectId, region string) edge.ApiGetInstancesRequest + ListInstances(ctx context.Context, projectId, region string) edge.ApiListInstancesRequest UpdateInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiUpdateInstanceRequest UpdateInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiUpdateInstanceByNameRequest GetKubeconfigByInstanceId(ctx context.Context, projectId, region, instanceId string) edge.ApiGetKubeconfigByInstanceIdRequest From 62cb4c5a41c05e350ffd5d4d47233d70c9872657 Mon Sep 17 00:00:00 2001 From: Robert Ruf <240721653+RobertRuf@users.noreply.github.com> Date: Thu, 15 Jan 2026 11:35:16 +0100 Subject: [PATCH 315/422] Update to stackit-sdk-go/services/edge v0.3.0 (#1231) --- .../beta/edge/instance/create/create_test.go | 12 +++++----- .../cmd/beta/edge/instance/list/list_test.go | 14 +++++------ internal/pkg/services/edge/client/client.go | 24 +++++++++---------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/internal/cmd/beta/edge/instance/create/create_test.go b/internal/cmd/beta/edge/instance/create/create_test.go index b3e873533..e4ce1482d 100755 --- a/internal/cmd/beta/edge/instance/create/create_test.go +++ b/internal/cmd/beta/edge/instance/create/create_test.go @@ -57,12 +57,12 @@ func (m *mockExecutable) Execute() (*edge.Instance, error) { // mockAPIClient is a mock for the client.APIClient interface type mockAPIClient struct { - postInstancesMock edge.ApiCreateInstanceRequest + createInstanceMock edge.ApiCreateInstanceRequest } func (m *mockAPIClient) CreateInstance(_ context.Context, _, _ string) edge.ApiCreateInstanceRequest { - if m.postInstancesMock != nil { - return m.postInstancesMock + if m.createInstanceMock != nil { + return m.createInstanceMock } return &mockExecutable{} } @@ -285,7 +285,7 @@ func TestBuildRequest(t *testing.T) { args: args{ model: fixtureInputModel(), client: &mockAPIClient{ - postInstancesMock: &mockExecutable{}, + createInstanceMock: &mockExecutable{}, }, }, want: &createRequestSpec{ @@ -331,7 +331,7 @@ func TestRun(t *testing.T) { args: args{ model: fixtureInputModel(), client: &mockAPIClient{ - postInstancesMock: &mockExecutable{ + createInstanceMock: &mockExecutable{ resp: &edge.Instance{Id: &testInstanceId}, }, }, @@ -343,7 +343,7 @@ func TestRun(t *testing.T) { args: args{ model: fixtureInputModel(), client: &mockAPIClient{ - postInstancesMock: &mockExecutable{ + createInstanceMock: &mockExecutable{ executeFails: true, }, }, diff --git a/internal/cmd/beta/edge/instance/list/list_test.go b/internal/cmd/beta/edge/instance/list/list_test.go index a53214ed6..3b5adc6dc 100755 --- a/internal/cmd/beta/edge/instance/list/list_test.go +++ b/internal/cmd/beta/edge/instance/list/list_test.go @@ -52,12 +52,12 @@ func (m *mockExecutable) Execute() (*edge.InstanceList, error) { // mockAPIClient is a mock for the edge.APIClient interface type mockAPIClient struct { - getInstancesMock edge.ApiListInstancesRequest + listInstancesMock edge.ApiListInstancesRequest } func (m *mockAPIClient) ListInstances(_ context.Context, _, _ string) edge.ApiListInstancesRequest { - if m.getInstancesMock != nil { - return m.getInstancesMock + if m.listInstancesMock != nil { + return m.listInstancesMock } return &mockExecutable{} } @@ -291,7 +291,7 @@ func TestRun(t *testing.T) { args: args{ model: fixtureInputModel(), client: &mockAPIClient{ - getInstancesMock: &mockExecutable{ + listInstancesMock: &mockExecutable{ executeResp: &edge.InstanceList{Instances: &[]edge.Instance{}}, }, }, @@ -303,7 +303,7 @@ func TestRun(t *testing.T) { args: args{ model: fixtureInputModel(), client: &mockAPIClient{ - getInstancesMock: &mockExecutable{ + listInstancesMock: &mockExecutable{ executeFails: true, }, }, @@ -426,7 +426,7 @@ func TestBuildRequest(t *testing.T) { args: args{ model: fixtureInputModel(), client: &mockAPIClient{ - getInstancesMock: &mockExecutable{}, + listInstancesMock: &mockExecutable{}, }, }, }, @@ -442,7 +442,7 @@ func TestBuildRequest(t *testing.T) { model.Limit = utils.Ptr(int64(10)) }), client: &mockAPIClient{ - getInstancesMock: &mockExecutable{}, + listInstancesMock: &mockExecutable{}, }, }, }, diff --git a/internal/pkg/services/edge/client/client.go b/internal/pkg/services/edge/client/client.go index 1965fcb49..88ec7e2c4 100644 --- a/internal/pkg/services/edge/client/client.go +++ b/internal/pkg/services/edge/client/client.go @@ -15,18 +15,18 @@ import ( // APIClient is an interface that consolidates all client functionality to allow for mocking of the API client during testing. type APIClient interface { - CreateInstance(ctx context.Context, projectId, region string) edge.ApiCreateInstanceRequest - DeleteInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiDeleteInstanceRequest - DeleteInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiDeleteInstanceByNameRequest - GetInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiGetInstanceRequest - GetInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetInstanceByNameRequest - ListInstances(ctx context.Context, projectId, region string) edge.ApiListInstancesRequest - UpdateInstance(ctx context.Context, projectId, region, instanceId string) edge.ApiUpdateInstanceRequest - UpdateInstanceByName(ctx context.Context, projectId, region, instanceName string) edge.ApiUpdateInstanceByNameRequest - GetKubeconfigByInstanceId(ctx context.Context, projectId, region, instanceId string) edge.ApiGetKubeconfigByInstanceIdRequest - GetKubeconfigByInstanceName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetKubeconfigByInstanceNameRequest - GetTokenByInstanceId(ctx context.Context, projectId, region, instanceId string) edge.ApiGetTokenByInstanceIdRequest - GetTokenByInstanceName(ctx context.Context, projectId, region, instanceName string) edge.ApiGetTokenByInstanceNameRequest + CreateInstance(ctx context.Context, projectId, regionId string) edge.ApiCreateInstanceRequest + DeleteInstance(ctx context.Context, projectId, regionId, instanceId string) edge.ApiDeleteInstanceRequest + DeleteInstanceByName(ctx context.Context, projectId, regionId, displayName string) edge.ApiDeleteInstanceByNameRequest + GetInstance(ctx context.Context, projectId, regionId, instanceId string) edge.ApiGetInstanceRequest + GetInstanceByName(ctx context.Context, projectId, regionId, displayName string) edge.ApiGetInstanceByNameRequest + ListInstances(ctx context.Context, projectId, regionId string) edge.ApiListInstancesRequest + UpdateInstance(ctx context.Context, projectId, regionId, instanceId string) edge.ApiUpdateInstanceRequest + UpdateInstanceByName(ctx context.Context, projectId, regionId, displayName string) edge.ApiUpdateInstanceByNameRequest + GetKubeconfigByInstanceId(ctx context.Context, projectId, regionId, instanceId string) edge.ApiGetKubeconfigByInstanceIdRequest + GetKubeconfigByInstanceName(ctx context.Context, projectId, regionId, displayName string) edge.ApiGetKubeconfigByInstanceNameRequest + GetTokenByInstanceId(ctx context.Context, projectId, regionId, instanceId string) edge.ApiGetTokenByInstanceIdRequest + GetTokenByInstanceName(ctx context.Context, projectId, regionId, displayName string) edge.ApiGetTokenByInstanceNameRequest ListPlansProject(ctx context.Context, projectId string) edge.ApiListPlansProjectRequest } From 0c4a1e57ef444f2f3c9b153bd13c0b2c07447df6 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Fri, 16 Jan 2026 09:57:08 +0100 Subject: [PATCH 316/422] Feat/stackittpr 442 depedency cooldowns (#1233) * feat(deps) configure 7 day cooldown for external dependencies * feat(deps) remove renovate config in favor of dependabot * fix(deps) manage internal vs external dependencies via cooldown.exclude --- .github/dependabot.yml | 5 +++++ .github/renovate.json | 15 --------------- .github/workflows/renovate.yaml | 19 ------------------- 3 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 .github/renovate.json delete mode 100644 .github/workflows/renovate.yaml diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5400a08cb..3a4e09fe6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,12 @@ updates: directory: "/" schedule: interval: "daily" + cooldown: + default-days: 7 + exclude: ["github.com/stackitcloud*"] - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" + cooldown: + default-days: 7 diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index 31621a1ba..000000000 --- a/.github/renovate.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended"], - "prHourlyLimit": 10, - "labels": ["renovate"], - "repositories": ["stackitcloud/stackit-cli"], - "enabledManagers": ["gomod", "github-actions"], - "packageRules": [ - { - "matchSourceUrls": ["https://github.com/stackitcloud/stackit-sdk-go"], - "groupName": "STACKIT SDK modules" - } - ], - "postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths"] -} diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml deleted file mode 100644 index c2e439819..000000000 --- a/.github/workflows/renovate.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: Renovate - -on: - schedule: - - cron: "0 0 * * *" - workflow_dispatch: - -jobs: - renovate: - name: Renovate - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Self-hosted Renovate - uses: renovatebot/github-action@v44.2.4 - with: - configurationFile: .github/renovate.json - token: ${{ secrets.RENOVATE_TOKEN }} From e537facbe88ad99e3cf30074757b797dbf6cb8df Mon Sep 17 00:00:00 2001 From: Maximilian Geberl <48486938+dergeberl@users.noreply.github.com> Date: Fri, 16 Jan 2026 10:15:35 +0100 Subject: [PATCH 317/422] feat(config): add ignore-existing for profile create (#1094) * feat(config): add ignore-existing for profile create * Fix typo and set profile if needed in case setProfile is true * make generate-docs * Fix typo * Add docs to ignore-existing flag --------- Co-authored-by: cgoetz-inovex --- docs/stackit_config_profile_create.md | 8 +++++--- internal/cmd/config/profile/create/create.go | 13 +++++++++---- internal/pkg/config/profiles.go | 13 +++++++++++-- internal/pkg/config/profiles_test.go | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/docs/stackit_config_profile_create.md b/docs/stackit_config_profile_create.md index 595c96fad..abc5004ad 100644 --- a/docs/stackit_config_profile_create.md +++ b/docs/stackit_config_profile_create.md @@ -9,6 +9,7 @@ The profile name can be provided via the STACKIT_CLI_PROFILE environment variabl The environment variable takes precedence over the argument. If you do not want to set the profile as active, use the --no-set flag. If you want to create the new profile with the initial default configurations, use the --empty flag. +If you want to create the new profile and ignore the error for an already existing profile, use the --ignore-existing flag. ``` stackit config profile create PROFILE [flags] @@ -27,9 +28,10 @@ stackit config profile create PROFILE [flags] ### Options ``` - --empty Create the profile with the initial default configurations - -h, --help Help for "stackit config profile create" - --no-set Do not set the profile as the active profile + --empty Create the profile with the initial default configurations + -h, --help Help for "stackit config profile create" + --ignore-existing Suppress the error if the profile exists already. An existing profile will not be modified or overwritten + --no-set Do not set the profile as the active profile ``` ### Options inherited from parent commands diff --git a/internal/cmd/config/profile/create/create.go b/internal/cmd/config/profile/create/create.go index bc7a1790f..e87ed5838 100644 --- a/internal/cmd/config/profile/create/create.go +++ b/internal/cmd/config/profile/create/create.go @@ -19,13 +19,15 @@ import ( const ( profileArg = "PROFILE" - noSetFlag = "no-set" - fromEmptyProfile = "empty" + noSetFlag = "no-set" + ignoreExistingFlag = "ignore-existing" + fromEmptyProfile = "empty" ) type inputModel struct { *globalflags.GlobalFlagModel NoSet bool + IgnoreExisting bool FromEmptyProfile bool Profile string } @@ -34,12 +36,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("create %s", profileArg), Short: "Creates a CLI configuration profile", - Long: fmt.Sprintf("%s\n%s\n%s\n%s\n%s", + Long: fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s", "Creates a CLI configuration profile based on the currently active profile and sets it as active.", `The profile name can be provided via the STACKIT_CLI_PROFILE environment variable or as an argument in this command.`, "The environment variable takes precedence over the argument.", "If you do not want to set the profile as active, use the --no-set flag.", "If you want to create the new profile with the initial default configurations, use the --empty flag.", + "If you want to create the new profile and ignore the error for an already existing profile, use the --ignore-existing flag.", ), Args: args.SingleArg(profileArg, nil), Example: examples.Build( @@ -56,7 +59,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - err = config.CreateProfile(params.Printer, model.Profile, !model.NoSet, model.FromEmptyProfile) + err = config.CreateProfile(params.Printer, model.Profile, !model.NoSet, model.IgnoreExisting, model.FromEmptyProfile) if err != nil { return fmt.Errorf("create profile: %w", err) } @@ -85,6 +88,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(noSetFlag, false, "Do not set the profile as the active profile") + cmd.Flags().Bool(ignoreExistingFlag, false, "Suppress the error if the profile exists already. An existing profile will not be modified or overwritten") cmd.Flags().Bool(fromEmptyProfile, false, "Create the profile with the initial default configurations") } @@ -103,6 +107,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Profile: profile, FromEmptyProfile: flags.FlagToBoolValue(p, cmd, fromEmptyProfile), NoSet: flags.FlagToBoolValue(p, cmd, noSetFlag), + IgnoreExisting: flags.FlagToBoolValue(p, cmd, ignoreExistingFlag), } p.DebugInputModel(model) diff --git a/internal/pkg/config/profiles.go b/internal/pkg/config/profiles.go index db47ce5d3..17d2fd352 100644 --- a/internal/pkg/config/profiles.go +++ b/internal/pkg/config/profiles.go @@ -79,8 +79,8 @@ func GetProfileFromEnv() (string, bool) { // CreateProfile creates a new profile. // If emptyProfile is true, it creates an empty profile. Otherwise, copies the config from the current profile to the new profile. // If setProfile is true, it sets the new profile as the active profile. -// If the profile already exists, it returns an error. -func CreateProfile(p *print.Printer, profile string, setProfile, emptyProfile bool) error { +// If the profile already exists and ignoreExisting is false, it returns an error. +func CreateProfile(p *print.Printer, profile string, setProfile, ignoreExisting, emptyProfile bool) error { err := ValidateProfile(profile) if err != nil { return fmt.Errorf("validate profile: %w", err) @@ -98,6 +98,15 @@ func CreateProfile(p *print.Printer, profile string, setProfile, emptyProfile bo // Error if the profile already exists _, err = os.Stat(configFolderPath) if err == nil { + if ignoreExisting { + if setProfile { + err = SetProfile(p, profile) + if err != nil { + return fmt.Errorf("set profile: %w", err) + } + } + return nil + } return fmt.Errorf("profile %q already exists", profile) } diff --git a/internal/pkg/config/profiles_test.go b/internal/pkg/config/profiles_test.go index 327c9dcf8..0039dc024 100644 --- a/internal/pkg/config/profiles_test.go +++ b/internal/pkg/config/profiles_test.go @@ -210,7 +210,7 @@ func TestExportProfile(t *testing.T) { // Create prerequisite profile p := print.NewPrinter() profileName := "export-profile-test" - err = CreateProfile(p, profileName, true, false) + err = CreateProfile(p, profileName, true, false, false) if err != nil { t.Fatalf("could not create prerequisite profile, %v", err) } From 75adbf98c5d557ccb92c8a0f8c6bf01adaf72eb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:42:10 +0100 Subject: [PATCH 318/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1236) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e76b34f45..dfcbf6ead 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.32.0 diff --git a/go.sum b/go.sum index 6a84b55a3..175b01d6d 100644 --- a/go.sum +++ b/go.sum @@ -654,8 +654,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aS github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 h1:DRp1p0Gb1YZSnFXgkiKTHQD9bFfqn6OC3PcsDjqGJiw= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0/go.mod h1:XHOtGgBwwCqPSoQt2ojIRb/BeOd4kICwb9RuMXXFGt8= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1 h1:HVlBylGwXVR3qDUGwUMqofAcLEawRaWSgeYXbyAcN1E= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.5.1/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0 h1:Dab1jzN0u9c67lvELoWf1RuagjO3eUBRytoX8SYL8Zs= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 h1:KgIRTw4gpxx8qoiaLGLbXPVDcBgCxPl60gigw+tizYc= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= From 19ac1033b8603ea95d755add1aa6295bb6f2aef6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:48:00 +0000 Subject: [PATCH 319/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/edge (#1235) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index dfcbf6ead..a71f78960 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 - github.com/stackitcloud/stackit-sdk-go/services/edge v0.3.0 + github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 diff --git a/go.sum b/go.sum index 175b01d6d..0dd6ccd27 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.3.0 h1:JL34T5IjuZjt+XGOBqkutnZnUd41jz9J9Lr8ZgPUiZI= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.3.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 h1:+96JOe4oS9BhdH4kHfc5jcl9DVIZiHrMN0/PXn8uWoI= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= From 0414285b63df1c7ba68139221d9f209332e58d7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 16:51:07 +0100 Subject: [PATCH 320/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#1238) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a71f78960..d550b62bf 100644 --- a/go.mod +++ b/go.mod @@ -264,7 +264,7 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 diff --git a/go.sum b/go.sum index 0dd6ccd27..6c60e8bc5 100644 --- a/go.sum +++ b/go.sum @@ -618,8 +618,8 @@ github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1R+fL5aX5nEoxL6ODVJl3emzho= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2 h1:DwwRMzvnKWTbfmLvq2xe+mYhv5fA1AwWdQGznI05sGc= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.6.2/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 h1:ZyaB4jL71p+FWI/cXgP+p6t4iw1oAeGbLLOz4cs3dmI= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= From edf7b5ca558bf85a6d4230ae9165cb188c75835d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jan 2026 15:58:05 +0000 Subject: [PATCH 321/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1237) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d550b62bf..b66c645a9 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.20.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 diff --git a/go.sum b/go.sum index 6c60e8bc5..257b45b63 100644 --- a/go.sum +++ b/go.sum @@ -602,8 +602,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0 h1:RJBgbgZ4w7/e++n7pPTiCwFivll9RHovb4BfR/9CzlA= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.8.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 h1:P24WoKPt14dfUiUJ4czIv+IiVmdCFQGrKgVtw23fxNg= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= From 4074118fb7b5992c52c7f7af9ca5321e097d893e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Tue, 20 Jan 2026 14:40:18 +0100 Subject: [PATCH 322/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverbackup from v1.3.4 to v1.3.5 (#1239) relates to STACKITCLI-304 and #1202 --- go.mod | 2 +- go.sum | 4 ++-- internal/pkg/services/serverbackup/utils/utils_test.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index b66c645a9..8be4407af 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 diff --git a/go.sum b/go.sum index 257b45b63..7bc67cf83 100644 --- a/go.sum +++ b/go.sum @@ -644,8 +644,8 @@ github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRA github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 h1:8cFo0UG2r9kWwUAHRBTAG5wEt4G80+wkWdjQW6DhU6Y= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0/go.mod h1:dMBt/b/LXfXTDLQTCW6PRhBlbl41q7XS+5mAyBezSJk= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4 h1:lOlg8zYL2nwMi1JxDYW2p8LL4cSB3eoOjlqPHioDWU0= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.4/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 h1:pAoqz4K17ZWcLusu7Dxkx3HGQAIYCk7SmZeAu9HHUrQ= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 h1:XV3pPXpdvQjR5Z90FFutU4iqCHfejDYQAL840Y4ztLM= diff --git a/internal/pkg/services/serverbackup/utils/utils_test.go b/internal/pkg/services/serverbackup/utils/utils_test.go index 73b915b3a..7262fdd6e 100644 --- a/internal/pkg/services/serverbackup/utils/utils_test.go +++ b/internal/pkg/services/serverbackup/utils/utils_test.go @@ -88,7 +88,7 @@ func TestCanDisableBackupService(t *testing.T) { LastRestoredAt: utils.Ptr("test timestamp"), Name: utils.Ptr("test name"), Size: utils.Ptr(int64(5)), - Status: serverbackup.BACKUPSTATUS_BACKING_UP.Ptr(), + Status: serverbackup.BACKUPSTATUS_IN_PROGRESS.Ptr(), VolumeBackups: nil, }, }, From 9069021b2d72e05e552925435d3d2b9561c72360 Mon Sep 17 00:00:00 2001 From: Michael Eischer <9106997+MichaelEischer@users.noreply.github.com> Date: Thu, 22 Jan 2026 14:47:04 +0100 Subject: [PATCH 323/422] feat: encrypt cache used by `ske kubeconfig login` (#1244) encrypt the caching of kubeconfig login --- internal/pkg/auth/storage.go | 24 +++--- internal/pkg/cache/cache.go | 120 ++++++++++++++++++++++++-- internal/pkg/cache/cache_test.go | 140 ++++++++++++++++++++++++------- 3 files changed, 238 insertions(+), 46 deletions(-) diff --git a/internal/pkg/auth/storage.go b/internal/pkg/auth/storage.go index 5e857f6a7..686a0f677 100644 --- a/internal/pkg/auth/storage.go +++ b/internal/pkg/auth/storage.go @@ -27,16 +27,18 @@ const ( ) const ( - SESSION_EXPIRES_AT_UNIX authFieldKey = "session_expires_at_unix" - ACCESS_TOKEN authFieldKey = "access_token" - REFRESH_TOKEN authFieldKey = "refresh_token" - SERVICE_ACCOUNT_TOKEN authFieldKey = "service_account_token" - SERVICE_ACCOUNT_EMAIL authFieldKey = "service_account_email" - USER_EMAIL authFieldKey = "user_email" - SERVICE_ACCOUNT_KEY authFieldKey = "service_account_key" - PRIVATE_KEY authFieldKey = "private_key" - TOKEN_CUSTOM_ENDPOINT authFieldKey = "token_custom_endpoint" - IDP_TOKEN_ENDPOINT authFieldKey = "idp_token_endpoint" //nolint:gosec // linter false positive + SESSION_EXPIRES_AT_UNIX authFieldKey = "session_expires_at_unix" + ACCESS_TOKEN authFieldKey = "access_token" + REFRESH_TOKEN authFieldKey = "refresh_token" + SERVICE_ACCOUNT_TOKEN authFieldKey = "service_account_token" + SERVICE_ACCOUNT_EMAIL authFieldKey = "service_account_email" + USER_EMAIL authFieldKey = "user_email" + SERVICE_ACCOUNT_KEY authFieldKey = "service_account_key" + PRIVATE_KEY authFieldKey = "private_key" + TOKEN_CUSTOM_ENDPOINT authFieldKey = "token_custom_endpoint" + IDP_TOKEN_ENDPOINT authFieldKey = "idp_token_endpoint" //nolint:gosec // linter false positive + CACHE_ENCRYPTION_KEY authFieldKey = "cache_encryption_key" + CACHE_ENCRYPTION_KEY_AGE authFieldKey = "cache_encryption_key_age" ) const ( @@ -59,6 +61,8 @@ var authFieldKeys = []authFieldKey{ TOKEN_CUSTOM_ENDPOINT, IDP_TOKEN_ENDPOINT, authFlowType, + CACHE_ENCRYPTION_KEY, + CACHE_ENCRYPTION_KEY_AGE, } // All fields that are set when a user logs in diff --git a/internal/pkg/cache/cache.go b/internal/pkg/cache/cache.go index cf019ecb2..beaf87d12 100644 --- a/internal/pkg/cache/cache.go +++ b/internal/pkg/cache/cache.go @@ -1,26 +1,87 @@ package cache import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" "errors" "fmt" "os" "path/filepath" "regexp" + "strconv" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" ) var ( - cacheFolderPath string + cacheDirOverwrite string // for testing only + cacheFolderPath string + cacheEncryptionKey []byte identifierRegex = regexp.MustCompile("^[a-zA-Z0-9-]+$") ErrorInvalidCacheIdentifier = fmt.Errorf("invalid cache identifier") ) +const ( + cacheKeyMaxAge = 90 * 24 * time.Hour +) + func Init() error { - cacheDir, err := os.UserCacheDir() - if err != nil { - return fmt.Errorf("get user cache dir: %w", err) + var cacheDir string + if cacheDirOverwrite == "" { + var err error + cacheDir, err = os.UserCacheDir() + if err != nil { + return fmt.Errorf("get user cache dir: %w", err) + } + } else { + cacheDir = cacheDirOverwrite } + cacheFolderPath = filepath.Join(cacheDir, "stackit") + + // Encryption keys should only be used a limited number of times for aes-gcm. + // Thus, refresh the key periodically. This will invalidate all cached entries. + key, _ := auth.GetAuthField(auth.CACHE_ENCRYPTION_KEY) + age, _ := auth.GetAuthField(auth.CACHE_ENCRYPTION_KEY_AGE) + cacheEncryptionKey = nil + var keyAge time.Time + if age != "" { + ageSeconds, err := strconv.ParseInt(age, 10, 64) + if err == nil { + keyAge = time.Unix(ageSeconds, 0) + } + } + if key != "" && keyAge.Add(cacheKeyMaxAge).After(time.Now()) { + cacheEncryptionKey, _ = base64.StdEncoding.DecodeString(key) + // invalid key length + if len(cacheEncryptionKey) != 32 { + cacheEncryptionKey = nil + } + } + if len(cacheEncryptionKey) == 0 { + cacheEncryptionKey = make([]byte, 32) + _, err := rand.Read(cacheEncryptionKey) + if err != nil { + return fmt.Errorf("cache encryption key: %w", err) + } + key := base64.StdEncoding.EncodeToString(cacheEncryptionKey) + err = auth.SetAuthField(auth.CACHE_ENCRYPTION_KEY, key) + if err != nil { + return fmt.Errorf("save cache encryption key: %w", err) + } + err = auth.SetAuthField(auth.CACHE_ENCRYPTION_KEY_AGE, fmt.Sprint(time.Now().Unix())) + if err != nil { + return fmt.Errorf("save cache encryption key age: %w", err) + } + // cleanup old cache entries as they won't be readable anymore + if err := cleanupCache(); err != nil { + return err + } + } return nil } @@ -32,7 +93,21 @@ func GetObject(identifier string) ([]byte, error) { return nil, ErrorInvalidCacheIdentifier } - return os.ReadFile(filepath.Join(cacheFolderPath, identifier)) + data, err := os.ReadFile(filepath.Join(cacheFolderPath, identifier)) + if err != nil { + return nil, err + } + + block, err := aes.NewCipher(cacheEncryptionKey) + if err != nil { + return nil, err + } + aead, err := cipher.NewGCMWithRandomNonce(block) + if err != nil { + return nil, err + } + + return aead.Open(nil, nil, data, nil) } func PutObject(identifier string, data []byte) error { @@ -48,7 +123,17 @@ func PutObject(identifier string, data []byte) error { return err } - return os.WriteFile(filepath.Join(cacheFolderPath, identifier), data, 0o600) + block, err := aes.NewCipher(cacheEncryptionKey) + if err != nil { + return err + } + aead, err := cipher.NewGCMWithRandomNonce(block) + if err != nil { + return err + } + encrypted := aead.Seal(nil, nil, data, nil) + + return os.WriteFile(filepath.Join(cacheFolderPath, identifier), encrypted, 0o600) } func DeleteObject(identifier string) error { @@ -71,3 +156,26 @@ func validateCacheFolderPath() error { } return nil } + +func cleanupCache() error { + if err := validateCacheFolderPath(); err != nil { + return err + } + + entries, err := os.ReadDir(cacheFolderPath) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil + } + return err + } + + for _, entry := range entries { + name := entry.Name() + err := DeleteObject(name) + if err != nil && !errors.Is(err, ErrorInvalidCacheIdentifier) { + return err + } + } + return nil +} diff --git a/internal/pkg/cache/cache_test.go b/internal/pkg/cache/cache_test.go index cc68c6590..4ef45891b 100644 --- a/internal/pkg/cache/cache_test.go +++ b/internal/pkg/cache/cache_test.go @@ -6,10 +6,20 @@ import ( "path/filepath" "testing" + "github.com/google/go-cmp/cmp" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" ) -func TestGetObject(t *testing.T) { +func overwriteCacheDir(t *testing.T) func() { + cacheDirOverwrite = t.TempDir() + return func() { + cacheDirOverwrite = "" + } +} + +func TestGetObjectErrors(t *testing.T) { + defer overwriteCacheDir(t)() if err := Init(); err != nil { t.Fatalf("cache init failed: %s", err) } @@ -17,25 +27,16 @@ func TestGetObject(t *testing.T) { tests := []struct { description string identifier string - expectFile bool expectedErr error }{ - { - description: "identifier exists", - identifier: "test-cache-get-exists", - expectFile: true, - expectedErr: nil, - }, { description: "identifier does not exist", identifier: "test-cache-get-not-exists", - expectFile: false, expectedErr: os.ErrNotExist, }, { description: "identifier is invalid", identifier: "in../../valid", - expectFile: false, expectedErr: ErrorInvalidCacheIdentifier, }, } @@ -44,17 +45,6 @@ func TestGetObject(t *testing.T) { t.Run(tt.description, func(t *testing.T) { id := tt.identifier + "-" + uuid.NewString() - // setup - if tt.expectFile { - err := os.MkdirAll(cacheFolderPath, 0o750) - if err != nil { - t.Fatalf("create cache folder: %s", err.Error()) - } - path := filepath.Join(cacheFolderPath, id) - if err := os.WriteFile(path, []byte("dummy"), 0o600); err != nil { - t.Fatalf("setup: WriteFile (%s) failed", path) - } - } // test file, err := GetObject(id) @@ -62,19 +52,14 @@ func TestGetObject(t *testing.T) { t.Fatalf("returned error (%q) does not match %q", err.Error(), tt.expectedErr.Error()) } - if tt.expectFile { - if len(file) < 1 { - t.Fatalf("expected a file but byte array is empty (len %d)", len(file)) - } - } else { - if len(file) > 0 { - t.Fatalf("didn't expect a file, but byte array is not empty (len %d)", len(file)) - } + if len(file) > 0 { + t.Fatalf("didn't expect a file, but byte array is not empty (len %d)", len(file)) } }) } } func TestPutObject(t *testing.T) { + defer overwriteCacheDir(t)() if err := Init(); err != nil { t.Fatalf("cache init failed: %s", err) } @@ -128,6 +113,10 @@ func TestPutObject(t *testing.T) { // setup if tt.existingFile { + err := os.MkdirAll(cacheFolderPath, 0o750) + if err != nil { + t.Fatalf("create cache folder: %s", err.Error()) + } if err := os.WriteFile(path, []byte("dummy"), 0o600); err != nil { t.Fatalf("setup: WriteFile (%s) failed", path) } @@ -149,6 +138,7 @@ func TestPutObject(t *testing.T) { } func TestDeleteObject(t *testing.T) { + defer overwriteCacheDir(t)() if err := Init(); err != nil { t.Fatalf("cache init failed: %s", err) } @@ -186,8 +176,11 @@ func TestDeleteObject(t *testing.T) { // setup if tt.existingFile { + if err := os.MkdirAll(cacheFolderPath, 0o700); err != nil { + t.Fatalf("setup: MkdirAll (%s) failed: %v", path, err) + } if err := os.WriteFile(path, []byte("dummy"), 0o600); err != nil { - t.Fatalf("setup: WriteFile (%s) failed", path) + t.Fatalf("setup: WriteFile (%s) failed: %v", path, err) } } // test @@ -205,3 +198,90 @@ func TestDeleteObject(t *testing.T) { }) } } + +func clearKeys(t *testing.T) { + t.Helper() + err := auth.DeleteAuthField(auth.CACHE_ENCRYPTION_KEY) + if err != nil { + t.Fatalf("delete cache encryption key: %v", err) + } + err = auth.DeleteAuthField(auth.CACHE_ENCRYPTION_KEY_AGE) + if err != nil { + t.Fatalf("delete cache encryption key age: %v", err) + } +} + +func TestWriteAndRead(t *testing.T) { + for _, tt := range []struct { + name string + clearKeys bool + }{ + { + name: "normal", + }, + { + name: "fresh keys", + clearKeys: true, + }, + } { + t.Run(tt.name, func(t *testing.T) { + defer overwriteCacheDir(t)() + if tt.clearKeys { + clearKeys(t) + } + if err := Init(); err != nil { + t.Fatalf("cache init failed: %s", err) + } + + id := "test-cycle-" + uuid.NewString() + data := []byte("test-data") + err := PutObject(id, data) + if err != nil { + t.Fatalf("putobject failed: %v", err) + } + + readData, err := GetObject(id) + if err != nil { + t.Fatalf("getobject failed: %v", err) + } + + diff := cmp.Diff(data, readData) + if diff != "" { + t.Fatalf("unexpected data diff: %v", diff) + } + }) + } +} + +func TestCacheCleanup(t *testing.T) { + defer overwriteCacheDir(t)() + if err := Init(); err != nil { + t.Fatalf("cache init failed: %s", err) + } + + id := "test-cycle-" + uuid.NewString() + data := []byte("test-data") + err := PutObject(id, data) + if err != nil { + t.Fatalf("putobject failed: %v", err) + } + + clearKeys(t) + + // initialize again to trigger cache cleanup + if err := Init(); err != nil { + t.Fatalf("cache init failed: %s", err) + } + + _, err = GetObject(id) + if !errors.Is(err, os.ErrNotExist) { + t.Fatalf("getobject failed with unexpected error: %v", err) + } +} + +func TestInit(t *testing.T) { + // test that init without cache directory overwrite works + if err := Init(); err != nil { + t.Fatalf("cache init failed: %s", err) + } +} From c74c23cba2d1db7a605f5eea2f85be1bba074ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kce=20G=C3=B6k=20Klingel?= <161626272+GokceGK@users.noreply.github.com> Date: Mon, 26 Jan 2026 16:38:30 +0100 Subject: [PATCH 324/422] Onboard Logs service -instance commands (#1184) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * onboard logs service -instance * Update internal/cmd/beta/logs/instance/delete/delete.go Co-authored-by: Ruben Hönle * Update internal/cmd/beta/logs/instance/list/list_test.go Co-authored-by: Ruben Hönle * Update internal/cmd/beta/logs/instance/list/list.go Co-authored-by: Ruben Hönle * remove obsolete check // add missing unit test * fix linter issues * fix possible nil pointer issue // extend unit tests * update logs service version // remove workaround --------- Co-authored-by: Ruben Hönle --- docs/stackit_beta.md | 1 + docs/stackit_beta_logs.md | 34 ++ docs/stackit_beta_logs_instance.md | 38 +++ docs/stackit_beta_logs_instance_create.md | 50 +++ docs/stackit_beta_logs_instance_delete.md | 40 +++ docs/stackit_beta_logs_instance_describe.md | 43 +++ docs/stackit_beta_logs_instance_list.md | 44 +++ docs/stackit_beta_logs_instance_update.md | 50 +++ docs/stackit_config_set.md | 1 + docs/stackit_config_unset.md | 1 + go.mod | 1 + go.sum | 4 + internal/cmd/beta/beta.go | 2 + .../cmd/beta/logs/instance/create/create.go | 176 ++++++++++ .../beta/logs/instance/create/create_test.go | 256 +++++++++++++++ .../cmd/beta/logs/instance/delete/delete.go | 129 ++++++++ .../beta/logs/instance/delete/delete_test.go | 174 ++++++++++ .../beta/logs/instance/describe/describe.go | 118 +++++++ .../logs/instance/describe/describe_test.go | 191 +++++++++++ internal/cmd/beta/logs/instance/instance.go | 34 ++ internal/cmd/beta/logs/instance/list/list.go | 147 +++++++++ .../cmd/beta/logs/instance/list/list_test.go | 195 +++++++++++ .../cmd/beta/logs/instance/update/update.go | 165 ++++++++++ .../beta/logs/instance/update/update_test.go | 306 ++++++++++++++++++ internal/cmd/beta/logs/logs.go | 26 ++ internal/cmd/config/set/set.go | 4 + internal/cmd/config/unset/unset.go | 7 + internal/cmd/config/unset/unset_test.go | 13 + internal/pkg/config/config.go | 3 + internal/pkg/services/logs/client/client.go | 14 + internal/pkg/services/logs/utils/utils.go | 30 ++ .../pkg/services/logs/utils/utils_test.go | 96 ++++++ 32 files changed, 2393 insertions(+) create mode 100644 docs/stackit_beta_logs.md create mode 100644 docs/stackit_beta_logs_instance.md create mode 100644 docs/stackit_beta_logs_instance_create.md create mode 100644 docs/stackit_beta_logs_instance_delete.md create mode 100644 docs/stackit_beta_logs_instance_describe.md create mode 100644 docs/stackit_beta_logs_instance_list.md create mode 100644 docs/stackit_beta_logs_instance_update.md create mode 100644 internal/cmd/beta/logs/instance/create/create.go create mode 100644 internal/cmd/beta/logs/instance/create/create_test.go create mode 100644 internal/cmd/beta/logs/instance/delete/delete.go create mode 100644 internal/cmd/beta/logs/instance/delete/delete_test.go create mode 100644 internal/cmd/beta/logs/instance/describe/describe.go create mode 100644 internal/cmd/beta/logs/instance/describe/describe_test.go create mode 100644 internal/cmd/beta/logs/instance/instance.go create mode 100644 internal/cmd/beta/logs/instance/list/list.go create mode 100644 internal/cmd/beta/logs/instance/list/list_test.go create mode 100644 internal/cmd/beta/logs/instance/update/update.go create mode 100644 internal/cmd/beta/logs/instance/update/update_test.go create mode 100644 internal/cmd/beta/logs/logs.go create mode 100644 internal/pkg/services/logs/client/client.go create mode 100644 internal/pkg/services/logs/utils/utils.go create mode 100644 internal/pkg/services/logs/utils/utils_test.go diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index a0c177662..78b58b1f7 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -45,6 +45,7 @@ stackit beta [flags] * [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. * [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS +* [stackit beta logs](./stackit_beta_logs.md) - Provides functionality for Logs * [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) * [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex diff --git a/docs/stackit_beta_logs.md b/docs/stackit_beta_logs.md new file mode 100644 index 000000000..91998e3c1 --- /dev/null +++ b/docs/stackit_beta_logs.md @@ -0,0 +1,34 @@ +## stackit beta logs + +Provides functionality for Logs + +### Synopsis + +Provides functionality for Logs. + +``` +stackit beta logs [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta logs" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances + diff --git a/docs/stackit_beta_logs_instance.md b/docs/stackit_beta_logs_instance.md new file mode 100644 index 000000000..85831068e --- /dev/null +++ b/docs/stackit_beta_logs_instance.md @@ -0,0 +1,38 @@ +## stackit beta logs instance + +Provides functionality for Logs instances + +### Synopsis + +Provides functionality for Logs instances. + +``` +stackit beta logs instance [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta logs instance" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta logs](./stackit_beta_logs.md) - Provides functionality for Logs +* [stackit beta logs instance create](./stackit_beta_logs_instance_create.md) - Creates a Logs instance +* [stackit beta logs instance delete](./stackit_beta_logs_instance_delete.md) - Deletes the given Logs instance +* [stackit beta logs instance describe](./stackit_beta_logs_instance_describe.md) - Shows details of a Logs instance +* [stackit beta logs instance list](./stackit_beta_logs_instance_list.md) - Lists Logs instances +* [stackit beta logs instance update](./stackit_beta_logs_instance_update.md) - Updates a Logs instance + diff --git a/docs/stackit_beta_logs_instance_create.md b/docs/stackit_beta_logs_instance_create.md new file mode 100644 index 000000000..3d00e6cea --- /dev/null +++ b/docs/stackit_beta_logs_instance_create.md @@ -0,0 +1,50 @@ +## stackit beta logs instance create + +Creates a Logs instance + +### Synopsis + +Creates a Logs instance. + +``` +stackit beta logs instance create [flags] +``` + +### Examples + +``` + Create a Logs instance with name "my-instance" and retention time 10 days + $ stackit beta logs instance create --display-name "my-instance" --retention-days 10 + + Create a Logs instance with name "my-instance", retention time 10 days, and a description + $ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --description "Description of the instance" + + Create a Logs instance with name "my-instance", retention time 10 days, and restrict access to a specific range of IP addresses. + $ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --acl 1.2.3.0/24 +``` + +### Options + +``` + --acl strings Access control list + --description string Description + --display-name string Display name + -h, --help Help for "stackit beta logs instance create" + --retention-days int The days for how long the logs should be stored before being cleaned up +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances + diff --git a/docs/stackit_beta_logs_instance_delete.md b/docs/stackit_beta_logs_instance_delete.md new file mode 100644 index 000000000..a64cedb3e --- /dev/null +++ b/docs/stackit_beta_logs_instance_delete.md @@ -0,0 +1,40 @@ +## stackit beta logs instance delete + +Deletes the given Logs instance + +### Synopsis + +Deletes the given Logs instance. + +``` +stackit beta logs instance delete INSTANCE_ID [flags] +``` + +### Examples + +``` + Delete a Logs instance with ID "xxx" + $ stackit beta logs instance delete "xxx" +``` + +### Options + +``` + -h, --help Help for "stackit beta logs instance delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances + diff --git a/docs/stackit_beta_logs_instance_describe.md b/docs/stackit_beta_logs_instance_describe.md new file mode 100644 index 000000000..18218a879 --- /dev/null +++ b/docs/stackit_beta_logs_instance_describe.md @@ -0,0 +1,43 @@ +## stackit beta logs instance describe + +Shows details of a Logs instance + +### Synopsis + +Shows details of a Logs instance + +``` +stackit beta logs instance describe INSTANCE_ID [flags] +``` + +### Examples + +``` + Get details of a Logs instance with ID "xxx" + $ stackit beta logs instance describe xxx + + Get details of a Logs instance with ID "xxx" in JSON format + $ stackit beta logs instance describe xxx --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta logs instance describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances + diff --git a/docs/stackit_beta_logs_instance_list.md b/docs/stackit_beta_logs_instance_list.md new file mode 100644 index 000000000..6e53961ee --- /dev/null +++ b/docs/stackit_beta_logs_instance_list.md @@ -0,0 +1,44 @@ +## stackit beta logs instance list + +Lists Logs instances + +### Synopsis + +Lists Logs instances within the project. + +``` +stackit beta logs instance list [flags] +``` + +### Examples + +``` + List all Logs instances + $ stackit beta logs instance list + + List the first 10 Logs instances + $ stackit beta logs instance list --limit=10 +``` + +### Options + +``` + -h, --help Help for "stackit beta logs instance list" + --limit int Limit the output to the first n elements +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances + diff --git a/docs/stackit_beta_logs_instance_update.md b/docs/stackit_beta_logs_instance_update.md new file mode 100644 index 000000000..da546c4cf --- /dev/null +++ b/docs/stackit_beta_logs_instance_update.md @@ -0,0 +1,50 @@ +## stackit beta logs instance update + +Updates a Logs instance + +### Synopsis + +Updates a Logs instance. + +``` +stackit beta logs instance update INSTANCE_ID [flags] +``` + +### Examples + +``` + Update the display name of the Logs instance with ID "xxx" + $ stackit beta logs instance update xxx --display-name new-name + + Update the retention time of the Logs instance with ID "xxx" + $ stackit beta logs instance update xxx --retention-days 40 + + Update the ACL of the Logs instance with ID "xxx" + $ stackit beta logs instance update xxx --acl 1.2.3.0/24 +``` + +### Options + +``` + --acl strings Access control list + --description string Description + --display-name string Display name + -h, --help Help for "stackit beta logs instance update" + --retention-days int The days for how long the logs should be stored before being cleaned up +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances + diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index 211bc1113..8613d2a1d 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -41,6 +41,7 @@ stackit config set [flags] --kms-custom-endpoint string KMS API base URL, used in calls to this API --load-balancer-custom-endpoint string Load Balancer API base URL, used in calls to this API --logme-custom-endpoint string LogMe API base URL, used in calls to this API + --logs-custom-endpoint string Logs API base URL, used in calls to this API --mariadb-custom-endpoint string MariaDB API base URL, used in calls to this API --mongodbflex-custom-endpoint string MongoDB Flex API base URL, used in calls to this API --object-storage-custom-endpoint string Object Storage API base URL, used in calls to this API diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 07b161c8c..89c6116e0 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -39,6 +39,7 @@ stackit config unset [flags] --kms-custom-endpoint KMS API base URL. If unset, uses the default base URL --load-balancer-custom-endpoint Load Balancer API base URL. If unset, uses the default base URL --logme-custom-endpoint LogMe API base URL. If unset, uses the default base URL + --logs-custom-endpoint Logs API base URL. If unset, uses the default base URL --mariadb-custom-endpoint MariaDB API base URL. If unset, uses the default base URL --mongodbflex-custom-endpoint MongoDB Flex API base URL. If unset, uses the default base URL --object-storage-custom-endpoint Object Storage API base URL. If unset, uses the default base URL diff --git a/go.mod b/go.mod index 8be4407af..3e2effedc 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 + github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 diff --git a/go.sum b/go.sum index 7bc67cf83..d28aa738a 100644 --- a/go.sum +++ b/go.sum @@ -622,6 +622,10 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 h1:ZyaB4jL71 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= +github.com/stackitcloud/stackit-sdk-go/services/logs v0.3.0 h1:N1gerABK2vH7/PBkxZeaWYJ7dz3rjeCHuto+FAuGx3w= +github.com/stackitcloud/stackit-sdk-go/services/logs v0.3.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= +github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxeB69IIpANev/jw6HIw2yfh/HO7w= +github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5 h1:tPISli81nuvLc5DPqgpvYPSjTySV0wXtMtkfdNXG4CU= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index 973a87c21..5bd94a17c 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -3,6 +3,7 @@ package beta import ( "fmt" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" @@ -47,4 +48,5 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(edge.NewCmd(params)) cmd.AddCommand(intake.NewCmd(params)) cmd.AddCommand(kms.NewCmd(params)) + cmd.AddCommand(logs.NewCmd(params)) } diff --git a/internal/cmd/beta/logs/instance/create/create.go b/internal/cmd/beta/logs/instance/create/create.go new file mode 100644 index 000000000..2dafa7c1e --- /dev/null +++ b/internal/cmd/beta/logs/instance/create/create.go @@ -0,0 +1,176 @@ +package create + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs/wait" +) + +const ( + displayNameFlag = "display-name" + retentionDaysFlag = "retention-days" + aclFlag = "acl" + descriptionFlag = "description" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + + DisplayName *string + RetentionDays *int64 + ACL *[]string + Description *string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a Logs instance", + Long: "Creates a Logs instance.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a Logs instance with name "my-instance" and retention time 10 days`, + `$ stackit beta logs instance create --display-name "my-instance" --retention-days 10`), + examples.NewExample( + `Create a Logs instance with name "my-instance", retention time 10 days, and a description`, + `$ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --description "Description of the instance"`), + examples.NewExample( + `Create a Logs instance with name "my-instance", retention time 10 days, and restrict access to a specific range of IP addresses.`, + `$ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --acl 1.2.3.0/24`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to create a Logs instance for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + if err != nil { + return err + } + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create Logs instance: %w", err) + } + if resp == nil { + return fmt.Errorf("create Logs instance: empty response from API") + } + if resp.Id == nil { + return fmt.Errorf("create Logs instance: instance id missing in response") + } + instanceId := *resp.Id + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Creating instance") + _, err = wait.CreateLogsInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for logs instance creation: %w", err) + } + s.Stop() + } + + return outputResult(params.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringSlice(aclFlag, []string{}, "Access control list") + cmd.Flags().Int64(retentionDaysFlag, 0, "The days for how long the logs should be stored before being cleaned up") + + err := flags.MarkFlagsRequired(cmd, displayNameFlag, retentionDaysFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + RetentionDays: flags.FlagToInt64Pointer(p, cmd, retentionDaysFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + ACL: flags.FlagToStringSlicePointer(p, cmd, aclFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiCreateLogsInstanceRequest { + req := apiClient.CreateLogsInstance(ctx, model.ProjectId, model.Region) + + req = req.CreateLogsInstancePayload(logs.CreateLogsInstancePayload{ + DisplayName: model.DisplayName, + Description: model.Description, + RetentionDays: model.RetentionDays, + Acl: model.ACL, + }) + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *logs.LogsInstance) error { + if resp == nil { + return fmt.Errorf("create logs instance response is empty") + } else if model == nil || model.GlobalFlagModel == nil { + return fmt.Errorf("input model is nil") + } + + return p.OutputResult(model.OutputFormat, resp, func() error { + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s instance for project %q. Instance ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/logs/instance/create/create_test.go b/internal/cmd/beta/logs/instance/create/create_test.go new file mode 100644 index 000000000..a1835d54c --- /dev/null +++ b/internal/cmd/beta/logs/instance/create/create_test.go @@ -0,0 +1,256 @@ +package create + +import ( + "context" + "strconv" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + testRegion = "eu01" + testDisplayName = "my-logs-instance" + testDescription = "my instance description" + testAcl = "198.51.100.14/24" + testRetentionDays = 32 +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + testProjectId = uuid.NewString() +) + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + retentionDaysFlag: strconv.Itoa(testRetentionDays), + descriptionFlag: testDescription, + aclFlag: testAcl, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + DisplayName: utils.Ptr(testDisplayName), + Description: utils.Ptr(testDescription), + RetentionDays: utils.Ptr(int64(testRetentionDays)), + ACL: utils.Ptr([]string{testAcl}), + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *logs.ApiCreateLogsInstanceRequest)) logs.ApiCreateLogsInstanceRequest { + request := testClient.CreateLogsInstance(testCtx, testProjectId, testRegion) + request = request.CreateLogsInstancePayload(logs.CreateLogsInstancePayload{ + DisplayName: utils.Ptr(testDisplayName), + Description: utils.Ptr(testDescription), + RetentionDays: utils.Ptr(int64(testRetentionDays)), + Acl: utils.Ptr([]string{testAcl}), + }) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "optional flags omitted", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, descriptionFlag) + delete(flagValues, aclFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.ACL = nil + }), + }, + { + description: "no values provided", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "display name missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, displayNameFlag) + }), + isValid: false, + }, + { + description: "retention days missing (required)", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, retentionDaysFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiCreateLogsInstanceRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "no optional values", + model: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.ACL = nil + }), + expectedRequest: fixtureRequest().CreateLogsInstancePayload(logs.CreateLogsInstancePayload{ + DisplayName: utils.Ptr(testDisplayName), + RetentionDays: utils.Ptr(int64(testRetentionDays)), + Description: nil, + Acl: nil, + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + model *inputModel + instance *logs.LogsInstance + wantErr bool + }{ + { + description: "nil response", + instance: nil, + wantErr: true, + }, + { + description: "model is nil", + instance: &logs.LogsInstance{}, + model: nil, + wantErr: true, + }, + { + description: "global flag nil", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: nil}, + wantErr: true, + }, + { + description: "default output", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{}}, + wantErr: false, + }, + { + description: "json output", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.JSONOutputFormat}}, + wantErr: false, + }, + { + description: "yaml output", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.YAMLOutputFormat}}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.model, "label", tt.instance) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/logs/instance/delete/delete.go b/internal/cmd/beta/logs/instance/delete/delete.go new file mode 100644 index 000000000..3344a3a93 --- /dev/null +++ b/internal/cmd/beta/logs/instance/delete/delete.go @@ -0,0 +1,129 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs/wait" +) + +const ( + argInstanceID = "INSTANCE_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceID string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", argInstanceID), + Short: "Deletes the given Logs instance", + Long: "Deletes the given Logs instance.", + Args: args.SingleArg(argInstanceID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a Logs instance with ID "xxx"`, + `$ stackit beta logs instance delete "xxx"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + instanceLabel, err := logsUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceID) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceID + } + + prompt := fmt.Sprintf("Are you sure you want to delete instance %q from project %q? (This cannot be undone)", instanceLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete Logs instance: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(params.Printer) + s.Start("Deleting instance") + _, err = wait.DeleteLogsInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceID).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for Logs instance deletion: %w", err) + } + s.Stop() + } + + operationState := "Deleted" + if model.Async { + operationState = "Triggered deletion of" + } + params.Printer.Outputf("%s instance %q\n", operationState, instanceLabel) + return nil + }, + } + + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + instanceId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceID: instanceId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiDeleteLogsInstanceRequest { + req := apiClient.DeleteLogsInstance(ctx, model.ProjectId, model.Region, model.InstanceID) + return req +} diff --git a/internal/cmd/beta/logs/instance/delete/delete_test.go b/internal/cmd/beta/logs/instance/delete/delete_test.go new file mode 100644 index 000000000..7b89cccb0 --- /dev/null +++ b/internal/cmd/beta/logs/instance/delete/delete_test.go @@ -0,0 +1,174 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu02" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +// Args +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testInstanceId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// Flags +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// Input Model +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + InstanceID: testInstanceId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// Request +func fixtureRequest(mods ...func(request *logs.ApiDeleteLogsInstanceRequest)) logs.ApiDeleteLogsInstanceRequest { + request := testClient.DeleteLogsInstance(testCtx, testProjectId, testRegion, testInstanceId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + expectedModel: fixtureInputModel(), + isValid: true, + }, + { + description: "no args (instanceID)", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "instance id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiDeleteLogsInstanceRequest + }{ + { + description: "base case", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/logs/instance/describe/describe.go b/internal/cmd/beta/logs/instance/describe/describe.go new file mode 100644 index 000000000..66d27d99a --- /dev/null +++ b/internal/cmd/beta/logs/instance/describe/describe.go @@ -0,0 +1,118 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + argInstanceID = "INSTANCE_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceID string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", argInstanceID), + Short: "Shows details of a Logs instance", + Long: "Shows details of a Logs instance", + Args: args.SingleArg(argInstanceID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of a Logs instance with ID "xxx"`, + `$ stackit beta logs instance describe xxx`, + ), + examples.NewExample( + `Get details of a Logs instance with ID "xxx" in JSON format`, + "$ stackit beta logs instance describe xxx --output-format json"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get instance: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + model := &inputModel{ + GlobalFlagModel: globalFlags, + InstanceID: inputArgs[0], + } + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiGetLogsInstanceRequest { + return apiClient.GetLogsInstance(ctx, model.ProjectId, model.Region, model.InstanceID) +} + +func outputResult(p *print.Printer, outputFormat string, instance *logs.LogsInstance) error { + if instance == nil { + return fmt.Errorf("instance response is empty") + } + return p.OutputResult(outputFormat, instance, func() error { + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(instance.Id)) + table.AddSeparator() + table.AddRow("DISPLAY NAME", utils.PtrString(instance.DisplayName)) + table.AddSeparator() + table.AddRow("RETENTION DAYS", utils.PtrString(instance.RetentionDays)) + table.AddSeparator() + table.AddRow("ACL IP RANGES", utils.PtrString(instance.Acl)) + table.AddSeparator() + table.AddRow("DATA SOURCE", utils.PtrString(instance.DatasourceUrl)) + table.AddSeparator() + table.AddRow("OTLP INGEST", utils.PtrString(instance.IngestOtlpUrl)) + table.AddSeparator() + table.AddRow("INGEST", utils.PtrString(instance.IngestUrl)) + table.AddSeparator() + table.AddRow("QUERY RANGE", utils.PtrString(instance.QueryRangeUrl)) + table.AddSeparator() + table.AddRow("QUERY", utils.PtrString(instance.QueryUrl)) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/logs/instance/describe/describe_test.go b/internal/cmd/beta/logs/instance/describe/describe_test.go new file mode 100644 index 000000000..661ce4aa5 --- /dev/null +++ b/internal/cmd/beta/logs/instance/describe/describe_test.go @@ -0,0 +1,191 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &logs.APIClient{} +var testProjectId = uuid.NewString() +var testInstanceId = uuid.NewString() + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + InstanceID: testInstanceId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiGetLogsInstanceRequest)) logs.ApiGetLogsInstanceRequest { + request := testClient.GetLogsInstance(testCtx, testProjectId, testRegion, testInstanceId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: []string{testInstanceId}, + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "project id missing", + argValues: []string{testInstanceId}, + flagValues: fixtureFlagValues(func(m map[string]string) { delete(m, globalflags.ProjectIdFlag) }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: []string{testInstanceId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: []string{testInstanceId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "invalid instance id", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiGetLogsInstanceRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instance *logs.LogsInstance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", instance: &logs.LogsInstance{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, instance: &logs.LogsInstance{}}, + wantErr: false, + }, + { + name: "yaml output", + args: args{outputFormat: print.YAMLOutputFormat, instance: &logs.LogsInstance{}}, + wantErr: false, + }, + { + name: "nil instance", + args: args{instance: nil}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.instance); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/logs/instance/instance.go b/internal/cmd/beta/logs/instance/instance.go new file mode 100644 index 000000000..ad099a9d1 --- /dev/null +++ b/internal/cmd/beta/logs/instance/instance.go @@ -0,0 +1,34 @@ +package instance + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "instance", + Short: "Provides functionality for Logs instances", + Long: "Provides functionality for Logs instances.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) +} diff --git a/internal/cmd/beta/logs/instance/list/list.go b/internal/cmd/beta/logs/instance/list/list.go new file mode 100644 index 000000000..226c3b5c3 --- /dev/null +++ b/internal/cmd/beta/logs/instance/list/list.go @@ -0,0 +1,147 @@ +package list + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +const ( + limitFlag = "limit" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists Logs instances", + Long: "Lists Logs instances within the project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all Logs instances`, + `$ stackit beta logs instance list`, + ), + examples.NewExample( + `List the first 10 Logs instances`, + `$ stackit beta logs instance list --limit=10`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + // Call API + request := buildRequest(ctx, model, apiClient) + + response, err := request.Execute() + if err != nil { + return fmt.Errorf("list Logs instances: %w", err) + } + items := response.GetInstances() + + // Truncate output + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, items) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiListLogsInstancesRequest { + request := apiClient.ListLogsInstances(ctx, model.ProjectId, model.Region) + + return request +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, instances []logs.LogsInstance) error { + return p.OutputResult(outputFormat, instances, func() error { + if len(instances) == 0 { + p.Outputf("No Logs instances found for project %q", projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("NAME", "ID", "STATUS") + for _, instance := range instances { + table.AddRow( + utils.PtrString(instance.DisplayName), + utils.PtrString(instance.Id), + utils.PtrString(instance.Status), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/beta/logs/instance/list/list_test.go b/internal/cmd/beta/logs/instance/list/list_test.go new file mode 100644 index 000000000..987d0e8d8 --- /dev/null +++ b/internal/cmd/beta/logs/instance/list/list_test.go @@ -0,0 +1,195 @@ +package list + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &logs.APIClient{} +var testProjectId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + limitFlag: "10", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Limit: utils.Ptr(int64(10)), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiListLogsInstancesRequest)) logs.ApiListLogsInstancesRequest { + request := testClient.ListLogsInstances(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "limit invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "limit invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiListLogsInstancesRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + instances []logs.LogsInstance + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty instances slice", + args: args{ + instances: []logs.LogsInstance{}, + }, + wantErr: false, + }, + { + name: "empty instance in instances slice", + args: args{ + instances: []logs.LogsInstance{{}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.instances); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/logs/instance/update/update.go b/internal/cmd/beta/logs/instance/update/update.go new file mode 100644 index 000000000..2e6fcea0b --- /dev/null +++ b/internal/cmd/beta/logs/instance/update/update.go @@ -0,0 +1,165 @@ +package update + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + argInstanceID = "INSTANCE_ID" + + displayNameFlag = "display-name" + retentionDaysFlag = "retention-days" + aclFlag = "acl" + descriptionFlag = "description" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceID string + DisplayName *string + RetentionDays *int64 + ACL *[]string + Description *string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", argInstanceID), + Short: "Updates a Logs instance", + Long: "Updates a Logs instance.", + Args: args.SingleArg(argInstanceID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update the display name of the Logs instance with ID "xxx"`, + "$ stackit beta logs instance update xxx --display-name new-name"), + examples.NewExample( + `Update the retention time of the Logs instance with ID "xxx"`, + "$ stackit beta logs instance update xxx --retention-days 40"), + examples.NewExample( + `Update the ACL of the Logs instance with ID "xxx"`, + "$ stackit beta logs instance update xxx --acl 1.2.3.0/24"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + instanceLabel, err := logsUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceID) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceID + } + + prompt := fmt.Sprintf("Are you sure you want to update instance %s?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update logs instance: %w", err) + } + + return outputResult(params.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringSlice(aclFlag, []string{}, "Access control list") + cmd.Flags().Int64(retentionDaysFlag, 0, "The days for how long the logs should be stored before being cleaned up") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + instanceId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + displayName := flags.FlagToStringPointer(p, cmd, displayNameFlag) + retentionDays := flags.FlagToInt64Pointer(p, cmd, retentionDaysFlag) + acl := flags.FlagToStringSlicePointer(p, cmd, aclFlag) + description := flags.FlagToStringPointer(p, cmd, descriptionFlag) + + if displayName == nil && retentionDays == nil && acl == nil && description == nil { + return nil, &errors.EmptyUpdateError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceID: instanceId, + DisplayName: displayName, + ACL: acl, + Description: description, + RetentionDays: retentionDays, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiUpdateLogsInstanceRequest { + req := apiClient.UpdateLogsInstance(ctx, model.ProjectId, model.Region, model.InstanceID) + req = req.UpdateLogsInstancePayload(logs.UpdateLogsInstancePayload{ + DisplayName: model.DisplayName, + Acl: model.ACL, + RetentionDays: model.RetentionDays, + Description: model.Description, + }) + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, instance *logs.LogsInstance) error { + if instance == nil { + return fmt.Errorf("instance is nil") + } else if model == nil || model.GlobalFlagModel == nil { + return fmt.Errorf("input model is nil") + } + return p.OutputResult(model.OutputFormat, instance, func() error { + p.Outputf("Updated instance %q for project %q.\n", utils.PtrString(instance.DisplayName), projectLabel) + return nil + }) +} diff --git a/internal/cmd/beta/logs/instance/update/update_test.go b/internal/cmd/beta/logs/instance/update/update_test.go new file mode 100644 index 000000000..b885d5677 --- /dev/null +++ b/internal/cmd/beta/logs/instance/update/update_test.go @@ -0,0 +1,306 @@ +package update + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testInstanceId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: "name", + aclFlag: "0.0.0.0/0", + retentionDaysFlag: "60", + descriptionFlag: "Example", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + InstanceID: testInstanceId, + DisplayName: utils.Ptr("name"), + ACL: utils.Ptr([]string{"0.0.0.0/0"}), + RetentionDays: utils.Ptr(int64(60)), + Description: utils.Ptr("Example"), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiUpdateLogsInstanceRequest)) logs.ApiUpdateLogsInstanceRequest { + request := testClient.UpdateLogsInstance(testCtx, testProjectId, testRegion, testInstanceId) + request = request.UpdateLogsInstancePayload(logs.UpdateLogsInstancePayload{ + DisplayName: utils.Ptr("name"), + Acl: utils.Ptr([]string{"0.0.0.0/0"}), + RetentionDays: utils.Ptr(int64(60)), + Description: utils.Ptr("Example"), + }) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + primaryFlagValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "required flags only (no values to update)", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + }, + isValid: false, + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + InstanceID: testInstanceId, + }, + }, + { + description: "update all fields", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: "display-name", + aclFlag: "0.0.0.0/24", + descriptionFlag: "description", + retentionDaysFlag: "60", + }, + isValid: true, + expectedModel: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + InstanceID: testInstanceId, + DisplayName: utils.Ptr("display-name"), + ACL: utils.Ptr([]string{"0.0.0.0/24"}), + RetentionDays: utils.Ptr(int64(60)), + Description: utils.Ptr("description"), + }, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "instance id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiUpdateLogsInstanceRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "required fields only", + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + InstanceID: testInstanceId, + }, + expectedRequest: testClient.UpdateLogsInstance(testCtx, testProjectId, testRegion, testInstanceId). + UpdateLogsInstancePayload(logs.UpdateLogsInstancePayload{}), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + model *inputModel + instance *logs.LogsInstance + wantErr bool + }{ + { + description: "nil response", + instance: nil, + wantErr: true, + }, + { + description: "default output", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{}}, + wantErr: false, + }, + { + description: "model is nil", + instance: &logs.LogsInstance{}, + model: nil, + wantErr: true, + }, + { + description: "global flag nil", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: nil}, + wantErr: true, + }, + { + description: "json output", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.JSONOutputFormat}}, + wantErr: false, + }, + { + description: "yaml output", + instance: &logs.LogsInstance{}, + model: &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: print.YAMLOutputFormat}}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + err := outputResult(p, tt.model, "label", tt.instance) + if (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/logs/logs.go b/internal/cmd/beta/logs/logs.go new file mode 100644 index 000000000..d7e0b803a --- /dev/null +++ b/internal/cmd/beta/logs/logs.go @@ -0,0 +1,26 @@ +package logs + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "logs", + Short: "Provides functionality for Logs", + Long: "Provides functionality for Logs.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(instance.NewCmd(params)) +} diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index 64ee916f4..a4ff8b428 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -50,6 +50,7 @@ const ( iaasCustomEndpointFlag = "iaas-custom-endpoint" tokenCustomEndpointFlag = "token-custom-endpoint" intakeCustomEndpointFlag = "intake-custom-endpoint" + logsCustomEndpointFlag = "logs-custom-endpoint" sfsCustomEndpointFlag = "sfs-custom-endpoint" ) @@ -167,6 +168,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(iaasCustomEndpointFlag, "", "IaaS API base URL, used in calls to this API") cmd.Flags().String(tokenCustomEndpointFlag, "", "Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication.") cmd.Flags().String(intakeCustomEndpointFlag, "", "Intake API base URL, used in calls to this API") + cmd.Flags().String(logsCustomEndpointFlag, "", "Logs API base URL, used in calls to this API") cmd.Flags().String(sfsCustomEndpointFlag, "", "SFS API base URL, used in calls to this API") err := viper.BindPFlag(config.SessionTimeLimitKey, cmd.Flags().Lookup(sessionTimeLimitFlag)) @@ -230,6 +232,8 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) err = viper.BindPFlag(config.IntakeCustomEndpointKey, cmd.Flags().Lookup(intakeCustomEndpointFlag)) cobra.CheckErr(err) + err = viper.BindPFlag(config.LogsCustomEndpointKey, cmd.Flags().Lookup(logsCustomEndpointFlag)) + cobra.CheckErr(err) err = viper.BindPFlag(config.SfsCustomEndpointKey, cmd.Flags().Lookup(sfsCustomEndpointFlag)) cobra.CheckErr(err) } diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index c20aa131c..460cdf9d4 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -55,6 +55,7 @@ const ( iaasCustomEndpointFlag = "iaas-custom-endpoint" tokenCustomEndpointFlag = "token-custom-endpoint" intakeCustomEndpointFlag = "intake-custom-endpoint" + logsCustomEndpointFlag = "logs-custom-endpoint" ) type inputModel struct { @@ -96,6 +97,7 @@ type inputModel struct { IaaSCustomEndpoint bool TokenCustomEndpoint bool IntakeCustomEndpoint bool + LogsCustomEndpoint bool } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -225,6 +227,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.IntakeCustomEndpoint { viper.Set(config.IntakeCustomEndpointKey, "") } + if model.LogsCustomEndpoint { + viper.Set(config.LogsCustomEndpointKey, "") + } if model.SfsCustomEndpoint { viper.Set(config.SfsCustomEndpointKey, "") } @@ -278,6 +283,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(iaasCustomEndpointFlag, false, "IaaS API base URL. If unset, uses the default base URL") cmd.Flags().Bool(tokenCustomEndpointFlag, false, "Custom token endpoint of the Service Account API, which is used to request access tokens when the service account authentication is activated. Not relevant for user authentication.") cmd.Flags().Bool(intakeCustomEndpointFlag, false, "Intake API base URL. If unset, uses the default base URL") + cmd.Flags().Bool(logsCustomEndpointFlag, false, "Logs API base URL. If unset, uses the default base URL") cmd.Flags().Bool(sfsCustomEndpointFlag, false, "SFS API base URL. If unset, uses the default base URL") } @@ -321,6 +327,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { IaaSCustomEndpoint: flags.FlagToBoolValue(p, cmd, iaasCustomEndpointFlag), TokenCustomEndpoint: flags.FlagToBoolValue(p, cmd, tokenCustomEndpointFlag), IntakeCustomEndpoint: flags.FlagToBoolValue(p, cmd, intakeCustomEndpointFlag), + LogsCustomEndpoint: flags.FlagToBoolValue(p, cmd, logsCustomEndpointFlag), } p.DebugInputModel(model) diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index 37ee8f7d2..65c6cb35b 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -47,6 +47,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool iaasCustomEndpointFlag: true, tokenCustomEndpointFlag: true, intakeCustomEndpointFlag: true, + logsCustomEndpointFlag: true, } for _, mod := range mods { mod(flagValues) @@ -90,6 +91,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { IaaSCustomEndpoint: true, TokenCustomEndpoint: true, IntakeCustomEndpoint: true, + LogsCustomEndpoint: true, } for _, mod := range mods { mod(model) @@ -149,6 +151,7 @@ func TestParseInput(t *testing.T) { model.IaaSCustomEndpoint = false model.TokenCustomEndpoint = false model.IntakeCustomEndpoint = false + model.LogsCustomEndpoint = false }), }, { @@ -331,6 +334,16 @@ func TestParseInput(t *testing.T) { model.TokenCustomEndpoint = false }), }, + { + description: "logs custom endpoint empty", + flagValues: fixtureFlagValues(func(flagValues map[string]bool) { + flagValues[logsCustomEndpointFlag] = false + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.LogsCustomEndpoint = false + }), + }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index a60bbd17b..32761f275 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -51,6 +51,7 @@ const ( TokenCustomEndpointKey = "token_custom_endpoint" GitCustomEndpointKey = "git_custom_endpoint" IntakeCustomEndpointKey = "intake_custom_endpoint" + LogsCustomEndpointKey = "logs_custom_endpoint" ProjectNameKey = "project_name" DefaultProfileName = "default" @@ -114,6 +115,7 @@ var ConfigKeys = []string{ GitCustomEndpointKey, IntakeCustomEndpointKey, AlbCustomEndpoint, + LogsCustomEndpointKey, } var defaultConfigFolderPath string @@ -203,6 +205,7 @@ func setConfigDefaults() { viper.SetDefault(GitCustomEndpointKey, "") viper.SetDefault(IntakeCustomEndpointKey, "") viper.SetDefault(AlbCustomEndpoint, "") + viper.SetDefault(LogsCustomEndpointKey, "") } func getConfigFilePath(configFolder string) string { diff --git a/internal/pkg/services/logs/client/client.go b/internal/pkg/services/logs/client/client.go new file mode 100644 index 000000000..6bce9b246 --- /dev/null +++ b/internal/pkg/services/logs/client/client.go @@ -0,0 +1,14 @@ +package client + +import ( + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/viper" +) + +func ConfigureClient(p *print.Printer, cliVersion string) (*logs.APIClient, error) { + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.LogsCustomEndpointKey), false, genericclient.CreateApiClient[*logs.APIClient](logs.NewAPIClient)) +} diff --git a/internal/pkg/services/logs/utils/utils.go b/internal/pkg/services/logs/utils/utils.go new file mode 100644 index 000000000..4008db158 --- /dev/null +++ b/internal/pkg/services/logs/utils/utils.go @@ -0,0 +1,30 @@ +package utils + +import ( + "context" + "errors" + "fmt" + + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +var ( + ErrResponseNil = errors.New("response is nil") + ErrNameNil = errors.New("display name is nil") +) + +type LogsClient interface { + GetLogsInstanceExecute(ctx context.Context, projectId, regionId, instanceId string) (*logs.LogsInstance, error) +} + +func GetInstanceName(ctx context.Context, apiClient LogsClient, projectId, regionId, instanceId string) (string, error) { + resp, err := apiClient.GetLogsInstanceExecute(ctx, projectId, regionId, instanceId) + if err != nil { + return "", fmt.Errorf("get Logs instance: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.DisplayName == nil { + return "", ErrNameNil + } + return *resp.DisplayName, nil +} diff --git a/internal/pkg/services/logs/utils/utils_test.go b/internal/pkg/services/logs/utils/utils_test.go new file mode 100644 index 000000000..0c21b4d09 --- /dev/null +++ b/internal/pkg/services/logs/utils/utils_test.go @@ -0,0 +1,96 @@ +package utils + +import ( + "context" + "fmt" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/google/uuid" +) + +var ( + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +const ( + testInstanceName = "instance" + testRegion = "eu01" +) + +type logsClientMocked struct { + getInstanceFails bool + getInstanceResp *logs.LogsInstance +} + +func (m *logsClientMocked) GetLogsInstanceExecute(_ context.Context, _, _, _ string) (*logs.LogsInstance, error) { + if m.getInstanceFails { + return nil, fmt.Errorf("could not get instance") + } + return m.getInstanceResp, nil +} + +func TestGetInstanceName(t *testing.T) { + tests := []struct { + description string + getInstanceFails bool + getInstanceResp *logs.LogsInstance + isValid bool + expectedOutput string + }{ + { + description: "base", + getInstanceResp: &logs.LogsInstance{ + DisplayName: utils.Ptr(testInstanceName), + }, + isValid: true, + expectedOutput: testInstanceName, + }, + { + description: "get instance fails", + getInstanceFails: true, + isValid: false, + }, + { + description: "response is nil", + getInstanceFails: false, + getInstanceResp: nil, + isValid: false, + }, + { + description: "name in response is nil", + getInstanceFails: false, + getInstanceResp: &logs.LogsInstance{ + DisplayName: nil, + }, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &logsClientMocked{ + getInstanceFails: tt.getInstanceFails, + getInstanceResp: tt.getInstanceResp, + } + + output, err := GetInstanceName(context.Background(), client, testProjectId, testRegion, testInstanceId) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input") + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %s, got %s", tt.expectedOutput, output) + } + }) + } +} From d65f2189d07f2c647336eac89d9890ef6396b6a7 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Tue, 27 Jan 2026 10:04:38 +0100 Subject: [PATCH 325/422] feat(cdn): add cdn client, config, list command (#1100) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(cdn): add cdn client, config, list command * fix(cdn): generate docs * fix(cdn) fix linting issues * Update internal/cmd/beta/cdn/distribution/list/list.go Co-authored-by: Ruben Hönle * Update internal/cmd/beta/cdn/distribution/list/list.go Co-authored-by: Ruben Hönle * fix(cdn): rename sortBy params, use EnumSliceToStringSlice * fix(cdn): make `testNextPageID`, `testID` and `testStatus` constant * fix(cdn): add cdn subcommand to beta, generate docs * feat(cdn) add limit flag to distribution list * feat(cdn): add distribution create cmd * fix(cdn): generate distribution create docs * squash this * feat(cdn) implement cdn distribution create/delete/describe/update * squash * squash * fix(cdn) regenerate docs * fix(cdn) linting issues * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/secretsmanager (#1112) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverbackup (#1111) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1110) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverupdate (#1109) * chore(deps): bump renovatebot/github-action from 44.0.3 to 44.0.4 (#1113) * feat(kms) describe key, keyring, wrappingkey (#1107) * feat(kms) describe key, keyring, wrappingkey * fix(kms): do not reuse buffer during output tests * fix(kms) use constant Time for TestOutputResult for constant table widths * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#1118) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1117) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#1116) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#1115) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceenablement (#1123) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/dns (#1122) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1121) * fix(alb): print valid JSON/YAML output for list cmds (#1045) relates to STACKITCLI-273 / #893 * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mariadb (#1129) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/redis (#1128) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/runcommand (#1127) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/authorization (#1120) * chore: increase linter timeout (#1131) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/intake (#1132) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#1133) * fix: log browser url to stderr instead of stdout (#1136) fixes #1125 * fix(deps): update module github.com/goccy/go-yaml to v1.19.0 (#1137) * feat(mongodbflex): add readAnyDatabase and stackitAdmin roles for users (#1049) Co-authored-by: Ruben Hoenle * fix: refresh token flow uses x-www-form encoding (#1135) * chore(deps): update renovatebot/github-action action to v44.0.5 (#1141) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex (#1139) * feat(cdn): add cdn client, config, list command * feat(cdn) implement cdn distribution create/delete/describe/update * fix(cdn) manual merge fixes * fix(cdn) review fixes - test Min - test JoinStringMap - rm superfluous var for constant - rm file committed by accident - add nil checks when dereferencing pointers * fix(cdn) replace utils.Min usage with builtin min * Update internal/cmd/beta/cdn/distribution/list/list.go Co-authored-by: Ruben Hönle * fix(cdn) apply review comments - replace single char names with more descriptive ones - remove predefined mod functions - deduplicate ParseOriginRequestHeaders and test it - deduplicate ParseGeofencing and test it - add test FlagTo* funcs * fix(cdn) fix merge errors * fix(cdn) more merge errors, and single char renames * fix(cdn) JoinStringMap: define order * fix(cdn) define geofencing order * fix(cdn) review changes - fix `ID` spelling - add missing new line at end of output - rm TODO comment * feat(printer) make PromptForPassword scripting compatible * fix(cdn) add example to pass password in script * fix(docs) generate docs * fix(printer) make TestPromptForPassword compatible with older go versions * fix(printer) fix/ignore linting issues * fix(cdn) adjust list TestOutputResult expected to new printer changes * fix(cdn) rm superfluous model.AssumeYes checks * fix(fmt) run fmt --------- Co-authored-by: Ruben Hönle Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Co-authored-by: stackit-pipeline <142982727+stackit-pipeline@users.noreply.github.com> Co-authored-by: Piet van der Meulen Co-authored-by: Jorge Turrado Ferrero --- docs/stackit_beta.md | 1 + docs/stackit_beta_cdn.md | 34 ++ docs/stackit_beta_cdn_distribution.md | 38 ++ docs/stackit_beta_cdn_distribution_create.md | 68 +++ docs/stackit_beta_cdn_distribution_delete.md | 40 ++ .../stackit_beta_cdn_distribution_describe.md | 44 ++ docs/stackit_beta_cdn_distribution_list.md | 45 ++ docs/stackit_beta_cdn_distribution_update.md | 57 ++ docs/stackit_config_set.md | 1 + docs/stackit_config_unset.md | 1 + go.mod | 3 +- go.sum | 2 + internal/cmd/beta/beta.go | 4 +- internal/cmd/beta/cdn/cdn.go | 25 + .../beta/cdn/distribution/create/create.go | 340 +++++++++++ .../cdn/distribution/create/create_test.go | 542 ++++++++++++++++++ .../beta/cdn/distribution/delete/delete.go | 92 +++ .../cdn/distribution/delete/delete_test.go | 130 +++++ .../cdn/distribution/describe/describe.go | 219 +++++++ .../distribution/describe/describe_test.go | 409 +++++++++++++ .../cmd/beta/cdn/distribution/distribution.go | 32 ++ .../cmd/beta/cdn/distribution/list/list.go | 175 ++++++ .../beta/cdn/distribution/list/list_test.go | 471 +++++++++++++++ .../beta/cdn/distribution/update/update.go | 337 +++++++++++ .../cdn/distribution/update/update_test.go | 365 ++++++++++++ internal/cmd/config/set/set.go | 4 + internal/cmd/config/unset/unset.go | 7 + internal/cmd/config/unset/unset_test.go | 13 + internal/pkg/config/config.go | 3 + internal/pkg/flags/flag_to_value.go | 28 + internal/pkg/flags/flag_to_value_test.go | 113 ++++ internal/pkg/print/print.go | 15 +- internal/pkg/print/print_test.go | 49 ++ internal/pkg/services/cdn/client/client.go | 13 + internal/pkg/services/cdn/utils/utils.go | 40 ++ internal/pkg/services/cdn/utils/utils_test.go | 94 +++ internal/pkg/testutils/testutils.go | 16 + internal/pkg/utils/strings.go | 19 + internal/pkg/utils/strings_test.go | 36 ++ 39 files changed, 3920 insertions(+), 5 deletions(-) create mode 100644 docs/stackit_beta_cdn.md create mode 100644 docs/stackit_beta_cdn_distribution.md create mode 100644 docs/stackit_beta_cdn_distribution_create.md create mode 100644 docs/stackit_beta_cdn_distribution_delete.md create mode 100644 docs/stackit_beta_cdn_distribution_describe.md create mode 100644 docs/stackit_beta_cdn_distribution_list.md create mode 100644 docs/stackit_beta_cdn_distribution_update.md create mode 100644 internal/cmd/beta/cdn/cdn.go create mode 100644 internal/cmd/beta/cdn/distribution/create/create.go create mode 100644 internal/cmd/beta/cdn/distribution/create/create_test.go create mode 100644 internal/cmd/beta/cdn/distribution/delete/delete.go create mode 100644 internal/cmd/beta/cdn/distribution/delete/delete_test.go create mode 100644 internal/cmd/beta/cdn/distribution/describe/describe.go create mode 100644 internal/cmd/beta/cdn/distribution/describe/describe_test.go create mode 100644 internal/cmd/beta/cdn/distribution/distribution.go create mode 100644 internal/cmd/beta/cdn/distribution/list/list.go create mode 100644 internal/cmd/beta/cdn/distribution/list/list_test.go create mode 100644 internal/cmd/beta/cdn/distribution/update/update.go create mode 100644 internal/cmd/beta/cdn/distribution/update/update_test.go create mode 100644 internal/pkg/services/cdn/client/client.go create mode 100644 internal/pkg/services/cdn/utils/utils.go create mode 100644 internal/pkg/services/cdn/utils/utils_test.go diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index 78b58b1f7..079333c69 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -42,6 +42,7 @@ stackit beta [flags] * [stackit](./stackit.md) - Manage STACKIT resources using the command line * [stackit beta alb](./stackit_beta_alb.md) - Manages application loadbalancers +* [stackit beta cdn](./stackit_beta_cdn.md) - Manage CDN resources * [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. * [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS diff --git a/docs/stackit_beta_cdn.md b/docs/stackit_beta_cdn.md new file mode 100644 index 000000000..b0a99f688 --- /dev/null +++ b/docs/stackit_beta_cdn.md @@ -0,0 +1,34 @@ +## stackit beta cdn + +Manage CDN resources + +### Synopsis + +Manage the lifecycle of CDN resources. + +``` +stackit beta cdn [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta cdn" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta cdn distribution](./stackit_beta_cdn_distribution.md) - Manage CDN distributions + diff --git a/docs/stackit_beta_cdn_distribution.md b/docs/stackit_beta_cdn_distribution.md new file mode 100644 index 000000000..c9c26a931 --- /dev/null +++ b/docs/stackit_beta_cdn_distribution.md @@ -0,0 +1,38 @@ +## stackit beta cdn distribution + +Manage CDN distributions + +### Synopsis + +Manage the lifecycle of CDN distributions. + +``` +stackit beta cdn distribution [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta cdn distribution" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta cdn](./stackit_beta_cdn.md) - Manage CDN resources +* [stackit beta cdn distribution create](./stackit_beta_cdn_distribution_create.md) - Create a CDN distribution +* [stackit beta cdn distribution delete](./stackit_beta_cdn_distribution_delete.md) - Delete a CDN distribution +* [stackit beta cdn distribution describe](./stackit_beta_cdn_distribution_describe.md) - Describe a CDN distribution +* [stackit beta cdn distribution list](./stackit_beta_cdn_distribution_list.md) - List CDN distributions +* [stackit beta cdn distribution update](./stackit_beta_cdn_distribution_update.md) - Update a CDN distribution + diff --git a/docs/stackit_beta_cdn_distribution_create.md b/docs/stackit_beta_cdn_distribution_create.md new file mode 100644 index 000000000..f52da0cf1 --- /dev/null +++ b/docs/stackit_beta_cdn_distribution_create.md @@ -0,0 +1,68 @@ +## stackit beta cdn distribution create + +Create a CDN distribution + +### Synopsis + +Create a CDN distribution for a given originUrl in multiple regions. + +``` +stackit beta cdn distribution create [flags] +``` + +### Examples + +``` + Create a CDN distribution with an HTTP backend + $ stackit beta cdn distribution create --http --http-origin-url https://example.com \ +--regions AF,EU + + Create a CDN distribution with an Object Storage backend + $ stackit beta cdn distribution create --bucket --bucket-url https://bucket.example.com \ +--bucket-credentials-access-key-id yyyy --bucket-region EU \ +--regions AF,EU + + Create a CDN distribution passing the password via stdin, take care that there's a '\n' at the end of the input' + $ cat secret.txt | stackit beta cdn distribution create -y --project-id xxx \ +--bucket --bucket-url https://bucket.example.com --bucekt-credentials-access-key-id yyyy --bucket-region EU \ +--regions AF,EU +``` + +### Options + +``` + --blocked-countries strings Comma-separated list of ISO 3166-1 alpha-2 country codes to block (e.g., 'US,DE,FR') + --blocked-ips strings Comma-separated list of IPv4 addresses to block (e.g., '10.0.0.8,127.0.0.1') + --bucket Use Object Storage backend + --bucket-credentials-access-key-id string Access Key ID for Object Storage backend + --bucket-region string Region for Object Storage backend + --bucket-url string Bucket URL for Object Storage backend + --default-cache-duration string ISO8601 duration string for default cache duration (e.g., 'PT1H30M' for 1 hour and 30 minutes) + -h, --help Help for "stackit beta cdn distribution create" + --http Use HTTP backend + --http-geofencing stringArray Geofencing rules for HTTP backend in the format 'https://example.com US,DE'. URL and countries have to be quoted. Repeatable. + --http-origin-request-headers strings Origin request headers for HTTP backend in the format 'HeaderName: HeaderValue', repeatable. WARNING: do not store sensitive values in the headers! + --http-origin-url string Origin URL for HTTP backend + --loki Enable Loki log sink for the CDN distribution + --loki-push-url string Push URL for log sink + --loki-username string Username for log sink + --monthly-limit-bytes int Monthly limit in bytes for the CDN distribution + --optimizer Enable optimizer for the CDN distribution (paid feature). + --regions strings Regions in which content should be cached, multiple of: ["EU" "US" "AF" "SA" "ASIA"] (default []) +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta cdn distribution](./stackit_beta_cdn_distribution.md) - Manage CDN distributions + diff --git a/docs/stackit_beta_cdn_distribution_delete.md b/docs/stackit_beta_cdn_distribution_delete.md new file mode 100644 index 000000000..7313b5a39 --- /dev/null +++ b/docs/stackit_beta_cdn_distribution_delete.md @@ -0,0 +1,40 @@ +## stackit beta cdn distribution delete + +Delete a CDN distribution + +### Synopsis + +Delete a CDN distribution by its ID. + +``` +stackit beta cdn distribution delete [flags] +``` + +### Examples + +``` + Delete a CDN distribution with ID "xxx" + $ stackit beta cdn distribution delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta cdn distribution delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta cdn distribution](./stackit_beta_cdn_distribution.md) - Manage CDN distributions + diff --git a/docs/stackit_beta_cdn_distribution_describe.md b/docs/stackit_beta_cdn_distribution_describe.md new file mode 100644 index 000000000..1e8f68a7e --- /dev/null +++ b/docs/stackit_beta_cdn_distribution_describe.md @@ -0,0 +1,44 @@ +## stackit beta cdn distribution describe + +Describe a CDN distribution + +### Synopsis + +Describe a CDN distribution by its ID. + +``` +stackit beta cdn distribution describe [flags] +``` + +### Examples + +``` + Get details of a CDN distribution with ID "xxx" + $ stackit beta cdn distribution describe xxx + + Get details of a CDN, including WAF details, for ID "xxx" + $ stackit beta cdn distribution describe xxx --with-waf +``` + +### Options + +``` + -h, --help Help for "stackit beta cdn distribution describe" + --with-waf Include WAF details in the distribution description +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta cdn distribution](./stackit_beta_cdn_distribution.md) - Manage CDN distributions + diff --git a/docs/stackit_beta_cdn_distribution_list.md b/docs/stackit_beta_cdn_distribution_list.md new file mode 100644 index 000000000..4fc5d2750 --- /dev/null +++ b/docs/stackit_beta_cdn_distribution_list.md @@ -0,0 +1,45 @@ +## stackit beta cdn distribution list + +List CDN distributions + +### Synopsis + +List all CDN distributions in your account. + +``` +stackit beta cdn distribution list [flags] +``` + +### Examples + +``` + List all CDN distributions + $ stackit beta cdn distribution list + + List all CDN distributions sorted by id + $ stackit beta cdn distribution list --sort-by=id +``` + +### Options + +``` + -- int Limit the output to the first n elements + -h, --help Help for "stackit beta cdn distribution list" + --sort-by string Sort entries by a specific field, one of ["id" "createdAt" "updatedAt" "originUrl" "status" "originUrlRelated"] (default "createdAt") +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta cdn distribution](./stackit_beta_cdn_distribution.md) - Manage CDN distributions + diff --git a/docs/stackit_beta_cdn_distribution_update.md b/docs/stackit_beta_cdn_distribution_update.md new file mode 100644 index 000000000..f8f26dec9 --- /dev/null +++ b/docs/stackit_beta_cdn_distribution_update.md @@ -0,0 +1,57 @@ +## stackit beta cdn distribution update + +Update a CDN distribution + +### Synopsis + +Update a CDN distribution by its ID, allowing replacement of its regions. + +``` +stackit beta cdn distribution update [flags] +``` + +### Examples + +``` + update a CDN distribution with ID "123e4567-e89b-12d3-a456-426614174000" to not use optimizer + $ stackit beta cdn update 123e4567-e89b-12d3-a456-426614174000 --optimizer=false +``` + +### Options + +``` + --blocked-countries strings Comma-separated list of ISO 3166-1 alpha-2 country codes to block (e.g., 'US,DE,FR') + --blocked-ips strings Comma-separated list of IPv4 addresses to block (e.g., '10.0.0.8,127.0.0.1') + --bucket Use Object Storage backend + --bucket-credentials-access-key-id string Access Key ID for Object Storage backend + --bucket-region string Region for Object Storage backend + --bucket-url string Bucket URL for Object Storage backend + --default-cache-duration string ISO8601 duration string for default cache duration (e.g., 'PT1H30M' for 1 hour and 30 minutes) + -h, --help Help for "stackit beta cdn distribution update" + --http Use HTTP backend + --http-geofencing stringArray Geofencing rules for HTTP backend in the format 'https://example.com US,DE'. URL and countries have to be quoted. Repeatable. + --http-origin-request-headers strings Origin request headers for HTTP backend in the format 'HeaderName: HeaderValue', repeatable. WARNING: do not store sensitive values in the headers! + --http-origin-url string Origin URL for HTTP backend + --loki Enable Loki log sink for the CDN distribution + --loki-push-url string Push URL for log sink + --loki-username string Username for log sink + --monthly-limit-bytes int Monthly limit in bytes for the CDN distribution + --optimizer Enable optimizer for the CDN distribution (paid feature). + --regions strings Regions in which content should be cached, multiple of: ["EU" "US" "AF" "SA" "ASIA"] (default []) +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta cdn distribution](./stackit_beta_cdn_distribution.md) - Manage CDN distributions + diff --git a/docs/stackit_config_set.md b/docs/stackit_config_set.md index 8613d2a1d..c1f104958 100644 --- a/docs/stackit_config_set.md +++ b/docs/stackit_config_set.md @@ -31,6 +31,7 @@ stackit config set [flags] ``` --allowed-url-domain string Domain name, used for the verification of the URLs that are given in the custom identity provider endpoint and "STACKIT curl" command --authorization-custom-endpoint string Authorization API base URL, used in calls to this API + --cdn-custom-endpoint string CDN API base URL, used in calls to this API --dns-custom-endpoint string DNS API base URL, used in calls to this API --edge-custom-endpoint string Edge API base URL, used in calls to this API -h, --help Help for "stackit config set" diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 89c6116e0..4f0f7f229 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -29,6 +29,7 @@ stackit config unset [flags] --allowed-url-domain Domain name, used for the verification of the URLs that are given in the IDP endpoint and curl commands. If unset, defaults to stackit.cloud --async Configuration option to run commands asynchronously --authorization-custom-endpoint Authorization API base URL. If unset, uses the default base URL + --cdn-custom-endpoint Custom CDN endpoint URL. If unset, uses the default base URL --dns-custom-endpoint DNS API base URL. If unset, uses the default base URL --edge-custom-endpoint Edge API base URL. If unset, uses the default base URL -h, --help Help for "stackit config unset" diff --git a/go.mod b/go.mod index 3e2effedc..11590a48d 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.20.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 + github.com/stackitcloud/stackit-sdk-go/services/cdn v1.8.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 @@ -278,7 +279,7 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index d28aa738a..709f665a1 100644 --- a/go.sum +++ b/go.sum @@ -604,6 +604,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98e github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 h1:P24WoKPt14dfUiUJ4czIv+IiVmdCFQGrKgVtw23fxNg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.8.1 h1:CiOlfCsCDwHP0kas7qyhfp5XtL2kVmn9e4wjtc3LO10= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.8.1/go.mod h1:PyZ6g9JsGZZyeISAF+5E7L1lAlMnmbl2YbPj5Teu8to= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index 5bd94a17c..bf3bd4129 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -3,13 +3,14 @@ package beta import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -49,4 +50,5 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(intake.NewCmd(params)) cmd.AddCommand(kms.NewCmd(params)) cmd.AddCommand(logs.NewCmd(params)) + cmd.AddCommand(cdn.NewCmd(params)) } diff --git a/internal/cmd/beta/cdn/cdn.go b/internal/cmd/beta/cdn/cdn.go new file mode 100644 index 000000000..257633ef0 --- /dev/null +++ b/internal/cmd/beta/cdn/cdn.go @@ -0,0 +1,25 @@ +package cdn + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "cdn", + Short: "Manage CDN resources", + Long: "Manage the lifecycle of CDN resources.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(distribution.NewCommand(params)) +} diff --git a/internal/cmd/beta/cdn/distribution/create/create.go b/internal/cmd/beta/cdn/distribution/create/create.go new file mode 100644 index 000000000..19c5d3ca8 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/create/create.go @@ -0,0 +1,340 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/client" + cdnUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +const ( + flagRegion = "regions" + flagHTTP = "http" + flagHTTPOriginURL = "http-origin-url" + flagHTTPGeofencing = "http-geofencing" + flagHTTPOriginRequestHeaders = "http-origin-request-headers" + flagBucket = "bucket" + flagBucketURL = "bucket-url" + flagBucketCredentialsAccessKeyID = "bucket-credentials-access-key-id" //nolint:gosec // linter false positive + flagBucketRegion = "bucket-region" + flagBlockedCountries = "blocked-countries" + flagBlockedIPs = "blocked-ips" + flagDefaultCacheDuration = "default-cache-duration" + flagLoki = "loki" + flagLokiUsername = "loki-username" + flagLokiPushURL = "loki-push-url" + flagMonthlyLimitBytes = "monthly-limit-bytes" + flagOptimizer = "optimizer" +) + +type httpInputModel struct { + OriginURL string + Geofencing *map[string][]string + OriginRequestHeaders *map[string]string +} + +type bucketInputModel struct { + URL string + AccessKeyID string + Password string + Region string +} + +type lokiInputModel struct { + Username string + Password string + PushURL string +} + +type inputModel struct { + *globalflags.GlobalFlagModel + Regions []cdn.Region + HTTP *httpInputModel + Bucket *bucketInputModel + BlockedCountries []string + BlockedIPs []string + DefaultCacheDuration string + MonthlyLimitBytes *int64 + Loki *lokiInputModel + Optimizer bool +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Create a CDN distribution", + Long: "Create a CDN distribution for a given originUrl in multiple regions.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a CDN distribution with an HTTP backend`, + `$ stackit beta cdn distribution create --http --http-origin-url https://example.com \ +--regions AF,EU`, + ), + examples.NewExample( + `Create a CDN distribution with an Object Storage backend`, + `$ stackit beta cdn distribution create --bucket --bucket-url https://bucket.example.com \ +--bucket-credentials-access-key-id yyyy --bucket-region EU \ +--regions AF,EU`, + ), + examples.NewExample( + `Create a CDN distribution passing the password via stdin, take care that there's a '\n' at the end of the input'`, + `$ cat secret.txt | stackit beta cdn distribution create -y --project-id xxx \ +--bucket --bucket-url https://bucket.example.com --bucekt-credentials-access-key-id yyyy --bucket-region EU \ +--regions AF,EU`, + ), + ), + PreRun: func(cmd *cobra.Command, _ []string) { + // either flagHTTP or flagBucket must be set, depending on which we mark other flags as required + if flags.FlagToBoolValue(params.Printer, cmd, flagHTTP) { + err := cmd.MarkFlagRequired(flagHTTPOriginURL) + cobra.CheckErr(err) + } else { + err := flags.MarkFlagsRequired(cmd, flagBucketURL, flagBucketCredentialsAccessKeyID, flagBucketRegion) + cobra.CheckErr(err) + } + // if user uses loki, mark related flags as required + if flags.FlagToBoolValue(params.Printer, cmd, flagLoki) { + err := flags.MarkFlagsRequired(cmd, flagLokiUsername, flagLokiPushURL) + cobra.CheckErr(err) + } + }, + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + if model.Bucket != nil { + pw, err := params.Printer.PromptForPassword("enter your secret access key for the object storage bucket: ") + if err != nil { + return fmt.Errorf("reading secret access key: %w", err) + } + model.Bucket.Password = pw + } + if model.Loki != nil { + pw, err := params.Printer.PromptForPassword("enter your password for the loki log sink: ") + if err != nil { + return fmt.Errorf("reading loki password: %w", err) + } + model.Loki.Password = pw + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to create a CDN distribution for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create CDN distribution: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.EnumSliceFlag(false, []string{}, sdkUtils.EnumSliceToStringSlice(cdn.AllowedRegionEnumValues)...), flagRegion, fmt.Sprintf("Regions in which content should be cached, multiple of: %q", cdn.AllowedRegionEnumValues)) + cmd.Flags().Bool(flagHTTP, false, "Use HTTP backend") + cmd.Flags().String(flagHTTPOriginURL, "", "Origin URL for HTTP backend") + cmd.Flags().StringSlice(flagHTTPOriginRequestHeaders, []string{}, "Origin request headers for HTTP backend in the format 'HeaderName: HeaderValue', repeatable. WARNING: do not store sensitive values in the headers!") + cmd.Flags().StringArray(flagHTTPGeofencing, []string{}, "Geofencing rules for HTTP backend in the format 'https://example.com US,DE'. URL and countries have to be quoted. Repeatable.") + cmd.Flags().Bool(flagBucket, false, "Use Object Storage backend") + cmd.Flags().String(flagBucketURL, "", "Bucket URL for Object Storage backend") + cmd.Flags().String(flagBucketCredentialsAccessKeyID, "", "Access Key ID for Object Storage backend") + cmd.Flags().String(flagBucketRegion, "", "Region for Object Storage backend") + cmd.Flags().StringSlice(flagBlockedCountries, []string{}, "Comma-separated list of ISO 3166-1 alpha-2 country codes to block (e.g., 'US,DE,FR')") + cmd.Flags().StringSlice(flagBlockedIPs, []string{}, "Comma-separated list of IPv4 addresses to block (e.g., '10.0.0.8,127.0.0.1')") + cmd.Flags().String(flagDefaultCacheDuration, "", "ISO8601 duration string for default cache duration (e.g., 'PT1H30M' for 1 hour and 30 minutes)") + cmd.Flags().Bool(flagLoki, false, "Enable Loki log sink for the CDN distribution") + cmd.Flags().String(flagLokiUsername, "", "Username for log sink") + cmd.Flags().String(flagLokiPushURL, "", "Push URL for log sink") + cmd.Flags().Int64(flagMonthlyLimitBytes, 0, "Monthly limit in bytes for the CDN distribution") + cmd.Flags().Bool(flagOptimizer, false, "Enable optimizer for the CDN distribution (paid feature).") + cmd.MarkFlagsMutuallyExclusive(flagHTTP, flagBucket) + cmd.MarkFlagsOneRequired(flagHTTP, flagBucket) + err := flags.MarkFlagsRequired(cmd, flagRegion) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + regionStrings := flags.FlagToStringSliceValue(p, cmd, flagRegion) + regions := make([]cdn.Region, 0, len(regionStrings)) + for _, regionStr := range regionStrings { + regions = append(regions, cdn.Region(regionStr)) + } + + var http *httpInputModel + if flags.FlagToBoolValue(p, cmd, flagHTTP) { + originURL := flags.FlagToStringValue(p, cmd, flagHTTPOriginURL) + + var geofencing *map[string][]string + geofencingInput := flags.FlagToStringArrayValue(p, cmd, flagHTTPGeofencing) + if geofencingInput != nil { + geofencing = cdnUtils.ParseGeofencing(p, geofencingInput) + } + + var originRequestHeaders *map[string]string + originRequestHeadersInput := flags.FlagToStringSliceValue(p, cmd, flagHTTPOriginRequestHeaders) + if originRequestHeadersInput != nil { + originRequestHeaders = cdnUtils.ParseOriginRequestHeaders(p, originRequestHeadersInput) + } + + http = &httpInputModel{ + OriginURL: originURL, + Geofencing: geofencing, + OriginRequestHeaders: originRequestHeaders, + } + } + + var bucket *bucketInputModel + if flags.FlagToBoolValue(p, cmd, flagBucket) { + bucketURL := flags.FlagToStringValue(p, cmd, flagBucketURL) + accessKeyID := flags.FlagToStringValue(p, cmd, flagBucketCredentialsAccessKeyID) + region := flags.FlagToStringValue(p, cmd, flagBucketRegion) + + bucket = &bucketInputModel{ + URL: bucketURL, + AccessKeyID: accessKeyID, + Password: "", + Region: region, + } + } + + blockedCountries := flags.FlagToStringSliceValue(p, cmd, flagBlockedCountries) + blockedIPs := flags.FlagToStringSliceValue(p, cmd, flagBlockedIPs) + cacheDuration := flags.FlagToStringValue(p, cmd, flagDefaultCacheDuration) + monthlyLimit := flags.FlagToInt64Pointer(p, cmd, flagMonthlyLimitBytes) + + var loki *lokiInputModel + if flags.FlagToBoolValue(p, cmd, flagLoki) { + loki = &lokiInputModel{ + Username: flags.FlagToStringValue(p, cmd, flagLokiUsername), + PushURL: flags.FlagToStringValue(p, cmd, flagLokiPushURL), + Password: "", + } + } + + optimizer := flags.FlagToBoolValue(p, cmd, flagOptimizer) + + model := inputModel{ + GlobalFlagModel: globalFlags, + Regions: regions, + HTTP: http, + Bucket: bucket, + BlockedCountries: blockedCountries, + BlockedIPs: blockedIPs, + DefaultCacheDuration: cacheDuration, + MonthlyLimitBytes: monthlyLimit, + Loki: loki, + Optimizer: optimizer, + } + + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *cdn.APIClient) cdn.ApiCreateDistributionRequest { + req := apiClient.CreateDistribution(ctx, model.ProjectId) + var backend cdn.CreateDistributionPayloadGetBackendArgType + if model.HTTP != nil { + backend = cdn.CreateDistributionPayloadGetBackendArgType{ + HttpBackendCreate: &cdn.HttpBackendCreate{ + Geofencing: model.HTTP.Geofencing, + OriginRequestHeaders: model.HTTP.OriginRequestHeaders, + OriginUrl: &model.HTTP.OriginURL, + Type: utils.Ptr("http"), + }, + } + } else { + backend = cdn.CreateDistributionPayloadGetBackendArgType{ + BucketBackendCreate: &cdn.BucketBackendCreate{ + BucketUrl: &model.Bucket.URL, + Credentials: cdn.NewBucketCredentials( + model.Bucket.AccessKeyID, + model.Bucket.Password, + ), + Region: &model.Bucket.Region, + Type: utils.Ptr("bucket"), + }, + } + } + + payload := cdn.NewCreateDistributionPayload( + backend, + model.Regions, + ) + if len(model.BlockedCountries) > 0 { + payload.BlockedCountries = &model.BlockedCountries + } + if len(model.BlockedIPs) > 0 { + payload.BlockedIps = &model.BlockedIPs + } + if model.DefaultCacheDuration != "" { + payload.DefaultCacheDuration = utils.Ptr(model.DefaultCacheDuration) + } + if model.Loki != nil { + payload.LogSink = &cdn.CreateDistributionPayloadGetLogSinkArgType{ + LokiLogSinkCreate: &cdn.LokiLogSinkCreate{ + Credentials: &cdn.LokiLogSinkCredentials{ + Password: &model.Loki.Password, + Username: &model.Loki.Username, + }, + PushUrl: &model.Loki.PushURL, + Type: utils.Ptr("loki"), + }, + } + } + payload.MonthlyLimitBytes = model.MonthlyLimitBytes + if model.Optimizer { + payload.Optimizer = &cdn.CreateDistributionPayloadGetOptimizerArgType{ + Enabled: utils.Ptr(true), + } + } + return req.CreateDistributionPayload(*payload) +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, resp *cdn.CreateDistributionResponse) error { + if resp == nil { + return fmt.Errorf("create distribution response is nil") + } + return p.OutputResult(outputFormat, resp, func() error { + p.Outputf("Created CDN distribution for %q. ID: %s\n", projectLabel, utils.PtrString(resp.Distribution.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/cdn/distribution/create/create_test.go b/internal/cmd/beta/cdn/distribution/create/create_test.go new file mode 100644 index 000000000..4276f34a7 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/create/create_test.go @@ -0,0 +1,542 @@ +package create + +import ( + "bytes" + "context" + "fmt" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "k8s.io/utils/ptr" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &cdn.APIClient{} +var testProjectId = uuid.NewString() + +const testRegions = cdn.REGION_EU + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + flagRegion: string(testRegions), + } + flagsHTTPBackend()(flagValues) + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func flagsHTTPBackend() func(flagValues map[string]string) { + return func(flagValues map[string]string) { + delete(flagValues, flagBucket) + flagValues[flagHTTP] = "true" + flagValues[flagHTTPOriginURL] = "https://http-backend.example.com" + } +} + +func flagsBucketBackend() func(flagValues map[string]string) { + return func(flagValues map[string]string) { + delete(flagValues, flagHTTP) + flagValues[flagBucket] = "true" + flagValues[flagBucketURL] = "https://bucket-backend.example.com" + flagValues[flagBucketCredentialsAccessKeyID] = "access-key-id" + flagValues[flagBucketRegion] = "eu" + } +} + +func flagsLoki() func(flagValues map[string]string) { + return func(flagValues map[string]string) { + flagValues[flagLoki] = "true" + flagValues[flagLokiPushURL] = "https://loki.example.com" + flagValues[flagLokiUsername] = "loki-user" + } +} + +func flagRegions(regions ...cdn.Region) func(flagValues map[string]string) { + return func(flagValues map[string]string) { + if len(regions) == 0 { + delete(flagValues, flagRegion) + return + } + stringRegions := sdkUtils.EnumSliceToStringSlice(regions) + flagValues[flagRegion] = strings.Join(stringRegions, ",") + } +} + +func fixtureModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + Regions: []cdn.Region{testRegions}, + } + modelHTTPBackend()(model) + for _, mod := range mods { + mod(model) + } + return model +} + +func modelRegions(regions ...cdn.Region) func(model *inputModel) { + return func(model *inputModel) { + model.Regions = regions + } +} + +func modelHTTPBackend() func(model *inputModel) { + return func(model *inputModel) { + model.Bucket = nil + model.HTTP = &httpInputModel{ + OriginURL: "https://http-backend.example.com", + } + } +} + +func modelBucketBackend() func(model *inputModel) { + return func(model *inputModel) { + model.HTTP = nil + model.Bucket = &bucketInputModel{ + URL: "https://bucket-backend.example.com", + AccessKeyID: "access-key-id", + Region: "eu", + } + } +} + +func modelLoki() func(model *inputModel) { + return func(model *inputModel) { + model.Loki = &lokiInputModel{ + PushURL: "https://loki.example.com", + Username: "loki-user", + } + } +} + +func fixturePayload(mods ...func(payload *cdn.CreateDistributionPayload)) cdn.CreateDistributionPayload { + payload := *cdn.NewCreateDistributionPayload( + cdn.CreateDistributionPayloadGetBackendArgType{ + HttpBackendCreate: &cdn.HttpBackendCreate{ + Type: utils.Ptr("http"), + OriginUrl: utils.Ptr("https://http-backend.example.com"), + }, + }, + []cdn.Region{testRegions}, + ) + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func payloadRegions(regions ...cdn.Region) func(payload *cdn.CreateDistributionPayload) { + return func(payload *cdn.CreateDistributionPayload) { + payload.Regions = ®ions + } +} + +func payloadBucketBackend() func(payload *cdn.CreateDistributionPayload) { + return func(payload *cdn.CreateDistributionPayload) { + payload.Backend = &cdn.CreateDistributionPayloadGetBackendArgType{ + BucketBackendCreate: &cdn.BucketBackendCreate{ + Type: utils.Ptr("bucket"), + BucketUrl: utils.Ptr("https://bucket-backend.example.com"), + Region: utils.Ptr("eu"), + Credentials: cdn.NewBucketCredentials( + "access-key-id", + "", + ), + }, + } + } +} + +func payloadLoki() func(payload *cdn.CreateDistributionPayload) { + return func(payload *cdn.CreateDistributionPayload) { + payload.LogSink = &cdn.CreateDistributionPayloadGetLogSinkArgType{ + LokiLogSinkCreate: &cdn.LokiLogSinkCreate{ + Type: utils.Ptr("loki"), + PushUrl: utils.Ptr("https://loki.example.com"), + Credentials: cdn.NewLokiLogSinkCredentials("", "loki-user"), + }, + } + } +} + +func fixtureRequest(mods ...func(payload *cdn.CreateDistributionPayload)) cdn.ApiCreateDistributionRequest { + req := testClient.CreateDistribution(testCtx, testProjectId) + req = req.CreateDistributionPayload(fixturePayload(mods...)) + return req +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expected *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expected: fixtureModel(), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "regions missing", + flagValues: fixtureFlagValues(flagRegions()), + isValid: false, + }, + { + description: "multiple regions", + flagValues: fixtureFlagValues(flagRegions(cdn.REGION_EU, cdn.REGION_AF)), + isValid: true, + expected: fixtureModel(modelRegions(cdn.REGION_EU, cdn.REGION_AF)), + }, + { + description: "bucket backend", + flagValues: fixtureFlagValues(flagsBucketBackend()), + isValid: true, + expected: fixtureModel(modelBucketBackend()), + }, + { + description: "bucket backend missing url", + flagValues: fixtureFlagValues( + flagsBucketBackend(), + func(flagValues map[string]string) { + delete(flagValues, flagBucketURL) + }, + ), + isValid: false, + }, + { + description: "bucket backend missing access key id", + flagValues: fixtureFlagValues( + flagsBucketBackend(), + func(flagValues map[string]string) { + delete(flagValues, flagBucketCredentialsAccessKeyID) + }, + ), + isValid: false, + }, + { + description: "bucket backend missing region", + flagValues: fixtureFlagValues( + flagsBucketBackend(), + func(flagValues map[string]string) { + delete(flagValues, flagBucketRegion) + }, + ), + isValid: false, + }, + { + description: "http backend missing url", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + delete(flagValues, flagHTTPOriginURL) + }, + ), + isValid: false, + }, + { + description: "http backend with geofencing", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagHTTPGeofencing] = "https://dach.example.com DE,AT,CH" + }, + ), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.HTTP.Geofencing = &map[string][]string{ + "https://dach.example.com": {"DE", "AT", "CH"}, + } + }, + ), + }, + { + description: "http backend with origin request headers", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagHTTPOriginRequestHeaders] = "X-Custom-Header:Value1,X-Another-Header:Value2" + }, + ), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.HTTP.OriginRequestHeaders = &map[string]string{ + "X-Custom-Header": "Value1", + "X-Another-Header": "Value2", + } + }, + ), + }, + { + description: "with blocked countries", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagBlockedCountries] = "DE,AT" + }), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.BlockedCountries = []string{"DE", "AT"} + }, + ), + }, + { + description: "with blocked IPs", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagBlockedIPs] = "127.0.0.1,10.0.0.8" + }), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.BlockedIPs = []string{"127.0.0.1", "10.0.0.8"} + }), + }, + { + description: "with default cache duration", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagDefaultCacheDuration] = "PT1H30M" + }), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.DefaultCacheDuration = "PT1H30M" + }), + }, + { + description: "with optimizer", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagOptimizer] = "true" + }), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.Optimizer = true + }), + }, + { + description: "with loki", + flagValues: fixtureFlagValues( + flagsLoki(), + ), + isValid: true, + expected: fixtureModel( + modelLoki(), + ), + }, + { + description: "loki with missing username", + flagValues: fixtureFlagValues( + flagsLoki(), + func(flagValues map[string]string) { + delete(flagValues, flagLokiUsername) + }, + ), + isValid: false, + }, + { + description: "loki with missing push url", + flagValues: fixtureFlagValues( + flagsLoki(), + func(flagValues map[string]string) { + delete(flagValues, flagLokiPushURL) + }, + ), + isValid: false, + }, + { + description: "with monthly limit bytes", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagMonthlyLimitBytes] = "1073741824" // 1 GiB + }), + isValid: true, + expected: fixtureModel( + func(model *inputModel) { + model.MonthlyLimitBytes = ptr.To[int64](1073741824) + }), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expected, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expected cdn.ApiCreateDistributionRequest + }{ + { + description: "base", + model: fixtureModel(), + expected: fixtureRequest(), + }, + { + description: "multiple regions", + model: fixtureModel(modelRegions(cdn.REGION_AF, cdn.REGION_EU)), + expected: fixtureRequest(payloadRegions(cdn.REGION_AF, cdn.REGION_EU)), + }, + { + description: "bucket backend", + model: fixtureModel(modelBucketBackend()), + expected: fixtureRequest(payloadBucketBackend()), + }, + { + description: "http backend with geofencing and origin request headers", + model: fixtureModel( + func(model *inputModel) { + model.HTTP.Geofencing = &map[string][]string{ + "https://dach.example.com": {"DE", "AT", "CH"}, + } + model.HTTP.OriginRequestHeaders = &map[string]string{ + "X-Custom-Header": "Value1", + "X-Another-Header": "Value2", + } + }, + ), + expected: fixtureRequest( + func(payload *cdn.CreateDistributionPayload) { + payload.Backend.HttpBackendCreate.Geofencing = &map[string][]string{ + "https://dach.example.com": {"DE", "AT", "CH"}, + } + payload.Backend.HttpBackendCreate.OriginRequestHeaders = &map[string]string{ + "X-Custom-Header": "Value1", + "X-Another-Header": "Value2", + } + }, + ), + }, + { + description: "with full options", + model: fixtureModel( + func(model *inputModel) { + model.MonthlyLimitBytes = ptr.To[int64](5368709120) // 5 GiB + model.Optimizer = true + model.BlockedCountries = []string{"DE", "AT"} + model.BlockedIPs = []string{"127.0.0.1"} + model.DefaultCacheDuration = "PT2H" + }, + ), + expected: fixtureRequest( + func(payload *cdn.CreateDistributionPayload) { + payload.MonthlyLimitBytes = utils.Ptr[int64](5368709120) + payload.Optimizer = &cdn.CreateDistributionPayloadGetOptimizerArgType{ + Enabled: utils.Ptr(true), + } + payload.BlockedCountries = &[]string{"DE", "AT"} + payload.BlockedIps = &[]string{"127.0.0.1"} + payload.DefaultCacheDuration = utils.Ptr("PT2H") + }, + ), + }, + { + description: "loki", + model: fixtureModel( + modelLoki(), + ), + expected: fixtureRequest(payloadLoki()), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expected, + cmp.AllowUnexported(tt.expected), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + outputFormat string + response *cdn.CreateDistributionResponse + expected string + wantErr bool + }{ + { + description: "nil response", + outputFormat: "table", + response: nil, + wantErr: true, + }, + { + description: "table output", + outputFormat: "table", + response: &cdn.CreateDistributionResponse{ + Distribution: &cdn.Distribution{ + Id: ptr.To("dist-1234"), + }, + }, + expected: fmt.Sprintf("Created CDN distribution for %q. ID: dist-1234\n", testProjectId), + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + buffer := &bytes.Buffer{} + p.Cmd.SetOut(buffer) + if err := outputResult(p, tt.outputFormat, testProjectId, tt.response); (err != nil) != tt.wantErr { + t.Fatalf("outputResult: %v", err) + } + if buffer.String() != tt.expected { + t.Errorf("want:\n%s\ngot:\n%s", tt.expected, buffer.String()) + } + }) + } +} diff --git a/internal/cmd/beta/cdn/distribution/delete/delete.go b/internal/cmd/beta/cdn/distribution/delete/delete.go new file mode 100644 index 000000000..78baebdc4 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/delete/delete.go @@ -0,0 +1,92 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +const argDistributionID = "DISTRIBUTION_ID" + +type inputModel struct { + *globalflags.GlobalFlagModel + DistributionID string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete", + Short: "Delete a CDN distribution", + Long: "Delete a CDN distribution by its ID.", + Args: args.SingleArg(argDistributionID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a CDN distribution with ID "xxx"`, + `$ stackit beta cdn distribution delete xxx`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to delete the CDN distribution %q for project %q?", model.DistributionID, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + _, err = req.Execute() + if err != nil { + return fmt.Errorf("delete loadbalancer: %w", err) + } + + params.Printer.Outputf("CDN distribution %q deleted.\n", model.DistributionID) + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + distributionID := inputArgs[0] + model := inputModel{ + GlobalFlagModel: globalFlags, + DistributionID: distributionID, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *cdn.APIClient) cdn.ApiDeleteDistributionRequest { + return apiClient.DeleteDistribution(ctx, model.ProjectId, model.DistributionID) +} diff --git a/internal/cmd/beta/cdn/distribution/delete/delete_test.go b/internal/cmd/beta/cdn/distribution/delete/delete_test.go new file mode 100644 index 000000000..03ec87f46 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/delete/delete_test.go @@ -0,0 +1,130 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "test") + testProjectId = uuid.NewString() + testClient = &cdn.APIClient{} + testDistributionID = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argVales []string)) []string { + argVales := []string{ + testDistributionID, + } + for _, m := range mods { + m(argVales) + } + return argVales +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, m := range mods { + m(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + }, + DistributionID: testDistributionID, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *cdn.ApiDeleteDistributionRequest)) cdn.ApiDeleteDistributionRequest { + request := testClient.DeleteDistribution(testCtx, testProjectId, testDistributionID) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argsValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argsValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argsValues: []string{}, + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + }, + isValid: false, + }, + { + description: "no arg values", + argsValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argsValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedResult cdn.ApiDeleteDistributionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedResult: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedResult, + cmp.AllowUnexported(tt.expectedResult), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/cdn/distribution/describe/describe.go b/internal/cmd/beta/cdn/distribution/describe/describe.go new file mode 100644 index 000000000..9d4897f72 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/describe/describe.go @@ -0,0 +1,219 @@ +package describe + +import ( + "context" + "fmt" + "slices" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +const distributionIDArg = "DISTRIBUTION_ID_ARG" +const flagWithWaf = "with-waf" + +type inputModel struct { + *globalflags.GlobalFlagModel + DistributionID string + WithWAF bool +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "describe", + Short: "Describe a CDN distribution", + Long: "Describe a CDN distribution by its ID.", + Args: args.SingleArg(distributionIDArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of a CDN distribution with ID "xxx"`, + `$ stackit beta cdn distribution describe xxx`, + ), + examples.NewExample( + `Get details of a CDN, including WAF details, for ID "xxx"`, + `$ stackit beta cdn distribution describe xxx --with-waf`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("read distribution: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Bool(flagWithWaf, false, "Include WAF details in the distribution description") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := &inputModel{ + GlobalFlagModel: globalFlags, + DistributionID: inputArgs[0], + WithWAF: flags.FlagToBoolValue(p, cmd, flagWithWaf), + } + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *cdn.APIClient) cdn.ApiGetDistributionRequest { + return apiClient.GetDistribution(ctx, model.ProjectId, model.DistributionID).WithWafStatus(model.WithWAF) +} + +func outputResult(p *print.Printer, outputFormat string, distribution *cdn.GetDistributionResponse) error { + if distribution == nil { + return fmt.Errorf("distribution response is empty") + } + return p.OutputResult(outputFormat, distribution, func() error { + d := distribution.Distribution + var content []tables.Table + + content = append(content, buildDistributionTable(d)) + + if d.Waf != nil { + content = append(content, buildWAFTable(d)) + } + + err := tables.DisplayTables(p, content) + if err != nil { + return fmt.Errorf("display table: %w", err) + } + return nil + }) +} + +func buildDistributionTable(d *cdn.Distribution) tables.Table { + regions := strings.Join(sdkUtils.EnumSliceToStringSlice(*d.Config.Regions), ", ") + defaultCacheDuration := "" + if d.Config.DefaultCacheDuration != nil && d.Config.DefaultCacheDuration.IsSet() { + defaultCacheDuration = *d.Config.DefaultCacheDuration.Get() + } + logSinkPushUrl := "" + if d.Config.LogSink != nil && d.Config.LogSink.LokiLogSink != nil { + logSinkPushUrl = *d.Config.LogSink.LokiLogSink.PushUrl + } + monthlyLimitBytes := "" + if d.Config.MonthlyLimitBytes != nil { + monthlyLimitBytes = fmt.Sprintf("%d", *d.Config.MonthlyLimitBytes) + } + optimizerEnabled := "" + if d.Config.Optimizer != nil { + optimizerEnabled = fmt.Sprintf("%t", *d.Config.Optimizer.Enabled) + } + table := tables.NewTable() + table.SetTitle("Distribution") + table.AddRow("ID", utils.PtrString(d.Id)) + table.AddSeparator() + table.AddRow("STATUS", utils.PtrString(d.Status)) + table.AddSeparator() + table.AddRow("REGIONS", regions) + table.AddSeparator() + table.AddRow("CREATED AT", utils.PtrString(d.CreatedAt)) + table.AddSeparator() + table.AddRow("UPDATED AT", utils.PtrString(d.UpdatedAt)) + table.AddSeparator() + table.AddRow("PROJECT ID", utils.PtrString(d.ProjectId)) + table.AddSeparator() + if d.Errors != nil && len(*d.Errors) > 0 { + var errorDescriptions []string + for _, err := range *d.Errors { + errorDescriptions = append(errorDescriptions, *err.En) + } + table.AddRow("ERRORS", strings.Join(errorDescriptions, "\n")) + table.AddSeparator() + } + if d.Config.Backend.BucketBackend != nil { + b := d.Config.Backend.BucketBackend + table.AddRow("BACKEND TYPE", "BUCKET") + table.AddSeparator() + table.AddRow("BUCKET URL", utils.PtrString(b.BucketUrl)) + table.AddSeparator() + table.AddRow("BUCKET REGION", utils.PtrString(b.Region)) + table.AddSeparator() + } else if d.Config.Backend.HttpBackend != nil { + h := d.Config.Backend.HttpBackend + var geofencing []string + if h.Geofencing != nil { + for k, v := range *h.Geofencing { + geofencing = append(geofencing, fmt.Sprintf("%s: %s", k, strings.Join(v, ", "))) + } + } + slices.Sort(geofencing) + table.AddRow("BACKEND TYPE", "HTTP") + table.AddSeparator() + table.AddRow("HTTP ORIGIN URL", utils.PtrString(h.OriginUrl)) + table.AddSeparator() + if h.OriginRequestHeaders != nil { + table.AddRow("HTTP ORIGIN REQUEST HEADERS", utils.JoinStringMap(*h.OriginRequestHeaders, ": ", ", ")) + table.AddSeparator() + } + table.AddRow("HTTP GEOFENCING PROPERTIES", strings.Join(geofencing, "\n")) + table.AddSeparator() + } + table.AddRow("BLOCKED COUNTRIES", strings.Join(*d.Config.BlockedCountries, ", ")) + table.AddSeparator() + table.AddRow("BLOCKED IPS", strings.Join(*d.Config.BlockedIps, ", ")) + table.AddSeparator() + table.AddRow("DEFAULT CACHE DURATION", defaultCacheDuration) + table.AddSeparator() + table.AddRow("LOG SINK PUSH URL", logSinkPushUrl) + table.AddSeparator() + table.AddRow("MONTHLY LIMIT (BYTES)", monthlyLimitBytes) + table.AddSeparator() + table.AddRow("OPTIMIZER ENABLED", optimizerEnabled) + table.AddSeparator() + return table +} + +func buildWAFTable(d *cdn.Distribution) tables.Table { + table := tables.NewTable() + table.SetTitle("WAF") + for _, disabled := range *d.Waf.DisabledRules { + table.AddRow("DISABLED RULE ID", utils.PtrString(disabled.Id)) + table.AddSeparator() + } + for _, enabled := range *d.Waf.EnabledRules { + table.AddRow("ENABLED RULE ID", utils.PtrString(enabled.Id)) + table.AddSeparator() + } + for _, logOnly := range *d.Waf.LogOnlyRules { + table.AddRow("LOG-ONLY RULE ID", utils.PtrString(logOnly.Id)) + table.AddSeparator() + } + return table +} diff --git a/internal/cmd/beta/cdn/distribution/describe/describe_test.go b/internal/cmd/beta/cdn/distribution/describe/describe_test.go new file mode 100644 index 000000000..78037f8d1 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/describe/describe_test.go @@ -0,0 +1,409 @@ +package describe + +import ( + "bytes" + "context" + "fmt" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "test") + testProjectID = uuid.NewString() + testDistributionID = uuid.NewString() + testClient = &cdn.APIClient{} + testTime = time.Time{} +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectID, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectID, + Verbosity: globalflags.VerbosityDefault, + }, + DistributionID: testDistributionID, + WithWAF: false, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureResponse(mods ...func(resp *cdn.GetDistributionResponse)) *cdn.GetDistributionResponse { + response := &cdn.GetDistributionResponse{ + Distribution: &cdn.Distribution{ + Config: &cdn.Config{ + Backend: &cdn.ConfigBackend{ + BucketBackend: &cdn.BucketBackend{ + BucketUrl: utils.Ptr("https://example.com"), + Region: utils.Ptr("eu"), + Type: utils.Ptr("bucket"), + }, + }, + BlockedCountries: utils.Ptr([]string{}), + BlockedIps: utils.Ptr([]string{}), + DefaultCacheDuration: nil, + LogSink: nil, + MonthlyLimitBytes: nil, + Optimizer: nil, + Regions: &[]cdn.Region{cdn.REGION_EU}, + Waf: nil, + }, + CreatedAt: utils.Ptr(testTime), + Domains: &[]cdn.Domain{}, + Errors: nil, + Id: utils.Ptr(testDistributionID), + ProjectId: utils.Ptr(testProjectID), + Status: utils.Ptr(cdn.DISTRIBUTIONSTATUS_ACTIVE), + UpdatedAt: utils.Ptr(testTime), + Waf: nil, + }, + } + for _, mod := range mods { + mod(response) + } + return response +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + args []string + flags map[string]string + isValid bool + expected *inputModel + }{ + { + description: "base", + args: []string{testDistributionID}, + flags: fixtureFlagValues(), + isValid: true, + expected: fixtureInputModel(), + }, + { + description: "no args", + args: []string{}, + flags: fixtureFlagValues(), + isValid: false, + }, + { + description: "invalid distribution id", + args: []string{"invalid-uuid"}, + flags: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing project id", + args: []string{testDistributionID}, + flags: map[string]string{}, + isValid: false, + }, + { + description: "invalid project id", + args: []string{testDistributionID}, + flags: map[string]string{ + globalflags.ProjectIdFlag: "invalid-uuid", + }, + isValid: false, + }, + { + description: "with WAF", + args: []string{testDistributionID}, + flags: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[flagWithWaf] = "true" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.WithWAF = true + }), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expected, tt.args, tt.flags, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expected cdn.ApiGetDistributionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expected: testClient.GetDistribution(testCtx, testProjectID, testDistributionID).WithWafStatus(false), + }, + { + description: "with WAF", + model: fixtureInputModel(func(model *inputModel) { + model.WithWAF = true + }), + expected: testClient.GetDistribution(testCtx, testProjectID, testDistributionID).WithWafStatus(true), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(got, tt.expected, + cmp.AllowUnexported(tt.expected), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + format string + distribution *cdn.GetDistributionResponse + wantErr bool + expected string + }{ + { + description: "empty", + format: "table", + wantErr: true, + }, + { + description: "no errors", + format: "table", + distribution: fixtureResponse(), + //nolint:staticcheck //you can't use escape sequences in ``-string-literals + expected: fmt.Sprintf(` + Distribution  + ID │ %-37s +────────────────────────┼────────────────────────────────────── + STATUS │ ACTIVE +────────────────────────┼────────────────────────────────────── + REGIONS │ EU +────────────────────────┼────────────────────────────────────── + CREATED AT │ %-37s +────────────────────────┼────────────────────────────────────── + UPDATED AT │ %-37s +────────────────────────┼────────────────────────────────────── + PROJECT ID │ %-37s +────────────────────────┼────────────────────────────────────── + BACKEND TYPE │ BUCKET +────────────────────────┼────────────────────────────────────── + BUCKET URL │ https://example.com +────────────────────────┼────────────────────────────────────── + BUCKET REGION │ eu +────────────────────────┼────────────────────────────────────── + BLOCKED COUNTRIES │ +────────────────────────┼────────────────────────────────────── + BLOCKED IPS │ +────────────────────────┼────────────────────────────────────── + DEFAULT CACHE DURATION │ +────────────────────────┼────────────────────────────────────── + LOG SINK PUSH URL │ +────────────────────────┼────────────────────────────────────── + MONTHLY LIMIT (BYTES) │ +────────────────────────┼────────────────────────────────────── + OPTIMIZER ENABLED │ + +`, + testDistributionID, + testTime, + testTime, + testProjectID), + }, + { + description: "with errors", + format: "table", + distribution: fixtureResponse( + func(r *cdn.GetDistributionResponse) { + r.Distribution.Errors = &[]cdn.StatusError{ + { + En: utils.Ptr("First error message"), + }, + { + En: utils.Ptr("Second error message"), + }, + } + }, + ), + //nolint:staticcheck //you can't use escape sequences in ``-string-literals + expected: fmt.Sprintf(` + Distribution  + ID │ %-37s +────────────────────────┼────────────────────────────────────── + STATUS │ ACTIVE +────────────────────────┼────────────────────────────────────── + REGIONS │ EU +────────────────────────┼────────────────────────────────────── + CREATED AT │ %-37s +────────────────────────┼────────────────────────────────────── + UPDATED AT │ %-37s +────────────────────────┼────────────────────────────────────── + PROJECT ID │ %-37s +────────────────────────┼────────────────────────────────────── + ERRORS │ First error message + │ Second error message +────────────────────────┼────────────────────────────────────── + BACKEND TYPE │ BUCKET +────────────────────────┼────────────────────────────────────── + BUCKET URL │ https://example.com +────────────────────────┼────────────────────────────────────── + BUCKET REGION │ eu +────────────────────────┼────────────────────────────────────── + BLOCKED COUNTRIES │ +────────────────────────┼────────────────────────────────────── + BLOCKED IPS │ +────────────────────────┼────────────────────────────────────── + DEFAULT CACHE DURATION │ +────────────────────────┼────────────────────────────────────── + LOG SINK PUSH URL │ +────────────────────────┼────────────────────────────────────── + MONTHLY LIMIT (BYTES) │ +────────────────────────┼────────────────────────────────────── + OPTIMIZER ENABLED │ + +`, testDistributionID, + testTime, + testTime, + testProjectID), + }, + { + description: "full", + format: "table", + distribution: fixtureResponse( + func(r *cdn.GetDistributionResponse) { + r.Distribution.Waf = &cdn.DistributionWaf{ + EnabledRules: &[]cdn.WafStatusRuleBlock{ + {Id: utils.Ptr("rule-id-1")}, + {Id: utils.Ptr("rule-id-2")}, + }, + DisabledRules: &[]cdn.WafStatusRuleBlock{ + {Id: utils.Ptr("rule-id-3")}, + {Id: utils.Ptr("rule-id-4")}, + }, + LogOnlyRules: &[]cdn.WafStatusRuleBlock{ + {Id: utils.Ptr("rule-id-5")}, + {Id: utils.Ptr("rule-id-6")}, + }, + } + r.Distribution.Config.Backend = &cdn.ConfigBackend{ + HttpBackend: &cdn.HttpBackend{ + OriginUrl: utils.Ptr("https://origin.example.com"), + OriginRequestHeaders: &map[string]string{ + "X-Custom-Header": "CustomValue", + }, + Geofencing: &map[string][]string{ + "origin1.example.com": {"US", "CA"}, + "origin2.example.com": {"FR", "DE"}, + }, + }, + } + r.Distribution.Config.BlockedCountries = &[]string{"US", "CN"} + r.Distribution.Config.BlockedIps = &[]string{"127.0.0.1"} + r.Distribution.Config.DefaultCacheDuration = cdn.NewNullableString(utils.Ptr("P1DT2H30M")) + r.Distribution.Config.LogSink = &cdn.ConfigLogSink{ + LokiLogSink: &cdn.LokiLogSink{ + PushUrl: utils.Ptr("https://logs.example.com"), + }, + } + r.Distribution.Config.MonthlyLimitBytes = utils.Ptr(int64(104857600)) + r.Distribution.Config.Optimizer = &cdn.Optimizer{ + Enabled: utils.Ptr(true), + } + }), + //nolint:staticcheck //you can't use escape sequences in ``-string-literals + expected: fmt.Sprintf(` + Distribution  + ID │ %-37s +─────────────────────────────┼────────────────────────────────────── + STATUS │ ACTIVE +─────────────────────────────┼────────────────────────────────────── + REGIONS │ EU +─────────────────────────────┼────────────────────────────────────── + CREATED AT │ %-37s +─────────────────────────────┼────────────────────────────────────── + UPDATED AT │ %-37s +─────────────────────────────┼────────────────────────────────────── + PROJECT ID │ %-37s +─────────────────────────────┼────────────────────────────────────── + BACKEND TYPE │ HTTP +─────────────────────────────┼────────────────────────────────────── + HTTP ORIGIN URL │ https://origin.example.com +─────────────────────────────┼────────────────────────────────────── + HTTP ORIGIN REQUEST HEADERS │ X-Custom-Header: CustomValue +─────────────────────────────┼────────────────────────────────────── + HTTP GEOFENCING PROPERTIES │ origin1.example.com: US, CA + │ origin2.example.com: FR, DE +─────────────────────────────┼────────────────────────────────────── + BLOCKED COUNTRIES │ US, CN +─────────────────────────────┼────────────────────────────────────── + BLOCKED IPS │ 127.0.0.1 +─────────────────────────────┼────────────────────────────────────── + DEFAULT CACHE DURATION │ P1DT2H30M +─────────────────────────────┼────────────────────────────────────── + LOG SINK PUSH URL │ https://logs.example.com +─────────────────────────────┼────────────────────────────────────── + MONTHLY LIMIT (BYTES) │ 104857600 +─────────────────────────────┼────────────────────────────────────── + OPTIMIZER ENABLED │ true + + + WAF  + DISABLED RULE ID │ rule-id-3 +──────────────────┼─────────── + DISABLED RULE ID │ rule-id-4 +──────────────────┼─────────── + ENABLED RULE ID │ rule-id-1 +──────────────────┼─────────── + ENABLED RULE ID │ rule-id-2 +──────────────────┼─────────── + LOG-ONLY RULE ID │ rule-id-5 +──────────────────┼─────────── + LOG-ONLY RULE ID │ rule-id-6 + +`, testDistributionID, testTime, testTime, testProjectID), + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + var buf bytes.Buffer + p.Cmd.SetOut(&buf) + if err := outputResult(p, tt.format, tt.distribution); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + diff := cmp.Diff(buf.String(), tt.expected) + if diff != "" { + t.Fatalf("outputResult() output mismatch (-want +got):\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/cdn/distribution/distribution.go b/internal/cmd/beta/cdn/distribution/distribution.go new file mode 100644 index 000000000..defb471c2 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/distribution.go @@ -0,0 +1,32 @@ +package distribution + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCommand(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "distribution", + Short: "Manage CDN distributions", + Long: "Manage the lifecycle of CDN distributions.", + Args: cobra.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) +} diff --git a/internal/cmd/beta/cdn/distribution/list/list.go b/internal/cmd/beta/cdn/distribution/list/list.go new file mode 100644 index 000000000..aae2b0db0 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/list/list.go @@ -0,0 +1,175 @@ +package list + +import ( + "context" + "fmt" + "math" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + SortBy string + Limit *int32 +} + +const ( + sortByFlag = "sort-by" + limitFlag = "" + maxPageSize = int32(100) +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "List CDN distributions", + Long: "List all CDN distributions in your account.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all CDN distributions`, + `$ stackit beta cdn distribution list`, + ), + examples.NewExample( + `List all CDN distributions sorted by id`, + `$ stackit beta cdn distribution list --sort-by=id`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + distributions, err := fetchDistributions(ctx, model, apiClient) + if err != nil { + return fmt.Errorf("fetch distributions: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, distributions) + }, + } + + configureFlags(cmd) + return cmd +} + +var sortByFlagOptions = []string{"id", "createdAt", "updatedAt", "originUrl", "status", "originUrlRelated"} + +func configureFlags(cmd *cobra.Command) { + // same default as apiClient + cmd.Flags().Var(flags.EnumFlag(false, "createdAt", sortByFlagOptions...), sortByFlag, fmt.Sprintf("Sort entries by a specific field, one of %q", sortByFlagOptions)) + cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt32Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + SortBy: flags.FlagWithDefaultToStringValue(p, cmd, sortByFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *cdn.APIClient, nextPageID cdn.ListDistributionsResponseGetNextPageIdentifierAttributeType, pageLimit int32) cdn.ApiListDistributionsRequest { + req := apiClient.ListDistributions(ctx, model.ProjectId) + req = req.SortBy(model.SortBy) + req = req.PageSize(pageLimit) + if nextPageID != nil { + req = req.PageIdentifier(*nextPageID) + } + return req +} + +func outputResult(p *print.Printer, outputFormat string, distributions []cdn.Distribution) error { + if distributions == nil { + distributions = make([]cdn.Distribution, 0) // otherwise prints null in json output + } + return p.OutputResult(outputFormat, distributions, func() error { + if len(distributions) == 0 { + p.Outputln("No CDN distributions found") + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "REGIONS", "STATUS") + for _, d := range distributions { + var joinedRegions string + if d.Config != nil && d.Config.Regions != nil { + joinedRegions = strings.Join(sdkUtils.EnumSliceToStringSlice(*d.Config.Regions), ", ") + } + table.AddRow( + utils.PtrString(d.Id), + joinedRegions, + utils.PtrString(d.Status), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} + +func fetchDistributions(ctx context.Context, model *inputModel, apiClient *cdn.APIClient) ([]cdn.Distribution, error) { + var nextPageID cdn.ListDistributionsResponseGetNextPageIdentifierAttributeType + var distributions []cdn.Distribution + received := int32(0) + limit := int32(math.MaxInt32) + if model.Limit != nil { + limit = min(limit, *model.Limit) + } + for { + want := min(maxPageSize, limit-received) + request := buildRequest(ctx, model, apiClient, nextPageID, want) + response, err := request.Execute() + if err != nil { + return nil, fmt.Errorf("list distributions: %w", err) + } + if response.Distributions != nil { + distributions = append(distributions, *response.Distributions...) + } + nextPageID = response.NextPageIdentifier + received += want + if nextPageID == nil || received >= limit { + break + } + } + return distributions, nil +} diff --git a/internal/cmd/beta/cdn/distribution/list/list_test.go b/internal/cmd/beta/cdn/distribution/list/list_test.go new file mode 100644 index 000000000..8e5d71aa9 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/list/list_test.go @@ -0,0 +1,471 @@ +package list + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "slices" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +type testCtxKey struct{} + +var testProjectId = uuid.NewString() +var testClient = &cdn.APIClient{} +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + +const ( + testNextPageID = "next-page-id-123" + testID = "dist-1" + testStatus = cdn.DISTRIBUTIONSTATUS_ACTIVE +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + m := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + }, + SortBy: "createdAt", + } + for _, mod := range mods { + mod(m) + } + return m +} + +func fixtureRequest(mods ...func(request cdn.ApiListDistributionsRequest) cdn.ApiListDistributionsRequest) cdn.ApiListDistributionsRequest { + request := testClient.ListDistributions(testCtx, testProjectId) + request = request.PageSize(100) + request = request.SortBy("createdAt") + for _, mod := range mods { + request = mod(request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expected *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expected: fixtureInputModel(), + }, + { + description: "no project id", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "sort by id", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "id" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "id" + }), + }, + { + description: "sort by origin-url", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "originUrl" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "originUrl" + }), + }, + { + description: "sort by status", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "status" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "status" + }), + }, + { + description: "sort by created", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "createdAt" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "createdAt" + }), + }, + { + description: "sort by updated", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "updatedAt" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "updatedAt" + }), + }, + { + description: "sort by originUrlRelated", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "originUrlRelated" + }), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "originUrlRelated" + }), + }, + { + description: "invalid sort by", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[sortByFlag] = "invalid" + }), + isValid: false, + }, + { + description: "missing sort by uses default", + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + delete(flagValues, sortByFlag) + }, + ), + isValid: true, + expected: fixtureInputModel(func(model *inputModel) { + model.SortBy = "createdAt" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expected, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + inputModel *inputModel + nextPageID *string + expected cdn.ApiListDistributionsRequest + }{ + { + description: "base", + inputModel: fixtureInputModel(), + expected: fixtureRequest(), + }, + { + description: "sort by updatedAt", + inputModel: fixtureInputModel(func(model *inputModel) { + model.SortBy = "updatedAt" + }), + expected: fixtureRequest(func(req cdn.ApiListDistributionsRequest) cdn.ApiListDistributionsRequest { + return req.SortBy("updatedAt") + }), + }, + { + description: "with next page id", + inputModel: fixtureInputModel(), + nextPageID: utils.Ptr(testNextPageID), + expected: fixtureRequest(func(req cdn.ApiListDistributionsRequest) cdn.ApiListDistributionsRequest { + return req.PageIdentifier(testNextPageID) + }), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + req := buildRequest(testCtx, tt.inputModel, testClient, tt.nextPageID, maxPageSize) + diff := cmp.Diff(req, tt.expected, + cmp.AllowUnexported(tt.expected), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Errorf("buildRequest() mismatch (-want +got):\n%s", diff) + } + }) + } +} + +type testResponse struct { + statusCode int + body cdn.ListDistributionsResponse +} + +func fixtureTestResponse(mods ...func(resp *testResponse)) testResponse { + resp := testResponse{ + statusCode: 200, + } + for _, mod := range mods { + mod(&resp) + } + return resp +} + +func fixtureDistributions(count int) []cdn.Distribution { + distributions := make([]cdn.Distribution, count) + for i := 0; i < count; i++ { + id := fmt.Sprintf("dist-%d", i+1) + distributions[i] = cdn.Distribution{ + Id: &id, + } + } + return distributions +} + +func TestFetchDistributions(t *testing.T) { + tests := []struct { + description string + limit int32 + responses []testResponse + expected []cdn.Distribution + fails bool + }{ + { + description: "no distributions", + responses: []testResponse{ + fixtureTestResponse(), + }, + expected: nil, + }, + { + description: "single distribution, single page", + responses: []testResponse{ + fixtureTestResponse( + func(resp *testResponse) { + resp.body.Distributions = &[]cdn.Distribution{ + {Id: utils.Ptr("dist-1")}, + } + }, + ), + }, + expected: []cdn.Distribution{ + {Id: utils.Ptr("dist-1")}, + }, + }, + { + description: "multiple distributions, multiple pages", + responses: []testResponse{ + fixtureTestResponse( + func(resp *testResponse) { + resp.body.NextPageIdentifier = utils.Ptr(testNextPageID) + resp.body.Distributions = &[]cdn.Distribution{ + {Id: utils.Ptr("dist-1")}, + } + }, + ), + fixtureTestResponse( + func(resp *testResponse) { + resp.body.Distributions = &[]cdn.Distribution{ + {Id: utils.Ptr("dist-2")}, + } + }, + ), + }, + expected: []cdn.Distribution{ + {Id: utils.Ptr("dist-1")}, + {Id: utils.Ptr("dist-2")}, + }, + }, + { + description: "API error", + responses: []testResponse{ + fixtureTestResponse( + func(resp *testResponse) { + resp.statusCode = 500 + }, + ), + }, + fails: true, + }, + { + description: "API error on second page", + responses: []testResponse{ + fixtureTestResponse( + func(resp *testResponse) { + resp.body.NextPageIdentifier = utils.Ptr(testNextPageID) + resp.body.Distributions = &[]cdn.Distribution{ + {Id: utils.Ptr("dist-1")}, + } + }, + ), + fixtureTestResponse( + func(resp *testResponse) { + resp.statusCode = 500 + }, + ), + }, + fails: true, + }, + { + description: "limit across 2 pages", + limit: 110, + responses: []testResponse{ + fixtureTestResponse( + func(resp *testResponse) { + resp.body.NextPageIdentifier = utils.Ptr(testNextPageID) + distributions := fixtureDistributions(100) + resp.body.Distributions = &distributions + }, + ), + fixtureTestResponse( + func(resp *testResponse) { + distributions := fixtureDistributions(10) + resp.body.Distributions = &distributions + }, + ), + }, + expected: slices.Concat(fixtureDistributions(100), fixtureDistributions(10)), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + callCount := 0 + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + resp := tt.responses[callCount] + callCount++ + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(resp.statusCode) + bs, err := json.Marshal(resp.body) + if err != nil { + t.Fatalf("marshal: %v", err) + } + _, err = w.Write(bs) + if err != nil { + t.Fatalf("write: %v", err) + } + }) + server := httptest.NewServer(handler) + defer server.Close() + client, err := cdn.NewAPIClient( + sdkConfig.WithEndpoint(server.URL), + sdkConfig.WithoutAuthentication(), + ) + if err != nil { + t.Fatalf("failed to create test client: %v", err) + } + var mods []func(m *inputModel) + if tt.limit > 0 { + mods = append(mods, func(m *inputModel) { + m.Limit = utils.Ptr(tt.limit) + }) + } + model := fixtureInputModel(mods...) + got, err := fetchDistributions(testCtx, model, client) + if err != nil { + if !tt.fails { + t.Fatalf("fetchDistributions() unexpected error: %v", err) + } + return + } + if callCount != len(tt.responses) { + t.Errorf("fetchDistributions() expected %d calls, got %d", len(tt.responses), callCount) + } + diff := cmp.Diff(got, tt.expected) + if diff != "" { + t.Errorf("fetchDistributions() mismatch (-want +got):\n%s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + outputFormat string + distributions []cdn.Distribution + expected string + }{ + { + description: "no distributions", + outputFormat: "json", + distributions: []cdn.Distribution{}, + expected: `[] + +`, + }, + { + description: "no distributions nil slice", + outputFormat: "json", + expected: `[] + +`, + }, + { + description: "single distribution", + outputFormat: "table", + distributions: []cdn.Distribution{ + { + Id: utils.Ptr(testID), + Config: &cdn.Config{ + Regions: &[]cdn.Region{ + cdn.REGION_EU, + cdn.REGION_AF, + }, + }, + Status: utils.Ptr(testStatus), + }, + }, + expected: ` + ID │ REGIONS │ STATUS +────────┼─────────┼──────── + dist-1 │ EU, AF │ ACTIVE + +`, + }, + { + description: "no distributions, table format", + outputFormat: "table", + expected: "No CDN distributions found\n", + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + buffer := &bytes.Buffer{} + p.Cmd.SetOut(buffer) + if err := outputResult(p, tt.outputFormat, tt.distributions); err != nil { + t.Fatalf("outputResult: %v", err) + } + if buffer.String() != tt.expected { + t.Errorf("want:\n%s\ngot:\n%s", tt.expected, buffer.String()) + } + }) + } +} diff --git a/internal/cmd/beta/cdn/distribution/update/update.go b/internal/cmd/beta/cdn/distribution/update/update.go new file mode 100644 index 000000000..07fa3022a --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/update/update.go @@ -0,0 +1,337 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/client" + cdnUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +const ( + argDistributionID = "DISTRIBUTION_ID" + flagRegions = "regions" + flagHTTP = "http" + flagHTTPOriginURL = "http-origin-url" + flagHTTPGeofencing = "http-geofencing" + flagHTTPOriginRequestHeaders = "http-origin-request-headers" + flagBucket = "bucket" + flagBucketURL = "bucket-url" + flagBucketCredentialsAccessKeyID = "bucket-credentials-access-key-id" //nolint:gosec // linter false positive + flagBucketRegion = "bucket-region" + flagBlockedCountries = "blocked-countries" + flagBlockedIPs = "blocked-ips" + flagDefaultCacheDuration = "default-cache-duration" + flagLoki = "loki" + flagLokiUsername = "loki-username" + flagLokiPushURL = "loki-push-url" + flagMonthlyLimitBytes = "monthly-limit-bytes" + flagOptimizer = "optimizer" +) + +type bucketInputModel struct { + URL string + AccessKeyID string + Password string + Region string +} + +type httpInputModel struct { + Geofencing *map[string][]string + OriginRequestHeaders *map[string]string + OriginURL string +} + +type lokiInputModel struct { + Password string + Username string + PushURL string +} + +type inputModel struct { + *globalflags.GlobalFlagModel + DistributionID string + Regions []cdn.Region + Bucket *bucketInputModel + HTTP *httpInputModel + BlockedCountries []string + BlockedIPs []string + DefaultCacheDuration string + MonthlyLimitBytes *int64 + Loki *lokiInputModel + Optimizer *bool +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "update", + Short: "Update a CDN distribution", + Long: "Update a CDN distribution by its ID, allowing replacement of its regions.", + Args: args.SingleArg(argDistributionID, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `update a CDN distribution with ID "123e4567-e89b-12d3-a456-426614174000" to not use optimizer`, + `$ stackit beta cdn update 123e4567-e89b-12d3-a456-426614174000 --optimizer=false`, + ), + ), + RunE: func(cmd *cobra.Command, inputArgs []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, inputArgs) + if err != nil { + return err + } + if model.Bucket != nil { + pw, err := params.Printer.PromptForPassword("enter your secret access key for the object storage bucket: ") + if err != nil { + return fmt.Errorf("reading secret access key: %w", err) + } + model.Bucket.Password = pw + } + if model.Loki != nil { + pw, err := params.Printer.PromptForPassword("enter your password for the loki log sink: ") + if err != nil { + return fmt.Errorf("reading loki password: %w", err) + } + model.Loki.Password = pw + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to update a CDN distribution for project %q?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + req := buildRequest(ctx, apiClient, model) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update CDN distribution: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.EnumSliceFlag(false, []string{}, sdkUtils.EnumSliceToStringSlice(cdn.AllowedRegionEnumValues)...), flagRegions, fmt.Sprintf("Regions in which content should be cached, multiple of: %q", cdn.AllowedRegionEnumValues)) + cmd.Flags().Bool(flagHTTP, false, "Use HTTP backend") + cmd.Flags().String(flagHTTPOriginURL, "", "Origin URL for HTTP backend") + cmd.Flags().StringSlice(flagHTTPOriginRequestHeaders, []string{}, "Origin request headers for HTTP backend in the format 'HeaderName: HeaderValue', repeatable. WARNING: do not store sensitive values in the headers!") + cmd.Flags().StringArray(flagHTTPGeofencing, []string{}, "Geofencing rules for HTTP backend in the format 'https://example.com US,DE'. URL and countries have to be quoted. Repeatable.") + cmd.Flags().Bool(flagBucket, false, "Use Object Storage backend") + cmd.Flags().String(flagBucketURL, "", "Bucket URL for Object Storage backend") + cmd.Flags().String(flagBucketCredentialsAccessKeyID, "", "Access Key ID for Object Storage backend") + cmd.Flags().String(flagBucketRegion, "", "Region for Object Storage backend") + cmd.Flags().StringSlice(flagBlockedCountries, []string{}, "Comma-separated list of ISO 3166-1 alpha-2 country codes to block (e.g., 'US,DE,FR')") + cmd.Flags().StringSlice(flagBlockedIPs, []string{}, "Comma-separated list of IPv4 addresses to block (e.g., '10.0.0.8,127.0.0.1')") + cmd.Flags().String(flagDefaultCacheDuration, "", "ISO8601 duration string for default cache duration (e.g., 'PT1H30M' for 1 hour and 30 minutes)") + cmd.Flags().Bool(flagLoki, false, "Enable Loki log sink for the CDN distribution") + cmd.Flags().String(flagLokiUsername, "", "Username for log sink") + cmd.Flags().String(flagLokiPushURL, "", "Push URL for log sink") + cmd.Flags().Int64(flagMonthlyLimitBytes, 0, "Monthly limit in bytes for the CDN distribution") + cmd.Flags().Bool(flagOptimizer, false, "Enable optimizer for the CDN distribution (paid feature).") + cmd.MarkFlagsMutuallyExclusive(flagHTTP, flagBucket) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + distributionID := inputArgs[0] + + regionStrings := flags.FlagToStringSliceValue(p, cmd, flagRegions) + regions := make([]cdn.Region, 0, len(regionStrings)) + for _, regionStr := range regionStrings { + regions = append(regions, cdn.Region(regionStr)) + } + + var http *httpInputModel + if flags.FlagToBoolValue(p, cmd, flagHTTP) { + originURL := flags.FlagToStringValue(p, cmd, flagHTTPOriginURL) + + var geofencing *map[string][]string + geofencingInput := flags.FlagToStringArrayValue(p, cmd, flagHTTPGeofencing) + if geofencingInput != nil { + geofencing = cdnUtils.ParseGeofencing(p, geofencingInput) + } + + var originRequestHeaders *map[string]string + originRequestHeadersInput := flags.FlagToStringSliceValue(p, cmd, flagHTTPOriginRequestHeaders) + if originRequestHeadersInput != nil { + originRequestHeaders = cdnUtils.ParseOriginRequestHeaders(p, originRequestHeadersInput) + } + + http = &httpInputModel{ + OriginURL: originURL, + Geofencing: geofencing, + OriginRequestHeaders: originRequestHeaders, + } + } + + var bucket *bucketInputModel + if flags.FlagToBoolValue(p, cmd, flagBucket) { + bucketURL := flags.FlagToStringValue(p, cmd, flagBucketURL) + accessKeyID := flags.FlagToStringValue(p, cmd, flagBucketCredentialsAccessKeyID) + region := flags.FlagToStringValue(p, cmd, flagBucketRegion) + + bucket = &bucketInputModel{ + URL: bucketURL, + AccessKeyID: accessKeyID, + Password: "", + Region: region, + } + } + + blockedCountries := flags.FlagToStringSliceValue(p, cmd, flagBlockedCountries) + blockedIPs := flags.FlagToStringSliceValue(p, cmd, flagBlockedIPs) + cacheDuration := flags.FlagToStringValue(p, cmd, flagDefaultCacheDuration) + monthlyLimit := flags.FlagToInt64Pointer(p, cmd, flagMonthlyLimitBytes) + + var loki *lokiInputModel + if flags.FlagToBoolValue(p, cmd, flagLoki) { + loki = &lokiInputModel{ + Username: flags.FlagToStringValue(p, cmd, flagLokiUsername), + PushURL: flags.FlagToStringValue(p, cmd, flagLokiPushURL), + Password: "", + } + } + + var optimizer *bool + if cmd.Flags().Changed(flagOptimizer) { + o := flags.FlagToBoolValue(p, cmd, flagOptimizer) + optimizer = &o + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + DistributionID: distributionID, + Regions: regions, + HTTP: http, + Bucket: bucket, + BlockedCountries: blockedCountries, + BlockedIPs: blockedIPs, + DefaultCacheDuration: cacheDuration, + MonthlyLimitBytes: monthlyLimit, + Loki: loki, + Optimizer: optimizer, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *cdn.APIClient, model *inputModel) cdn.ApiPatchDistributionRequest { + req := apiClient.PatchDistribution(ctx, model.ProjectId, model.DistributionID) + payload := cdn.NewPatchDistributionPayload() + cfg := &cdn.ConfigPatch{} + payload.Config = cfg + if len(model.Regions) > 0 { + cfg.Regions = &model.Regions + } + if model.Bucket != nil { + bucket := &cdn.BucketBackendPatch{ + Type: utils.Ptr("bucket"), + } + cfg.Backend = &cdn.ConfigPatchBackend{ + BucketBackendPatch: bucket, + } + if model.Bucket.URL != "" { + bucket.BucketUrl = utils.Ptr(model.Bucket.URL) + } + if model.Bucket.AccessKeyID != "" { + bucket.Credentials = cdn.NewBucketCredentials( + model.Bucket.AccessKeyID, + model.Bucket.Password, + ) + } + if model.Bucket.Region != "" { + bucket.Region = utils.Ptr(model.Bucket.Region) + } + } else if model.HTTP != nil { + http := &cdn.HttpBackendPatch{ + Type: utils.Ptr("http"), + } + cfg.Backend = &cdn.ConfigPatchBackend{ + HttpBackendPatch: http, + } + if model.HTTP.OriginRequestHeaders != nil { + http.OriginRequestHeaders = model.HTTP.OriginRequestHeaders + } + if model.HTTP.Geofencing != nil { + http.Geofencing = model.HTTP.Geofencing + } + if model.HTTP.OriginURL != "" { + http.OriginUrl = utils.Ptr(model.HTTP.OriginURL) + } + } + if len(model.BlockedCountries) > 0 { + cfg.BlockedCountries = &model.BlockedCountries + } + if len(model.BlockedIPs) > 0 { + cfg.BlockedIps = &model.BlockedIPs + } + if model.DefaultCacheDuration != "" { + cfg.DefaultCacheDuration = cdn.NewNullableString(&model.DefaultCacheDuration) + } + if model.MonthlyLimitBytes != nil && *model.MonthlyLimitBytes > 0 { + cfg.MonthlyLimitBytes = model.MonthlyLimitBytes + } + if model.Loki != nil { + loki := &cdn.LokiLogSinkPatch{} + cfg.LogSink = cdn.NewNullableConfigPatchLogSink(&cdn.ConfigPatchLogSink{ + LokiLogSinkPatch: loki, + }) + if model.Loki.PushURL != "" { + loki.PushUrl = utils.Ptr(model.Loki.PushURL) + } + if model.Loki.Username != "" { + loki.Credentials = cdn.NewLokiLogSinkCredentials( + model.Loki.Password, + model.Loki.Username, + ) + } + } + if model.Optimizer != nil { + cfg.Optimizer = &cdn.OptimizerPatch{ + Enabled: model.Optimizer, + } + } + req = req.PatchDistributionPayload(*payload) + return req +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, resp *cdn.PatchDistributionResponse) error { + if resp == nil { + return fmt.Errorf("update distribution response is empty") + } + return p.OutputResult(outputFormat, resp, func() error { + p.Outputf("Updated CDN distribution for %q. ID: %s\n", projectLabel, utils.PtrString(resp.Distribution.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/cdn/distribution/update/update_test.go b/internal/cmd/beta/cdn/distribution/update/update_test.go new file mode 100644 index 000000000..bf3dd11f5 --- /dev/null +++ b/internal/cmd/beta/cdn/distribution/update/update_test.go @@ -0,0 +1,365 @@ +package update + +import ( + "bytes" + "context" + "fmt" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "k8s.io/utils/ptr" +) + +const testCacheDuration = "P1DT12H" + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &cdn.APIClient{} +var testProjectId = uuid.NewString() +var testDistributionID = uuid.NewString() + +const testMonthlyLimitBytes int64 = 1048576 + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + } + for _, m := range mods { + m(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + }, + DistributionID: testDistributionID, + Regions: []cdn.Region{}, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(payload *cdn.PatchDistributionPayload)) cdn.ApiPatchDistributionRequest { + req := testClient.PatchDistribution(testCtx, testProjectId, testDistributionID) + if payload := fixturePayload(mods...); payload != nil { + req = req.PatchDistributionPayload(*fixturePayload(mods...)) + } + return req +} + +func fixturePayload(mods ...func(payload *cdn.PatchDistributionPayload)) *cdn.PatchDistributionPayload { + payload := cdn.NewPatchDistributionPayload() + payload.Config = &cdn.ConfigPatch{} + for _, m := range mods { + m(payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expected *inputModel + }{ + { + description: "base", + argValues: []string{testDistributionID}, + flagValues: fixtureFlagValues(), + isValid: true, + expected: fixtureInputModel(), + }, + { + description: "distribution id missing", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "invalid distribution id", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "project id missing", + argValues: []string{testDistributionID}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { delete(flagValues, globalflags.ProjectIdFlag) }), + isValid: false, + }, + { + description: "invalid distribution id", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "both backends", + argValues: []string{testDistributionID}, + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagHTTP] = "true" + flagValues[flagBucket] = "true" + }, + ), + isValid: false, + }, + { + description: "max config without backend", + argValues: []string{testDistributionID}, + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagRegions] = "EU,US" + flagValues[flagBlockedCountries] = "DE,AT,CH" + flagValues[flagBlockedIPs] = "127.0.0.1,10.0.0.8" + flagValues[flagDefaultCacheDuration] = "P1DT12H" + flagValues[flagLoki] = "true" + flagValues[flagLokiUsername] = "loki-user" + flagValues[flagLokiPushURL] = "https://loki.example.com" + flagValues[flagMonthlyLimitBytes] = fmt.Sprintf("%d", testMonthlyLimitBytes) + flagValues[flagOptimizer] = "true" + }, + ), + isValid: true, + expected: fixtureInputModel( + func(model *inputModel) { + model.Regions = []cdn.Region{cdn.REGION_EU, cdn.REGION_US} + model.BlockedCountries = []string{"DE", "AT", "CH"} + model.BlockedIPs = []string{"127.0.0.1", "10.0.0.8"} + model.DefaultCacheDuration = "P1DT12H" + model.Loki = &lokiInputModel{ + Username: "loki-user", + PushURL: "https://loki.example.com", + } + model.MonthlyLimitBytes = utils.Ptr(testMonthlyLimitBytes) + model.Optimizer = utils.Ptr(true) + }, + ), + }, + { + description: "max config http backend", + argValues: []string{testDistributionID}, + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagHTTP] = "true" + flagValues[flagHTTPOriginURL] = "https://origin.example.com" + flagValues[flagHTTPOriginRequestHeaders] = "X-Example-Header: example-value, X-Another-Header: another-value" + flagValues[flagHTTPGeofencing] = "https://dach.example.com DE,AT,CH" + }, + ), + isValid: true, + expected: fixtureInputModel( + func(model *inputModel) { + model.HTTP = &httpInputModel{ + OriginURL: "https://origin.example.com", + OriginRequestHeaders: &map[string]string{ + "X-Example-Header": "example-value", + "X-Another-Header": "another-value", + }, + Geofencing: &map[string][]string{ + "https://dach.example.com": {"DE", "AT", "CH"}, + }, + } + }, + ), + }, + { + description: "max config bucket backend", + argValues: []string{testDistributionID}, + flagValues: fixtureFlagValues( + func(flagValues map[string]string) { + flagValues[flagBucket] = "true" + flagValues[flagBucketURL] = "https://bucket.example.com" + flagValues[flagBucketRegion] = "EU" + flagValues[flagBucketCredentialsAccessKeyID] = "access-key-id" + }, + ), + isValid: true, + expected: fixtureInputModel( + func(model *inputModel) { + model.Bucket = &bucketInputModel{ + URL: "https://bucket.example.com", + Region: "EU", + AccessKeyID: "access-key-id", + } + }, + ), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expected, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expected cdn.ApiPatchDistributionRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expected: fixtureRequest(), + }, + { + description: "max without backend", + model: fixtureInputModel( + func(model *inputModel) { + model.Regions = []cdn.Region{cdn.REGION_EU, cdn.REGION_US} + model.BlockedCountries = []string{"DE", "AT", "CH"} + model.BlockedIPs = []string{"127.0.0.1", "10.0.0.8"} + model.DefaultCacheDuration = testCacheDuration + model.MonthlyLimitBytes = utils.Ptr(testMonthlyLimitBytes) + model.Loki = &lokiInputModel{ + Password: "loki-pass", + Username: "loki-user", + PushURL: "https://loki.example.com", + } + model.Optimizer = utils.Ptr(true) + }, + ), + expected: fixtureRequest( + func(payload *cdn.PatchDistributionPayload) { + payload.Config.Regions = &[]cdn.Region{cdn.REGION_EU, cdn.REGION_US} + payload.Config.BlockedCountries = &[]string{"DE", "AT", "CH"} + payload.Config.BlockedIps = &[]string{"127.0.0.1", "10.0.0.8"} + payload.Config.DefaultCacheDuration = cdn.NewNullableString(utils.Ptr(testCacheDuration)) + payload.Config.MonthlyLimitBytes = utils.Ptr(testMonthlyLimitBytes) + payload.Config.LogSink = cdn.NewNullableConfigPatchLogSink(&cdn.ConfigPatchLogSink{ + LokiLogSinkPatch: &cdn.LokiLogSinkPatch{ + Credentials: cdn.NewLokiLogSinkCredentials("loki-pass", "loki-user"), + PushUrl: utils.Ptr("https://loki.example.com"), + }, + }) + payload.Config.Optimizer = &cdn.OptimizerPatch{ + Enabled: utils.Ptr(true), + } + }, + ), + }, + { + description: "max http backend", + model: fixtureInputModel( + func(model *inputModel) { + model.HTTP = &httpInputModel{ + Geofencing: &map[string][]string{"https://dach.example.com": {"DE", "AT", "CH"}}, + OriginRequestHeaders: &map[string]string{"X-Example-Header": "example-value", "X-Another-Header": "another-value"}, + OriginURL: "https://http-backend.example.com", + } + }), + expected: fixtureRequest( + func(payload *cdn.PatchDistributionPayload) { + payload.Config.Backend = &cdn.ConfigPatchBackend{ + HttpBackendPatch: &cdn.HttpBackendPatch{ + Geofencing: &map[string][]string{"https://dach.example.com": {"DE", "AT", "CH"}}, + OriginRequestHeaders: &map[string]string{ + "X-Example-Header": "example-value", + "X-Another-Header": "another-value", + }, + OriginUrl: utils.Ptr("https://http-backend.example.com"), + Type: utils.Ptr("http"), + }, + } + }), + }, + { + description: "max bucket backend", + model: fixtureInputModel( + func(model *inputModel) { + model.Bucket = &bucketInputModel{ + URL: "https://bucket.example.com", + AccessKeyID: "bucket-access-key-id", + Password: "bucket-pass", + Region: "EU", + } + }), + expected: fixtureRequest( + func(payload *cdn.PatchDistributionPayload) { + payload.Config.Backend = &cdn.ConfigPatchBackend{ + BucketBackendPatch: &cdn.BucketBackendPatch{ + BucketUrl: utils.Ptr("https://bucket.example.com"), + Credentials: cdn.NewBucketCredentials("bucket-access-key-id", "bucket-pass"), + Region: utils.Ptr("EU"), + Type: utils.Ptr("bucket"), + }, + } + }), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient, tt.model) + + diff := cmp.Diff(request, tt.expected, + cmp.AllowUnexported(tt.expected, cdn.NullableString{}, cdn.NullableConfigPatchLogSink{}), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + tests := []struct { + description string + outputFormat string + response *cdn.PatchDistributionResponse + expected string + wantErr bool + }{ + { + description: "nil response", + outputFormat: "table", + response: nil, + wantErr: true, + }, + { + description: "table output", + outputFormat: "table", + response: &cdn.PatchDistributionResponse{ + Distribution: &cdn.Distribution{ + Id: ptr.To("dist-1234"), + }, + }, + expected: fmt.Sprintf("Updated CDN distribution for %q. ID: dist-1234\n", testProjectId), + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + buffer := &bytes.Buffer{} + p.Cmd.SetOut(buffer) + if err := outputResult(p, tt.outputFormat, testProjectId, tt.response); (err != nil) != tt.wantErr { + t.Fatalf("outputResult: %v", err) + } + if buffer.String() != tt.expected { + t.Errorf("want:\n%s\ngot:\n%s", tt.expected, buffer.String()) + } + }) + } +} diff --git a/internal/cmd/config/set/set.go b/internal/cmd/config/set/set.go index a4ff8b428..9bb2713b5 100644 --- a/internal/cmd/config/set/set.go +++ b/internal/cmd/config/set/set.go @@ -52,6 +52,7 @@ const ( intakeCustomEndpointFlag = "intake-custom-endpoint" logsCustomEndpointFlag = "logs-custom-endpoint" sfsCustomEndpointFlag = "sfs-custom-endpoint" + cdnCustomEndpointFlag = "cdn-custom-endpoint" ) type inputModel struct { @@ -170,6 +171,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(intakeCustomEndpointFlag, "", "Intake API base URL, used in calls to this API") cmd.Flags().String(logsCustomEndpointFlag, "", "Logs API base URL, used in calls to this API") cmd.Flags().String(sfsCustomEndpointFlag, "", "SFS API base URL, used in calls to this API") + cmd.Flags().String(cdnCustomEndpointFlag, "", "CDN API base URL, used in calls to this API") err := viper.BindPFlag(config.SessionTimeLimitKey, cmd.Flags().Lookup(sessionTimeLimitFlag)) cobra.CheckErr(err) @@ -236,6 +238,8 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) err = viper.BindPFlag(config.SfsCustomEndpointKey, cmd.Flags().Lookup(sfsCustomEndpointFlag)) cobra.CheckErr(err) + err = viper.BindPFlag(config.CDNCustomEndpointKey, cmd.Flags().Lookup(cdnCustomEndpointFlag)) + cobra.CheckErr(err) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index 460cdf9d4..bf63e4474 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -56,6 +56,7 @@ const ( tokenCustomEndpointFlag = "token-custom-endpoint" intakeCustomEndpointFlag = "intake-custom-endpoint" logsCustomEndpointFlag = "logs-custom-endpoint" + cdnCustomEndpointFlag = "cdn-custom-endpoint" ) type inputModel struct { @@ -98,6 +99,7 @@ type inputModel struct { TokenCustomEndpoint bool IntakeCustomEndpoint bool LogsCustomEndpoint bool + CDNCustomEndpoint bool } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -233,6 +235,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.SfsCustomEndpoint { viper.Set(config.SfsCustomEndpointKey, "") } + if model.CDNCustomEndpoint { + viper.Set(config.CDNCustomEndpointKey, "") + } err := config.Write() if err != nil { @@ -285,6 +290,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(intakeCustomEndpointFlag, false, "Intake API base URL. If unset, uses the default base URL") cmd.Flags().Bool(logsCustomEndpointFlag, false, "Logs API base URL. If unset, uses the default base URL") cmd.Flags().Bool(sfsCustomEndpointFlag, false, "SFS API base URL. If unset, uses the default base URL") + cmd.Flags().Bool(cdnCustomEndpointFlag, false, "Custom CDN endpoint URL. If unset, uses the default base URL") } func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { @@ -328,6 +334,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { TokenCustomEndpoint: flags.FlagToBoolValue(p, cmd, tokenCustomEndpointFlag), IntakeCustomEndpoint: flags.FlagToBoolValue(p, cmd, intakeCustomEndpointFlag), LogsCustomEndpoint: flags.FlagToBoolValue(p, cmd, logsCustomEndpointFlag), + CDNCustomEndpoint: flags.FlagToBoolValue(p, cmd, cdnCustomEndpointFlag), } p.DebugInputModel(model) diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index 65c6cb35b..dda5dcaee 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -48,6 +48,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool tokenCustomEndpointFlag: true, intakeCustomEndpointFlag: true, logsCustomEndpointFlag: true, + cdnCustomEndpointFlag: true, } for _, mod := range mods { mod(flagValues) @@ -92,6 +93,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { TokenCustomEndpoint: true, IntakeCustomEndpoint: true, LogsCustomEndpoint: true, + CDNCustomEndpoint: true, } for _, mod := range mods { mod(model) @@ -152,6 +154,7 @@ func TestParseInput(t *testing.T) { model.TokenCustomEndpoint = false model.IntakeCustomEndpoint = false model.LogsCustomEndpoint = false + model.CDNCustomEndpoint = false }), }, { @@ -344,6 +347,16 @@ func TestParseInput(t *testing.T) { model.LogsCustomEndpoint = false }), }, + { + description: "cdn custom endpoint empty", + flagValues: fixtureFlagValues(func(flagValues map[string]bool) { + flagValues[cdnCustomEndpointFlag] = false + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.CDNCustomEndpoint = false + }), + }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 32761f275..e8532775f 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -50,6 +50,7 @@ const ( IaaSCustomEndpointKey = "iaas_custom_endpoint" TokenCustomEndpointKey = "token_custom_endpoint" GitCustomEndpointKey = "git_custom_endpoint" + CDNCustomEndpointKey = "cdn_custom_endpoint" IntakeCustomEndpointKey = "intake_custom_endpoint" LogsCustomEndpointKey = "logs_custom_endpoint" @@ -116,6 +117,7 @@ var ConfigKeys = []string{ IntakeCustomEndpointKey, AlbCustomEndpoint, LogsCustomEndpointKey, + CDNCustomEndpointKey, } var defaultConfigFolderPath string @@ -206,6 +208,7 @@ func setConfigDefaults() { viper.SetDefault(IntakeCustomEndpointKey, "") viper.SetDefault(AlbCustomEndpoint, "") viper.SetDefault(LogsCustomEndpointKey, "") + viper.SetDefault(CDNCustomEndpointKey, "") } func getConfigFilePath(configFolder string) string { diff --git a/internal/pkg/flags/flag_to_value.go b/internal/pkg/flags/flag_to_value.go index 6385ba65a..f08904982 100644 --- a/internal/pkg/flags/flag_to_value.go +++ b/internal/pkg/flags/flag_to_value.go @@ -47,6 +47,20 @@ func FlagToStringSliceValue(p *print.Printer, cmd *cobra.Command, flag string) [ return nil } +// Returns the flag's value as a []string. +// Returns nil if flag is not set, if its value can not be converted to []string, or if the flag does not exist. +func FlagToStringArrayValue(p *print.Printer, cmd *cobra.Command, flag string) []string { + value, err := cmd.Flags().GetStringArray(flag) + if err != nil { + p.Debug(print.ErrorLevel, "convert flag to string array value: %v", err) + return nil + } + if !cmd.Flag(flag).Changed { + return nil + } + return value +} + // Returns a pointer to the flag's value. // Returns nil if the flag is not set, if its value can not be converted to map[string]string, or if the flag does not exist. func FlagToStringToStringPointer(p *print.Printer, cmd *cobra.Command, flag string) *map[string]string { //nolint:gocritic //convenient for setting the SDK payload @@ -75,6 +89,20 @@ func FlagToInt64Pointer(p *print.Printer, cmd *cobra.Command, flag string) *int6 return nil } +// Returns a pointer to the flag's value. +// Returns nil if the flag is not set, if its value can not be converted to int64, or if the flag does not exist. +func FlagToInt32Pointer(p *print.Printer, cmd *cobra.Command, flag string) *int32 { + value, err := cmd.Flags().GetInt32(flag) + if err != nil { + p.Debug(print.ErrorLevel, "convert flag to Int pointer: %v", err) + return nil + } + if cmd.Flag(flag).Changed { + return &value + } + return nil +} + // Returns a pointer to the flag's value. // Returns nil if the flag is not set, if its value can not be converted to string, or if the flag does not exist. func FlagToStringPointer(p *print.Printer, cmd *cobra.Command, flag string) *string { diff --git a/internal/pkg/flags/flag_to_value_test.go b/internal/pkg/flags/flag_to_value_test.go index 5a71f40db..08d25ed9b 100644 --- a/internal/pkg/flags/flag_to_value_test.go +++ b/internal/pkg/flags/flag_to_value_test.go @@ -71,3 +71,116 @@ func TestFlagToStringToStringPointer(t *testing.T) { }) } } + +func TestFlagToStringArrayValue(t *testing.T) { + const flagName = "geofencing" + tests := []struct { + name string + flagValues []string + want []string + }{ + { + name: "flag unset", + flagValues: nil, + want: nil, + }, + { + name: "single flag value", + flagValues: []string{ + "https://foo.example.com DE,CH", + }, + want: []string{ + "https://foo.example.com DE,CH", + }, + }, + { + name: "multiple flag value", + flagValues: []string{ + "https://foo.example.com DE,CH", + "https://bar.example.com AT", + }, + want: []string{ + "https://foo.example.com DE,CH", + "https://bar.example.com AT", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + cmd := func() *cobra.Command { + cmd := &cobra.Command{ + Use: "greet", + Short: "A simple greeting command", + Long: "A simple greeting command", + Run: func(_ *cobra.Command, _ []string) { + fmt.Println("Hello world") + }, + } + cmd.Flags().StringArray(flagName, []string{}, "url to multiple region codes, repeatable") + return cmd + }() + // set the flag value if a value use given, else consider the flag unset + if tt.flagValues != nil { + for _, val := range tt.flagValues { + err := cmd.Flags().Set(flagName, val) + if err != nil { + t.Error(err) + } + } + } + + if got := FlagToStringArrayValue(p, cmd, flagName); !reflect.DeepEqual(got, tt.want) { + t.Errorf("FlagToStringArrayValue() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestFlagToInt32Pointer(t *testing.T) { + const flagName = "limit" + tests := []struct { + name string + flagValue *string + want *int32 + }{ + { + name: "flag unset", + flagValue: nil, + want: nil, + }, + { + name: "flag value", + flagValue: utils.Ptr("42"), + want: utils.Ptr(int32(42)), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + p := print.NewPrinter() + cmd := func() *cobra.Command { + cmd := &cobra.Command{ + Use: "greet", + Short: "A simple greeting command", + Long: "A simple greeting command", + Run: func(_ *cobra.Command, _ []string) { + fmt.Println("Hello world") + }, + } + cmd.Flags().Int32(flagName, 0, "limit") + return cmd + }() + // set the flag value if a value use given, else consider the flag unset + if tt.flagValue != nil { + err := cmd.Flags().Set(flagName, *tt.flagValue) + if err != nil { + t.Error(err) + } + } + + if got := FlagToInt32Pointer(p, cmd, flagName); !reflect.DeepEqual(got, tt.want) { + t.Errorf("FlagToInt32Pointer() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index ea6ed1b6f..6754db285 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -182,11 +182,20 @@ func (p *Printer) PromptForEnter(prompt string) error { func (p *Printer) PromptForPassword(prompt string) (string, error) { p.Cmd.PrintErr(prompt) defer p.Outputln("") - bytePassword, err := term.ReadPassword(int(syscall.Stdin)) + if term.IsTerminal(syscall.Stdin) { + bytePassword, err := term.ReadPassword(syscall.Stdin) + if err != nil { + return "", fmt.Errorf("read password: %w", err) + } + return string(bytePassword), nil + } + // Fallback for non-terminal environments + reader := bufio.NewReader(p.Cmd.InOrStdin()) + pw, err := reader.ReadString('\n') if err != nil { - return "", fmt.Errorf("read password: %w", err) + return "", fmt.Errorf("read password from non-terminal: %w", err) } - return string(bytePassword), nil + return pw[:len(pw)-1], nil // remove trailing newline } // Shows the content in the command's stdout using the "less" command diff --git a/internal/pkg/print/print_test.go b/internal/pkg/print/print_test.go index d52af5241..1867b9e03 100644 --- a/internal/pkg/print/print_test.go +++ b/internal/pkg/print/print_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "log/slog" + "sync" "testing" "github.com/spf13/cobra" @@ -945,3 +946,51 @@ func TestOutputResult(t *testing.T) { }) } } + +func TestPromptForPassword(t *testing.T) { + tests := []struct { + description string + input string + }{ + { + description: "password", + input: "mypassword\n", + }, + { + description: "empty password", + input: "\n", + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + cmd := &cobra.Command{} + r, w := io.Pipe() + defer func() { + r.Close() //nolint:errcheck // ignore error on close + w.Close() //nolint:errcheck // ignore error on close + }() + cmd.SetIn(r) + p := &Printer{ + Cmd: cmd, + Verbosity: ErrorLevel, + } + var pw string + var err error + var wg sync.WaitGroup + wg.Add(1) + go func() { + pw, err = p.PromptForPassword("Enter password: ") + wg.Done() + }() + w.Write([]byte(tt.input)) //nolint:errcheck // ignore error + wg.Wait() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + withoutNewline := tt.input[:len(tt.input)-1] + if pw != withoutNewline { + t.Fatalf("unexpected password: got %q, want %q", pw, withoutNewline) + } + }) + } +} diff --git a/internal/pkg/services/cdn/client/client.go b/internal/pkg/services/cdn/client/client.go new file mode 100644 index 000000000..afefb7a92 --- /dev/null +++ b/internal/pkg/services/cdn/client/client.go @@ -0,0 +1,13 @@ +package client + +import ( + "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" +) + +func ConfigureClient(p *print.Printer, cliVersion string) (*cdn.APIClient, error) { + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.CDNCustomEndpointKey), true, cdn.NewAPIClient) +} diff --git a/internal/pkg/services/cdn/utils/utils.go b/internal/pkg/services/cdn/utils/utils.go new file mode 100644 index 000000000..f9b903420 --- /dev/null +++ b/internal/pkg/services/cdn/utils/utils.go @@ -0,0 +1,40 @@ +package utils + +import ( + "strings" + + "github.com/stackitcloud/stackit-cli/internal/pkg/print" +) + +func ParseGeofencing(p *print.Printer, geofencingInput []string) *map[string][]string { //nolint:gocritic // convenient for setting the SDK payload + geofencing := make(map[string][]string) + for _, in := range geofencingInput { + firstSpace := strings.IndexRune(in, ' ') + if firstSpace == -1 { + p.Debug(print.ErrorLevel, "invalid geofencing entry (no space found): %q", in) + continue + } + urlPart := in[:firstSpace] + countriesPart := in[firstSpace+1:] + geofencing[urlPart] = nil + countries := strings.Split(countriesPart, ",") + for _, country := range countries { + country = strings.TrimSpace(country) + geofencing[urlPart] = append(geofencing[urlPart], country) + } + } + return &geofencing +} + +func ParseOriginRequestHeaders(p *print.Printer, originRequestHeadersInput []string) *map[string]string { //nolint:gocritic // convenient for setting the SDK payload + originRequestHeaders := make(map[string]string) + for _, in := range originRequestHeadersInput { + parts := strings.Split(in, ":") + if len(parts) != 2 { + p.Debug(print.ErrorLevel, "invalid origin request header entry (no colon found): %q", in) + continue + } + originRequestHeaders[strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1]) + } + return &originRequestHeaders +} diff --git a/internal/pkg/services/cdn/utils/utils_test.go b/internal/pkg/services/cdn/utils/utils_test.go new file mode 100644 index 000000000..9de52e3c4 --- /dev/null +++ b/internal/pkg/services/cdn/utils/utils_test.go @@ -0,0 +1,94 @@ +package utils + +import ( + "reflect" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/print" +) + +func TestParseGeofencing(t *testing.T) { + tests := []struct { + name string + input []string + want map[string][]string + }{ + { + name: "empty input", + input: nil, + want: map[string][]string{}, + }, + { + name: "single entry", + input: []string{ + "https://example.com US,CA,MX", + }, + want: map[string][]string{ + "https://example.com": {"US", "CA", "MX"}, + }, + }, + { + name: "multiple entries", + input: []string{ + "https://example.com US,CA,MX", + "https://another.com DE,FR", + }, + want: map[string][]string{ + "https://example.com": {"US", "CA", "MX"}, + "https://another.com": {"DE", "FR"}, + }, + }, + } + printer := print.NewPrinter() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := ParseGeofencing(printer, tt.input) + if !reflect.DeepEqual(got, &tt.want) { + t.Errorf("ParseGeofencing() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestParseOriginRequestHeaders(t *testing.T) { + tests := []struct { + name string + input []string + want map[string]string + }{ + { + name: "empty input", + input: nil, + want: map[string]string{}, + }, + { + name: "single entry", + input: []string{ + "X-Custom-Header: Value1", + }, + want: map[string]string{ + "X-Custom-Header": "Value1", + }, + }, + { + name: "multiple entries", + input: []string{ + "X-Custom-Header1: Value1", + "X-Custom-Header2: Value2", + }, + want: map[string]string{ + "X-Custom-Header1": "Value1", + "X-Custom-Header2": "Value2", + }, + }, + } + printer := print.NewPrinter() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := ParseOriginRequestHeaders(printer, tt.input) + if !reflect.DeepEqual(got, &tt.want) { + t.Errorf("ParseOriginRequestHeaders() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/internal/pkg/testutils/testutils.go b/internal/pkg/testutils/testutils.go index 1a045cfbf..ceecf888a 100644 --- a/internal/pkg/testutils/testutils.go +++ b/internal/pkg/testutils/testutils.go @@ -13,6 +13,7 @@ import ( // TestParseInput centralizes the logic to test a combination of inputs (arguments, flags) for a cobra command func TestParseInput[T any](t *testing.T, cmdFactory func(*types.CmdParams) *cobra.Command, parseInputFunc func(*print.Printer, *cobra.Command, []string) (T, error), expectedModel T, argValues []string, flagValues map[string]string, isValid bool) { + t.Helper() TestParseInputWithAdditionalFlags(t, cmdFactory, parseInputFunc, expectedModel, argValues, flagValues, map[string][]string{}, isValid) } @@ -63,6 +64,21 @@ func TestParseInputWithOptions[T any](t *testing.T, cmdFactory func(*types.CmdPa } } + if cmd.PreRun != nil { + // can be used for dynamic flag configuration + cmd.PreRun(cmd, argValues) + } + + if cmd.PreRunE != nil { + err := cmd.PreRunE(cmd, argValues) + if err != nil { + if !isValid { + return + } + t.Fatalf("error in PreRunE: %v", err) + } + } + err = cmd.ValidateArgs(argValues) if err != nil { if !isValid { diff --git a/internal/pkg/utils/strings.go b/internal/pkg/utils/strings.go index 401287fa1..64817f4ee 100644 --- a/internal/pkg/utils/strings.go +++ b/internal/pkg/utils/strings.go @@ -1,6 +1,8 @@ package utils import ( + "fmt" + "slices" "strings" "unicode/utf8" ) @@ -26,6 +28,23 @@ func JoinStringKeysPtr(m map[string]any, sep string) string { return JoinStringKeys(m, sep) } +// JoinStringMap concatenates the key-value pairs of a string map, key and value separated by keyValueSeparator, key value pairs separated by separator. +func JoinStringMap(m map[string]string, keyValueSeparator, separator string) string { + if m == nil { + return "" + } + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + slices.Sort(keys) + parts := make([]string, 0, len(m)) + for _, k := range keys { + parts = append(parts, fmt.Sprintf("%s%s%s", k, keyValueSeparator, m[k])) + } + return strings.Join(parts, separator) +} + // JoinStringPtr concatenates the strings of a string slice pointer, each separatore by the // [sep] string. func JoinStringPtr(vals *[]string, sep string) string { diff --git a/internal/pkg/utils/strings_test.go b/internal/pkg/utils/strings_test.go index a7fb023bc..6f0279045 100644 --- a/internal/pkg/utils/strings_test.go +++ b/internal/pkg/utils/strings_test.go @@ -30,3 +30,39 @@ func TestTruncate(t *testing.T) { }) } } + +func TestJoinStringMap(t *testing.T) { + tests := []struct { + name string + input map[string]string + want string + }{ + { + name: "nil map", + input: nil, + want: "", + }, + { + name: "empty map", + input: map[string]string{}, + want: "", + }, + { + name: "single element", + input: map[string]string{"key1": "value1"}, + want: "key1=value1", + }, + { + name: "multiple elements", + input: map[string]string{"key1": "value1", "key2": "value2"}, + want: "key1=value1, key2=value2", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := JoinStringMap(tt.input, "=", ", "); got != tt.want { + t.Errorf("JoinStringMap() = %v, want %v", got, tt.want) + } + }) + } +} From 2b34f71cc28f7bd81e787ff66941d18729eb9ba4 Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Wed, 28 Jan 2026 09:58:36 +0100 Subject: [PATCH 326/422] chore(cdn): Update CDN version from v1beta2 to v1 (#1252) Signed-off-by: Alexander Dahmen --- docs/stackit_beta_cdn_distribution_update.md | 4 ++-- go.mod | 2 +- go.sum | 6 ++---- internal/cmd/beta/cdn/distribution/update/update.go | 4 ++-- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/stackit_beta_cdn_distribution_update.md b/docs/stackit_beta_cdn_distribution_update.md index f8f26dec9..435429c6a 100644 --- a/docs/stackit_beta_cdn_distribution_update.md +++ b/docs/stackit_beta_cdn_distribution_update.md @@ -13,8 +13,8 @@ stackit beta cdn distribution update [flags] ### Examples ``` - update a CDN distribution with ID "123e4567-e89b-12d3-a456-426614174000" to not use optimizer - $ stackit beta cdn update 123e4567-e89b-12d3-a456-426614174000 --optimizer=false + update a CDN distribution with ID "xxx" to not use optimizer + $ stackit beta cdn distribution update xxx --optimizer=false ``` ### Options diff --git a/go.mod b/go.mod index 11590a48d..45355a2c5 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.20.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 - github.com/stackitcloud/stackit-sdk-go/services/cdn v1.8.1 + github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 diff --git a/go.sum b/go.sum index 709f665a1..1a3cb2015 100644 --- a/go.sum +++ b/go.sum @@ -604,10 +604,10 @@ github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98e github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 h1:P24WoKPt14dfUiUJ4czIv+IiVmdCFQGrKgVtw23fxNg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= -github.com/stackitcloud/stackit-sdk-go/services/cdn v1.8.1 h1:CiOlfCsCDwHP0kas7qyhfp5XtL2kVmn9e4wjtc3LO10= -github.com/stackitcloud/stackit-sdk-go/services/cdn v1.8.1/go.mod h1:PyZ6g9JsGZZyeISAF+5E7L1lAlMnmbl2YbPj5Teu8to= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 h1:PiNC8VmLqi1WUnBSPefjDXThD43Fvb87p+Y6H8onGA0= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1/go.mod h1:Nnfe/Zv4Z8F56Ljw/MfXjL0/2Ajia4bGuL/CZuvIXk8= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 h1:+96JOe4oS9BhdH4kHfc5jcl9DVIZiHrMN0/PXn8uWoI= @@ -624,8 +624,6 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 h1:ZyaB4jL71 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= -github.com/stackitcloud/stackit-sdk-go/services/logs v0.3.0 h1:N1gerABK2vH7/PBkxZeaWYJ7dz3rjeCHuto+FAuGx3w= -github.com/stackitcloud/stackit-sdk-go/services/logs v0.3.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxeB69IIpANev/jw6HIw2yfh/HO7w= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= diff --git a/internal/cmd/beta/cdn/distribution/update/update.go b/internal/cmd/beta/cdn/distribution/update/update.go index 07fa3022a..0c6662e60 100644 --- a/internal/cmd/beta/cdn/distribution/update/update.go +++ b/internal/cmd/beta/cdn/distribution/update/update.go @@ -82,8 +82,8 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Args: args.SingleArg(argDistributionID, utils.ValidateUUID), Example: examples.Build( examples.NewExample( - `update a CDN distribution with ID "123e4567-e89b-12d3-a456-426614174000" to not use optimizer`, - `$ stackit beta cdn update 123e4567-e89b-12d3-a456-426614174000 --optimizer=false`, + `update a CDN distribution with ID "xxx" to not use optimizer`, + `$ stackit beta cdn distribution update xxx --optimizer=false`, ), ), RunE: func(cmd *cobra.Command, inputArgs []string) error { From 07489180372d95dc37da853ce81bcf6cdf02499c Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:17:18 +0100 Subject: [PATCH 327/422] fix: remove deprecated refresh token usage (#1255) relates to STACKITCLI-316 --- go.mod | 4 +- go.sum | 8 +- internal/pkg/auth/auth_test.go | 118 ++++++++++++--------------- internal/pkg/auth/service_account.go | 35 +++----- 4 files changed, 73 insertions(+), 92 deletions(-) diff --git a/go.mod b/go.mod index 45355a2c5..bbc10d8c3 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.0 require ( github.com/fatih/color v1.18.0 github.com/goccy/go-yaml v1.19.2 - github.com/golang-jwt/jwt/v5 v5.3.0 + github.com/golang-jwt/jwt/v5 v5.3.1 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.20.1 + github.com/stackitcloud/stackit-sdk-go/core v0.21.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 diff --git a/go.sum b/go.sum index 1a3cb2015..758229846 100644 --- a/go.sum +++ b/go.sum @@ -252,8 +252,8 @@ github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= -github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= +github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= +github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -600,8 +600,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= -github.com/stackitcloud/stackit-sdk-go/core v0.20.1/go.mod h1:fqto7M82ynGhEnpZU6VkQKYWYoFG5goC076JWXTUPRQ= +github.com/stackitcloud/stackit-sdk-go/core v0.21.1 h1:Y/PcAgM7DPYMNqum0MLv4n1mF9ieuevzcCIZYQfm3Ts= +github.com/stackitcloud/stackit-sdk-go/core v0.21.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 h1:P24WoKPt14dfUiUJ4czIv+IiVmdCFQGrKgVtw23fxNg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= diff --git a/internal/pkg/auth/auth_test.go b/internal/pkg/auth/auth_test.go index f7355f365..4a7c87dbc 100644 --- a/internal/pkg/auth/auth_test.go +++ b/internal/pkg/auth/auth_test.go @@ -4,9 +4,12 @@ import ( "crypto/rand" "crypto/rsa" "crypto/x509" + "encoding/json" "encoding/pem" "fmt" "io" + "net/http" + "net/http/httptest" "strconv" "testing" "time" @@ -235,58 +238,28 @@ func TestAuthenticationConfig(t *testing.T) { func TestInitKeyFlow(t *testing.T) { tests := []struct { - description string - accessTokenSet bool - refreshToken string - saKey string - privateKeySet bool - tokenEndpoint string - isValid bool + description string + saKey string + privateKeySet bool + isValid bool }{ { - description: "base", - accessTokenSet: true, - refreshToken: "refresh_token", - saKey: testServiceAccountKey, - privateKeySet: true, - tokenEndpoint: "token_url", - isValid: true, + description: "base", + saKey: testServiceAccountKey, + privateKeySet: true, + isValid: true, }, { - description: "invalid_service_account_key", - accessTokenSet: true, - refreshToken: "refresh_token", - saKey: "", - privateKeySet: true, - tokenEndpoint: "token_url", - isValid: false, - }, - { - description: "invalid_private_key", - accessTokenSet: true, - refreshToken: "refresh_token", - saKey: testServiceAccountKey, - privateKeySet: false, - tokenEndpoint: "token_url", - isValid: false, - }, - { - description: "invalid_access_token", - accessTokenSet: false, - refreshToken: "refresh_token", - saKey: testServiceAccountKey, - privateKeySet: true, - tokenEndpoint: "token_url", - isValid: false, + description: "invalid_service_account_key", + saKey: "", + privateKeySet: true, + isValid: false, }, { - description: "empty_refresh_token", - accessTokenSet: false, - refreshToken: "", - saKey: testServiceAccountKey, - privateKeySet: true, - tokenEndpoint: "token_url", - isValid: false, + description: "no_private_key_set", + saKey: testServiceAccountKey, + privateKeySet: false, + isValid: false, }, } @@ -297,13 +270,11 @@ func TestInitKeyFlow(t *testing.T) { authFields := make(map[authFieldKey]string) var accessToken string var err error - if tt.accessTokenSet { - accessTokenJWT := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.RegisteredClaims{ - ExpiresAt: jwt.NewNumericDate(timestamp)}) - accessToken, err = accessTokenJWT.SignedString(testSigningKey) - if err != nil { - t.Fatalf("Get test access token as string: %s", err) - } + accessTokenJWT := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(timestamp)}) + accessToken, err = accessTokenJWT.SignedString(testSigningKey) + if err != nil { + t.Fatalf("Get test access token as string: %s", err) } if tt.privateKeySet { privateKey, err := generatePrivateKey() @@ -313,16 +284,42 @@ func TestInitKeyFlow(t *testing.T) { authFields[PRIVATE_KEY] = string(privateKey) } authFields[ACCESS_TOKEN] = accessToken - authFields[REFRESH_TOKEN] = tt.refreshToken authFields[SERVICE_ACCOUNT_KEY] = tt.saKey - authFields[TOKEN_CUSTOM_ENDPOINT] = tt.tokenEndpoint + + // Mock server to avoid HTTP calls + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + resp := clients.TokenResponseBody{ + AccessToken: accessToken, + ExpiresIn: 3600, + TokenType: "Bearer", + } + jsonResp, err := json.Marshal(resp) + if err != nil { + t.Fatalf("Failed to marshal json: %v", err) + } + _, err = w.Write(jsonResp) + if err != nil { + t.Fatalf("Failed to write response: %v", err) + } + })) + defer server.Close() + authFields[TOKEN_CUSTOM_ENDPOINT] = server.URL + err = SetAuthFieldMap(authFields) if err != nil { t.Fatalf("Failed to set in auth storage: %v", err) } keyFlowWithStorage, err := initKeyFlowWithStorage() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("Expected no error but error was returned: %v", err) + } + getAccessToken, err := keyFlowWithStorage.keyFlow.GetAccessToken() if !tt.isValid { if err == nil { t.Fatalf("Expected error but no error was returned") @@ -331,15 +328,8 @@ func TestInitKeyFlow(t *testing.T) { if err != nil { t.Fatalf("Expected no error but error was returned: %v", err) } - expectedToken := &clients.TokenResponseBody{ - AccessToken: accessToken, - ExpiresIn: int(timestamp.Unix()), - RefreshToken: tt.refreshToken, - Scope: "", - TokenType: "Bearer", - } - if !cmp.Equal(*expectedToken, keyFlowWithStorage.keyFlow.GetToken()) { - t.Errorf("The returned result is wrong. Expected %+v, got %+v", expectedToken, keyFlowWithStorage.keyFlow.GetToken()) + if !cmp.Equal(accessToken, getAccessToken) { + t.Errorf("The returned result is wrong. Expected %+v, got %+v", accessToken, getAccessToken) } } }) diff --git a/internal/pkg/auth/service_account.go b/internal/pkg/auth/service_account.go index 1f1b01729..02449e2cc 100644 --- a/internal/pkg/auth/service_account.go +++ b/internal/pkg/auth/service_account.go @@ -14,7 +14,6 @@ import ( type keyFlowInterface interface { GetAccessToken() (string, error) GetConfig() clients.KeyFlowConfig - GetToken() clients.TokenResponseBody RoundTrip(*http.Request) (*http.Response, error) } @@ -32,7 +31,7 @@ var _ http.RoundTripper = &keyFlowWithStorage{} // AuthenticateServiceAccount checks the type of the provided roundtripper, // authenticates the CLI accordingly and store the credentials. -// For the key flow, it fetches an access and refresh token from the Service Account API. +// For the key flow, it fetches an access token from the Service Account API. // For the token flow, it just stores the provided token and doesn't check if it is valid. // It returns the email associated with the service account // If disableWriting is set to true the credentials are not stored on disk (keyring, file). @@ -56,7 +55,6 @@ func AuthenticateServiceAccount(p *print.Printer, rt http.RoundTripper, disableW } authFields[ACCESS_TOKEN] = accessToken - authFields[REFRESH_TOKEN] = flow.GetToken().RefreshToken authFields[SERVICE_ACCOUNT_KEY] = string(saKeyBytes) authFields[PRIVATE_KEY] = flow.GetConfig().PrivateKey case tokenFlowInterface: @@ -100,8 +98,6 @@ func AuthenticateServiceAccount(p *print.Printer, rt http.RoundTripper, disableW // initKeyFlowWithStorage initializes the keyFlow from the SDK and creates a keyFlowWithStorage struct that uses that keyFlow func initKeyFlowWithStorage() (*keyFlowWithStorage, error) { authFields := map[authFieldKey]string{ - ACCESS_TOKEN: "", - REFRESH_TOKEN: "", SERVICE_ACCOUNT_KEY: "", PRIVATE_KEY: "", TOKEN_CUSTOM_ENDPOINT: "", @@ -110,12 +106,6 @@ func initKeyFlowWithStorage() (*keyFlowWithStorage, error) { if err != nil { return nil, fmt.Errorf("get from auth storage: %w", err) } - if authFields[ACCESS_TOKEN] == "" { - return nil, fmt.Errorf("access token not set") - } - if authFields[REFRESH_TOKEN] == "" { - return nil, fmt.Errorf("refresh token not set") - } var serviceAccountKey = &clients.ServiceAccountKeyResponse{} err = json.Unmarshal([]byte(authFields[SERVICE_ACCOUNT_KEY]), serviceAccountKey) @@ -134,10 +124,6 @@ func initKeyFlowWithStorage() (*keyFlowWithStorage, error) { if err != nil { return nil, fmt.Errorf("initialize key flow: %w", err) } - err = keyFlow.SetToken(authFields[ACCESS_TOKEN], authFields[REFRESH_TOKEN]) - if err != nil { - return nil, fmt.Errorf("set access and refresh token: %w", err) - } // create keyFlowWithStorage roundtripper that stores the credentials after executing a request keyFlowWithStorage := &keyFlowWithStorage{ @@ -146,21 +132,26 @@ func initKeyFlowWithStorage() (*keyFlowWithStorage, error) { return keyFlowWithStorage, nil } -// The keyFlowWithStorage Roundtrip executes the keyFlow roundtrip and then stores the access and refresh tokens +// The keyFlowWithStorage Roundtrip executes the keyFlow roundtrip and then stores the access token func (kf *keyFlowWithStorage) RoundTrip(req *http.Request) (*http.Response, error) { resp, err := kf.keyFlow.RoundTrip(req) - token := kf.keyFlow.GetToken() - accessToken := token.AccessToken - refreshToken := token.RefreshToken + accessToken, getTokenErr := kf.keyFlow.GetAccessToken() + if getTokenErr != nil { + return nil, fmt.Errorf("get access token: %w", getTokenErr) + } + tokenValues := map[authFieldKey]string{ - ACCESS_TOKEN: accessToken, - REFRESH_TOKEN: refreshToken, + ACCESS_TOKEN: accessToken, } storageErr := SetAuthFieldMap(tokenValues) if storageErr != nil { - return nil, fmt.Errorf("set access and refresh token in the storage: %w", err) + // If the request was successful, but storing the token failed we still return the response and a nil error + if err == nil { + return resp, nil + } + return nil, fmt.Errorf("set access token in the storage: %w", err) } return resp, err From c6c3ee287427e872979013bdbea8f6852b5c5549 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:23:43 +0100 Subject: [PATCH 328/422] chore: update sfs module to v1 GA api (#1254) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bbc10d8c3..2a24ab4b6 100644 --- a/go.mod +++ b/go.mod @@ -273,7 +273,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 - github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 + github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.40.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 758229846..a02200fee 100644 --- a/go.sum +++ b/go.sum @@ -656,8 +656,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 h1:XV3pPX github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3/go.mod h1:YNJJ1jwBWjEdLH6vECuzoslJY9jQThIvDvTa30J3D0U= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aSfJPMBBcXrG/BZiLLZRvvGJesRdll4bLP7jetuKA= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= -github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0 h1:DRp1p0Gb1YZSnFXgkiKTHQD9bFfqn6OC3PcsDjqGJiw= -github.com/stackitcloud/stackit-sdk-go/services/sfs v0.2.0/go.mod h1:XHOtGgBwwCqPSoQt2ojIRb/BeOd4kICwb9RuMXXFGt8= +github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= +github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0 h1:Dab1jzN0u9c67lvELoWf1RuagjO3eUBRytoX8SYL8Zs= github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 h1:KgIRTw4gpxx8qoiaLGLbXPVDcBgCxPl60gigw+tizYc= From e26be3cdb9299e351363f367c5c13f167ccc4561 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:03:31 +0100 Subject: [PATCH 329/422] fix: use os.Stdin.Fd instead of syscall.Stdin (#1256) relates to STACKITCLI-315 --- internal/pkg/print/print.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/internal/pkg/print/print.go b/internal/pkg/print/print.go index 6754db285..5f9bc398f 100644 --- a/internal/pkg/print/print.go +++ b/internal/pkg/print/print.go @@ -6,15 +6,13 @@ import ( "encoding/json" "errors" "fmt" - "syscall" - - "github.com/goccy/go-yaml" - "log/slog" "os" "os/exec" "strings" + "github.com/goccy/go-yaml" + "github.com/fatih/color" "github.com/lmittmann/tint" "github.com/mattn/go-colorable" @@ -182,13 +180,16 @@ func (p *Printer) PromptForEnter(prompt string) error { func (p *Printer) PromptForPassword(prompt string) (string, error) { p.Cmd.PrintErr(prompt) defer p.Outputln("") - if term.IsTerminal(syscall.Stdin) { - bytePassword, err := term.ReadPassword(syscall.Stdin) + + fd := int(os.Stdin.Fd()) + if term.IsTerminal(fd) { + bytePassword, err := term.ReadPassword(fd) if err != nil { return "", fmt.Errorf("read password: %w", err) } return string(bytePassword), nil } + // Fallback for non-terminal environments reader := bufio.NewReader(p.Cmd.InOrStdin()) pw, err := reader.ReadString('\n') From a653a9435e9b12f32a6116c10c9414551479dad1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:53:18 +0100 Subject: [PATCH 330/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#1245) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serviceaccount](https://github.com/stackitcloud/stackit-sdk-go) from 0.11.3 to 0.11.4. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/secretsmanager/v0.11.3...services/secretsmanager/v0.11.4) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serviceaccount dependency-version: 0.11.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2a24ab4b6..a440455da 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 diff --git a/go.sum b/go.sum index a02200fee..f98133aa2 100644 --- a/go.sum +++ b/go.sum @@ -652,8 +652,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 h1:pAoqz4K17 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3 h1:XV3pPXpdvQjR5Z90FFutU4iqCHfejDYQAL840Y4ztLM= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.3/go.mod h1:YNJJ1jwBWjEdLH6vECuzoslJY9jQThIvDvTa30J3D0U= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 h1:WU76mZkJP6diMDjGFqM8On6fZhUDmGcy6ppX0+kWx9Y= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6/go.mod h1:hRllU+yEJM6ovrLeXwVeT5hI70ftPKjX4z/Nj8TZqJw= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aSfJPMBBcXrG/BZiLLZRvvGJesRdll4bLP7jetuKA= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= From 39a92d7ff5740048252d1905dfcc81188d17bea9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:03:09 +0100 Subject: [PATCH 331/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mongodbflex (#1246) Bumps [github.com/stackitcloud/stackit-sdk-go/services/mongodbflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.5.5 to 1.5.6. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/mongodbflex/v1.5.5...services/mongodbflex/v1.5.6) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/mongodbflex dependency-version: 1.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a440455da..ac6fbcdbf 100644 --- a/go.mod +++ b/go.mod @@ -25,7 +25,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 - github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5 + github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 diff --git a/go.sum b/go.sum index f98133aa2..60eadccfa 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxe github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5 h1:tPISli81nuvLc5DPqgpvYPSjTySV0wXtMtkfdNXG4CU= -github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.5/go.mod h1:G/UD3tzPzzu79MiFWUYqogxdLMB+YArNHR6Yqz7Cqr0= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN8ZzdoY8d6VbF903zFpGjzqrU0FN27rJPg= +github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 h1:nsC6oA1whA4ibxEuD+0Osngmnpz8dLdV6bv+9jYP4Eo= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2/go.mod h1:WA6QlAAQ8aaw81W0VSVoDrxOfchGkdtmn2jQL/ub/50= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= From f3bba1d94ce247049b0da6642a16c11fa5d01357 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:34:40 +0100 Subject: [PATCH 332/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/secretsmanager (#1247) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/stackitcloud/stackit-sdk-go/services/secretsmanager](https://github.com/stackitcloud/stackit-sdk-go) from 0.14.0 to 0.14.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.14.0...services/secretsmanager/v0.14.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/secretsmanager dependency-version: 0.14.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gökce Gök Klingel <161626272+GokceGK@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ac6fbcdbf..7d4c60833 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 - github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 + github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 diff --git a/go.sum b/go.sum index 60eadccfa..a30b80d37 100644 --- a/go.sum +++ b/go.sum @@ -646,8 +646,8 @@ github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXO github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRAVUMsbeoVQhCxb7GpNSmzq15jJuaBUSFo= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0 h1:8cFo0UG2r9kWwUAHRBTAG5wEt4G80+wkWdjQW6DhU6Y= -github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.0/go.mod h1:dMBt/b/LXfXTDLQTCW6PRhBlbl41q7XS+5mAyBezSJk= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 h1:3hZSg3z+4AXa5LbR2Vl38VmSA83ABItE63E53LuyWv8= +github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3/go.mod h1:5unx5r0IgeFCtJDEgsWddtgKvYSw442FDNdhtfyJnQI= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 h1:pAoqz4K17ZWcLusu7Dxkx3HGQAIYCk7SmZeAu9HHUrQ= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= From 13ddd1b4a2b6c871b0516f6b6daa0f6930d0a2c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 07:11:11 +0100 Subject: [PATCH 333/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverbackup (#1258) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serverbackup](https://github.com/stackitcloud/stackit-sdk-go) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/iaas/v1.3.5...services/serverbackup/v1.3.8) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serverbackup dependency-version: 1.3.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7d4c60833..c7f9b4816 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 - github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 + github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 diff --git a/go.sum b/go.sum index a30b80d37..f12966267 100644 --- a/go.sum +++ b/go.sum @@ -648,8 +648,8 @@ github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRA github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 h1:3hZSg3z+4AXa5LbR2Vl38VmSA83ABItE63E53LuyWv8= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3/go.mod h1:5unx5r0IgeFCtJDEgsWddtgKvYSw442FDNdhtfyJnQI= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5 h1:pAoqz4K17ZWcLusu7Dxkx3HGQAIYCk7SmZeAu9HHUrQ= -github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.5/go.mod h1:MBlzqmewliF1LKeOBdOuT+aQrtc3y7p1Kd1fWkjecKQ= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 h1:LLyANBzE8sQa0/49tQBqq4sVLhNgwdqCeQm76srJHWw= +github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8/go.mod h1:/bmg57XZu+bGczzcoumrukiGMPGzI2mOyTT4BVIQUBs= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 h1:WU76mZkJP6diMDjGFqM8On6fZhUDmGcy6ppX0+kWx9Y= From 479798a763ab69bb123d8076483b10f678f00744 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 06:17:36 +0000 Subject: [PATCH 334/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/objectstorage (#1259) Bumps [github.com/stackitcloud/stackit-sdk-go/services/objectstorage](https://github.com/stackitcloud/stackit-sdk-go) from 1.4.2 to 1.4.5. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/runcommand/v1.4.2...services/objectstorage/v1.4.5) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/objectstorage dependency-version: 1.4.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c7f9b4816..d8325b136 100644 --- a/go.mod +++ b/go.mod @@ -269,7 +269,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 diff --git a/go.sum b/go.sum index f12966267..e1fef68ef 100644 --- a/go.sum +++ b/go.sum @@ -630,8 +630,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOw github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN8ZzdoY8d6VbF903zFpGjzqrU0FN27rJPg= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2 h1:nsC6oA1whA4ibxEuD+0Osngmnpz8dLdV6bv+9jYP4Eo= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.2/go.mod h1:WA6QlAAQ8aaw81W0VSVoDrxOfchGkdtmn2jQL/ub/50= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1/go.mod h1:vapb/sJqbHlf+c7pZWdE9GqrbyI8wesGvUc9o7oJ1Xk= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 h1:CAgu3Wsmo8pA1/VWqnqLftMn7X26uDs5zctTci4WG7A= From 18c28c478b44e59d27cf25c3dd0ce30e8935cbbe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 06:24:30 +0000 Subject: [PATCH 335/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1260) Bumps [github.com/stackitcloud/stackit-sdk-go/services/ske](https://github.com/stackitcloud/stackit-sdk-go) from 1.6.0 to 1.6.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.6.0...services/ske/v1.6.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/ske dependency-version: 1.6.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d8325b136..718d07175 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.32.0 diff --git a/go.sum b/go.sum index e1fef68ef..04cea02eb 100644 --- a/go.sum +++ b/go.sum @@ -658,8 +658,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aS github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0 h1:Dab1jzN0u9c67lvELoWf1RuagjO3eUBRytoX8SYL8Zs= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.0/go.mod h1:NzcTU5GGlUF6Lys3Ra7ylRj4ZKxJr3f/29/yoE5tjPI= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 h1:c+nQMvSml08cdRF1kE24vCw0r/l56olP/svQyhcnKOs= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3/go.mod h1:1Jr+ImrmPERxbYnlTy6O2aSZYNnREf2qQyysv6YC1RY= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 h1:KgIRTw4gpxx8qoiaLGLbXPVDcBgCxPl60gigw+tizYc= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= From b600032fe29d3926626a65fa10e63dc9ed70306d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 09:41:06 +0100 Subject: [PATCH 336/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/runcommand from 1.3.3 to 1.4.3 (#1262) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/runcommand Bumps [github.com/stackitcloud/stackit-sdk-go/services/runcommand](https://github.com/stackitcloud/stackit-sdk-go) from 1.3.3 to 1.4.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/iaas/v1.3.3...services/runcommand/v1.4.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/runcommand dependency-version: 1.4.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * fix(runcommand): Rename ParameterSchema to ParametersSchema Signed-off-by: Alexander Dahmen --------- Signed-off-by: dependabot[bot] Signed-off-by: Alexander Dahmen Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexander Dahmen --- go.mod | 2 +- go.sum | 4 ++-- internal/cmd/server/command/template/describe/describe.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 718d07175..6bdebecd0 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 - github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 + github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 diff --git a/go.sum b/go.sum index 04cea02eb..0b4587bc2 100644 --- a/go.sum +++ b/go.sum @@ -644,8 +644,8 @@ github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRugh github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXOvRNmSYMeF0qQ2+w4/ez04YutVDz73hSMuuOJ54= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3 h1:ShK5AFExNRAVUMsbeoVQhCxb7GpNSmzq15jJuaBUSFo= -github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.3.3/go.mod h1:P1uhYJpSvhUXTnTGSEZqWf97J2+1Z6VuVwmUOlnhiwI= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 h1:AiGNJmpQ/f9cglaIQQ4SyePbtCI3K1DQLNvqVN9jKSo= +github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3/go.mod h1:U/q0V89fvCF2O1ZJfi68/Chie9YY/5s7xBHI1Klq7wA= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 h1:3hZSg3z+4AXa5LbR2Vl38VmSA83ABItE63E53LuyWv8= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3/go.mod h1:5unx5r0IgeFCtJDEgsWddtgKvYSw442FDNdhtfyJnQI= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 h1:LLyANBzE8sQa0/49tQBqq4sVLhNgwdqCeQm76srJHWw= diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index a70ee5ae2..99c6f4941 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -113,8 +113,8 @@ func outputResult(p *print.Printer, outputFormat string, commandTemplate runcomm table.AddRow("OS TYPE", utils.JoinStringPtr(commandTemplate.OsType, "\n")) table.AddSeparator() } - if commandTemplate.ParameterSchema != nil { - table.AddRow("PARAMS", *commandTemplate.ParameterSchema) + if commandTemplate.ParametersSchema != nil { + table.AddRow("PARAMS", *commandTemplate.ParametersSchema) } else { table.AddRow("PARAMS", "") } From d89326952981caece2ed1822d41ac74e8eed3e71 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Fri, 6 Feb 2026 10:28:33 +0100 Subject: [PATCH 337/422] Dependabot/go modules/GitHub.com/stackitcloud/stackit sdk go/services/observability 0.16.1 (#1263) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability Bumps [github.com/stackitcloud/stackit-sdk-go/services/observability](https://github.com/stackitcloud/stackit-sdk-go) from 0.15.1 to 0.16.1. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.15.1...services/mongodbflex/v0.16.1) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/observability dependency-version: 0.16.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * fix(observability) suppress linting error, add deprecation warnings * fix(observability) run generate-docs * fix(observability) remove show password from docs because deprecation * fix(docs) generate docs * fix(docs) remove superfluous format placeholder --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/stackit_observability_grafana_describe.md | 7 +------ go.mod | 2 +- go.sum | 4 ++-- .../cmd/observability/grafana/describe/describe.go | 13 +++++++------ 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/docs/stackit_observability_grafana_describe.md b/docs/stackit_observability_grafana_describe.md index 4eea4982a..e44800614 100644 --- a/docs/stackit_observability_grafana_describe.md +++ b/docs/stackit_observability_grafana_describe.md @@ -6,7 +6,6 @@ Shows details of the Grafana configuration of an Observability instance Shows details of the Grafana configuration of an Observability instance. The Grafana dashboard URL and initial credentials (admin user and password) will be shown in the "pretty" output format. These credentials are only valid for first login. Please change the password after first login. After changing, the initial password is no longer valid. -The initial password is hidden by default, if you want to show it use the "--show-password" flag. ``` stackit observability grafana describe INSTANCE_ID [flags] @@ -18,9 +17,6 @@ stackit observability grafana describe INSTANCE_ID [flags] Get details of the Grafana configuration of an Observability instance with ID "xxx" $ stackit observability grafana describe xxx - Get details of the Grafana configuration of an Observability instance with ID "xxx" and show the initial admin password - $ stackit observability grafana describe xxx --show-password - Get details of the Grafana configuration of an Observability instance with ID "xxx" in JSON format $ stackit observability grafana describe xxx --output-format json ``` @@ -28,8 +24,7 @@ stackit observability grafana describe INSTANCE_ID [flags] ### Options ``` - -h, --help Help for "stackit observability grafana describe" - -s, --show-password Show password in output + -h, --help Help for "stackit observability grafana describe" ``` ### Options inherited from parent commands diff --git a/go.mod b/go.mod index 6bdebecd0..f3d65c374 100644 --- a/go.mod +++ b/go.mod @@ -270,7 +270,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.1 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 diff --git a/go.sum b/go.sum index 0b4587bc2..d7a59de03 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1 h1:zk+47GhutK2ajO4Yiek0laGm2PdXvY8BvFZc8yHFnSE= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.15.1/go.mod h1:vapb/sJqbHlf+c7pZWdE9GqrbyI8wesGvUc9o7oJ1Xk= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.1 h1:FKeW3uiMXRl6Oau3xE6yBriXh4t7CwPb8QH6PR0uQXM= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.1/go.mod h1:RiknJnL3OuU9wb2lyb80Hu+EnlyDQMG8vejDV7B9a5U= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 h1:CAgu3Wsmo8pA1/VWqnqLftMn7X26uDs5zctTci4WG7A= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3/go.mod h1:VC3vqIQIDN+8SAzhlMdrK4eXeiSaNE1JtjIGFzpgiRI= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= diff --git a/internal/cmd/observability/grafana/describe/describe.go b/internal/cmd/observability/grafana/describe/describe.go index 674104a9b..88b7f70b6 100644 --- a/internal/cmd/observability/grafana/describe/describe.go +++ b/internal/cmd/observability/grafana/describe/describe.go @@ -21,7 +21,8 @@ import ( ) const ( - instanceIdArg = "INSTANCE_ID" + instanceIdArg = "INSTANCE_ID" + // Deprecated: showPasswordFlag is deprecated and will be removed on 2026-07-05. showPasswordFlag = "show-password" ) @@ -35,19 +36,15 @@ func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: fmt.Sprintf("describe %s", instanceIdArg), Short: "Shows details of the Grafana configuration of an Observability instance", - Long: fmt.Sprintf("%s\n%s\n%s", + Long: fmt.Sprintf("%s\n%s", "Shows details of the Grafana configuration of an Observability instance.", `The Grafana dashboard URL and initial credentials (admin user and password) will be shown in the "pretty" output format. These credentials are only valid for first login. Please change the password after first login. After changing, the initial password is no longer valid.`, - `The initial password is hidden by default, if you want to show it use the "--show-password" flag.`, ), Args: args.SingleArg(instanceIdArg, utils.ValidateUUID), Example: examples.Build( examples.NewExample( `Get details of the Grafana configuration of an Observability instance with ID "xxx"`, "$ stackit observability grafana describe xxx"), - examples.NewExample( - `Get details of the Grafana configuration of an Observability instance with ID "xxx" and show the initial admin password`, - "$ stackit observability grafana describe xxx --show-password"), examples.NewExample( `Get details of the Grafana configuration of an Observability instance with ID "xxx" in JSON format`, "$ stackit observability grafana describe xxx --output-format json"), @@ -86,6 +83,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().BoolP(showPasswordFlag, "s", false, "Show password in output") + cobra.CheckErr(cmd.Flags().MarkDeprecated(showPasswordFlag, "This flag is deprecated and will be removed on 2026-07-05.")) } func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { @@ -122,8 +120,10 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, graf } else if grafanaConfigs == nil { return fmt.Errorf("grafanaConfigs is nil") } + p.Warn("GrafanaAdminPassword and GrafanaAdminUser are deprecated and will be removed on 2026-07-05.") return p.OutputResult(outputFormat, grafanaConfigs, func() error { + //nolint:staticcheck // field is deprecated but still supported until 2026-07-05 initialAdminPassword := utils.PtrString(instance.Instance.GrafanaAdminPassword) if !showPassword { initialAdminPassword = "" @@ -136,6 +136,7 @@ func outputResult(p *print.Printer, outputFormat string, showPassword bool, graf table.AddSeparator() table.AddRow("SINGLE SIGN-ON", utils.PtrString(grafanaConfigs.UseStackitSso)) table.AddSeparator() + //nolint:staticcheck // field is deprecated but still supported until 2026-07-05 table.AddRow("INITIAL ADMIN USER (DEFAULT)", utils.PtrString(instance.Instance.GrafanaAdminUser)) table.AddSeparator() table.AddRow("INITIAL ADMIN PASSWORD (DEFAULT)", initialAdminPassword) From 78c23ef4c11990fc001de0478fc7e51439b42a38 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 12:33:57 +0100 Subject: [PATCH 338/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability (#1261) Bumps [github.com/stackitcloud/stackit-sdk-go/services/observability](https://github.com/stackitcloud/stackit-sdk-go) from 0.15.1 to 0.16.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.15.1...services/observability/v0.16.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/observability dependency-version: 0.16.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f3d65c374..2721c94dc 100644 --- a/go.mod +++ b/go.mod @@ -270,7 +270,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.1 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 diff --git a/go.sum b/go.sum index d7a59de03..80346da7c 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.1 h1:FKeW3uiMXRl6Oau3xE6yBriXh4t7CwPb8QH6PR0uQXM= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.1/go.mod h1:RiknJnL3OuU9wb2lyb80Hu+EnlyDQMG8vejDV7B9a5U= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 h1:J/R6iBALMiNpg+JDEx1adH50TM4UTF/KBYFuHENMKIs= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 h1:CAgu3Wsmo8pA1/VWqnqLftMn7X26uDs5zctTci4WG7A= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3/go.mod h1:VC3vqIQIDN+8SAzhlMdrK4eXeiSaNE1JtjIGFzpgiRI= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= From aea81333b557d452cddd00595d0ba5f0b9ac701a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:39:55 +0100 Subject: [PATCH 339/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serverupdate (#1267) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serverupdate](https://github.com/stackitcloud/stackit-sdk-go) from 1.2.3 to 1.2.6. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/iaas/v1.2.3...services/serverupdate/v1.2.6) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serverupdate dependency-version: 1.2.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2721c94dc..8b7a48671 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 - github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 + github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 diff --git a/go.sum b/go.sum index 80346da7c..b55a9a7ce 100644 --- a/go.sum +++ b/go.sum @@ -650,8 +650,8 @@ github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 h1:3hZSg3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3/go.mod h1:5unx5r0IgeFCtJDEgsWddtgKvYSw442FDNdhtfyJnQI= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 h1:LLyANBzE8sQa0/49tQBqq4sVLhNgwdqCeQm76srJHWw= github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8/go.mod h1:/bmg57XZu+bGczzcoumrukiGMPGzI2mOyTT4BVIQUBs= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3 h1:1gLKXD91qOYUpackMuu0PdRwrm2Z8vFK+k8H7SF0xbg= -github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.3/go.mod h1:V34YusCRsq/3bJ/HxUk0wslLjVWWE/QVe70AZ+XrDPE= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 h1:sQ3fdtUjgIL2Ul8nRYVVacHOwi5aSMTGGbYVL30oQBU= +github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6/go.mod h1:3fjlL+9YtuI9Oocl1ZeYIK48ImtY4DwPggFhqAygr7o= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 h1:WU76mZkJP6diMDjGFqM8On6fZhUDmGcy6ppX0+kWx9Y= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6/go.mod h1:hRllU+yEJM6ovrLeXwVeT5hI70ftPKjX4z/Nj8TZqJw= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aSfJPMBBcXrG/BZiLLZRvvGJesRdll4bLP7jetuKA= From 54b2bb600f246636350e76553abf47a80f76af2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 13:46:05 +0000 Subject: [PATCH 340/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/git (#1268) Bumps [github.com/stackitcloud/stackit-sdk-go/services/git](https://github.com/stackitcloud/stackit-sdk-go) from 0.10.1 to 0.10.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.10.1...services/git/v0.10.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/git dependency-version: 0.10.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8b7a48671..5caafedbe 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 - github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 + github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 diff --git a/go.sum b/go.sum index b55a9a7ce..469be0b68 100644 --- a/go.sum +++ b/go.sum @@ -612,8 +612,8 @@ github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwi github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 h1:+96JOe4oS9BhdH4kHfc5jcl9DVIZiHrMN0/PXn8uWoI= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= -github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1 h1:3JKXfI5hdcXcRVBjUZg5qprXG5rDmPnM6dsvplMk/vg= -github.com/stackitcloud/stackit-sdk-go/services/git v0.10.1/go.mod h1:3nTaj8IGjNNGYUD2CpuXkXwc5c4giTUmoPggFhjVFxo= +github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 h1:VIjkSofZz9utOOkBdNZCIb07P/JdKc1kHV1P8Rq9dLc= +github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3/go.mod h1:EJk1Ss9GTel2NPIu/w3+x9XcQcEd2k3ibea5aQDzVhQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u+YU3brMhQwYZYxu809o3uW5SH4HA= From b0c584135fb4944eb5810949a24166a1b91c3dc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 13:52:58 +0000 Subject: [PATCH 341/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/logme (#1269) Bumps [github.com/stackitcloud/stackit-sdk-go/services/logme](https://github.com/stackitcloud/stackit-sdk-go) from 0.25.3 to 0.25.6. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/logme/v0.25.3...services/logme/v0.25.6) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/logme dependency-version: 0.25.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5caafedbe..e94899e7e 100644 --- a/go.mod +++ b/go.mod @@ -267,7 +267,7 @@ require ( github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 - github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 + github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 diff --git a/go.sum b/go.sum index 469be0b68..5fe4587a0 100644 --- a/go.sum +++ b/go.sum @@ -622,8 +622,8 @@ github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1 github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 h1:ZyaB4jL71p+FWI/cXgP+p6t4iw1oAeGbLLOz4cs3dmI= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3 h1:fUQLWs2WsXFh+FtFDYOm1kv/gJrGBZLjhVOXJOuYfFY= -github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.3/go.mod h1:305j9bvzJ+3c4csOw4SUfLSSxRbkpL0osbvqMI89FeM= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7XpsAzTn0W+C/oP5flnLVgIh5u3O/P0o= +github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxeB69IIpANev/jw6HIw2yfh/HO7w= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= From 8329606093f57f36094fbd3d6144dd6d65f50bcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:00:18 +0000 Subject: [PATCH 342/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/intake (#1271) Bumps [github.com/stackitcloud/stackit-sdk-go/services/intake](https://github.com/stackitcloud/stackit-sdk-go) from 0.4.1 to 0.4.4. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/alb/v0.4.1...services/intake/v0.4.4) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/intake dependency-version: 0.4.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e94899e7e..5a7d563ed 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 - github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 + github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 diff --git a/go.sum b/go.sum index 5fe4587a0..1038fc579 100644 --- a/go.sum +++ b/go.sum @@ -616,8 +616,8 @@ github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 h1:VIjkSofZz9utOOkBd github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3/go.mod h1:EJk1Ss9GTel2NPIu/w3+x9XcQcEd2k3ibea5aQDzVhQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= -github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1 h1:WCSuqD6AoOD/D8u+YU3brMhQwYZYxu809o3uW5SH4HA= -github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.1/go.mod h1:qq6rNvOuSQ1HDZie8gy4Wzso+a9DrgOODNPyKeBljK4= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 h1:cbXM7jUBCL7A5zxJKFWolRIDl45sdJMMMAzeumeIEOA= +github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4/go.mod h1:z+7KKZf0uHXU/Kb4CRs/oaBrXRJ01LpiD0OH11MXLOk= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1R+fL5aX5nEoxL6ODVJl3emzho= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 h1:ZyaB4jL71p+FWI/cXgP+p6t4iw1oAeGbLLOz4cs3dmI= From 5272d8c66e0aa3f0a29c33578e6a353f5283a2e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 10:35:45 +0100 Subject: [PATCH 343/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/opensearch (#1275) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5a7d563ed..3ac0239fe 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 - github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 + github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 diff --git a/go.sum b/go.sum index 1038fc579..be19693b3 100644 --- a/go.sum +++ b/go.sum @@ -634,8 +634,8 @@ github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI= github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 h1:J/R6iBALMiNpg+JDEx1adH50TM4UTF/KBYFuHENMKIs= github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3 h1:CAgu3Wsmo8pA1/VWqnqLftMn7X26uDs5zctTci4WG7A= -github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.3/go.mod h1:VC3vqIQIDN+8SAzhlMdrK4eXeiSaNE1JtjIGFzpgiRI= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177Ojn8OvXIOUbRSwtx7L59jhxDPrZEQFOfQ= +github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2/go.mod h1:rPwdDiCx0eZ+yKiy6Wo6uv76LuCgFlQxkomvun1c740= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 h1:a9XjDC01il+3IDQIDgg5qcJBYcsu5rrTJyMfJZPyvCg= From 93791453d84f18601779e14b5186fc32077bb97b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 09:42:31 +0000 Subject: [PATCH 344/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/postgresflex (#1274) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3ac0239fe..10e309e59 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 - github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 + github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 diff --git a/go.sum b/go.sum index be19693b3..7e7f01485 100644 --- a/go.sum +++ b/go.sum @@ -636,8 +636,8 @@ github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 h1:J/R6iBA github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177Ojn8OvXIOUbRSwtx7L59jhxDPrZEQFOfQ= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2 h1:uQIpj0phDRGrV78/vhtULwxaO2cBdHwqZcFKYUrH1Hs= -github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.2/go.mod h1:rPwdDiCx0eZ+yKiy6Wo6uv76LuCgFlQxkomvun1c740= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQx954yI8fuQmxXwRf/myqAdLg2KvxImp00g= +github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5/go.mod h1:xmAWk9eom8wznvLuLfm0F4xyeiBX8LaggXsKFmos+dw= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 h1:a9XjDC01il+3IDQIDgg5qcJBYcsu5rrTJyMfJZPyvCg= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3/go.mod h1:tjbSLF5+5JFx+qNazqhakqfPlCZPzque9R4XqRZzTRc= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= From 016e33f7e9a933efc54768069b7c32cde508ccc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 12:17:49 +0100 Subject: [PATCH 345/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/authorization (#1273) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 10e309e59..6ad5697b5 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.21.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 diff --git a/go.sum b/go.sum index 7e7f01485..bf6ec3575 100644 --- a/go.sum +++ b/go.sum @@ -604,8 +604,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.21.1 h1:Y/PcAgM7DPYMNqum0MLv4n1mF github.com/stackitcloud/stackit-sdk-go/core v0.21.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 h1:P24WoKPt14dfUiUJ4czIv+IiVmdCFQGrKgVtw23fxNg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0 h1:4YFY5PG4vP/NiEP1uxCwh+kQHEU7iHG6syuFD7NPqcw= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.0/go.mod h1:v4xdRA5P8Vr+zLdHh+ODgspN0WJG04wLImIJoYjrPK4= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 h1:JMKEeNQpA+Mb1DRpY3MRQL3pko5JjUWGrevN0xOrx+4= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 h1:PiNC8VmLqi1WUnBSPefjDXThD43Fvb87p+Y6H8onGA0= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1/go.mod h1:Nnfe/Zv4Z8F56Ljw/MfXjL0/2Ajia4bGuL/CZuvIXk8= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= From b0476002f76eef48e209b80a01ce85dde2089a97 Mon Sep 17 00:00:00 2001 From: Manuel Vaas <34416897+Manuelvaas@users.noreply.github.com> Date: Tue, 10 Feb 2026 13:47:43 +0100 Subject: [PATCH 346/422] feat(iaas): list NICs for project (#1242) relates to STACKITCLI-307 and #1214 --- docs/stackit_network-interface_list.md | 3 + internal/cmd/network-interface/list/list.go | 116 +++++++++++++--- .../cmd/network-interface/list/list_test.go | 126 ++++++++++++++++-- 3 files changed, 214 insertions(+), 31 deletions(-) diff --git a/docs/stackit_network-interface_list.md b/docs/stackit_network-interface_list.md index f202a6667..50276fe12 100644 --- a/docs/stackit_network-interface_list.md +++ b/docs/stackit_network-interface_list.md @@ -13,6 +13,9 @@ stackit network-interface list [flags] ### Examples ``` + Lists all network interfaces + $ stackit network-interface list + Lists all network interfaces with network ID "xxx" $ stackit network-interface list --network-id xxx diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index 21c41a260..b3ac79c9d 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -1,9 +1,12 @@ package list import ( + "cmp" "context" "fmt" + "slices" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" @@ -30,7 +33,7 @@ type inputModel struct { *globalflags.GlobalFlagModel Limit *int64 LabelSelector *string - NetworkId string + NetworkId *string } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -40,6 +43,11 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Long: "Lists all network interfaces of a network.", Args: args.NoArgs, Example: examples.Build( + // Note: this subcommand uses two different API enpoints, which makes the implementation somewhat messy + examples.NewExample( + `Lists all network interfaces`, + `$ stackit network-interface list`, + ), examples.NewExample( `Lists all network interfaces with network ID "xxx"`, `$ stackit network-interface list --network-id xxx`, @@ -70,32 +78,52 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - // Call API - req := buildRequest(ctx, model, apiClient) + if model.NetworkId == nil { + // Call API to get all NICs in the Project + req := buildProjectRequest(ctx, model, apiClient) + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list network interfaces: %w", err) + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + projectLabel = model.ProjectId + } + + // Truncate output + items := utils.GetSliceFromPointer(resp.Items) + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] + } + + return outputProjectResult(params.Printer, model.OutputFormat, items, projectLabel) + } + + // Call API to get NICs for one Network + req := buildNetworkRequest(ctx, model, apiClient) + resp, err := req.Execute() if err != nil { return fmt.Errorf("list network interfaces: %w", err) } - if resp.Items == nil || len(*resp.Items) == 0 { - networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId) - if err != nil { - params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) - networkLabel = model.NetworkId - } else if networkLabel == "" { - networkLabel = model.NetworkId - } - params.Printer.Info("No network interfaces found for network %q\n", networkLabel) - return nil + networkLabel, err := iaasUtils.GetNetworkName(ctx, apiClient, model.ProjectId, model.Region, *model.NetworkId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get network name: %v", err) + networkLabel = *model.NetworkId + } else if networkLabel == "" { + networkLabel = *model.NetworkId } // Truncate output - items := *resp.Items + items := utils.GetSliceFromPointer(resp.Items) if model.Limit != nil && len(items) > int(*model.Limit) { items = items[:*model.Limit] } - return outputResult(params.Printer, model.OutputFormat, items) + return outputNetworkResult(params.Printer, model.OutputFormat, items, networkLabel) }, } configureFlags(cmd) @@ -106,9 +134,6 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Var(flags.UUIDFlag(), networkIdFlag, "Network ID") cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") cmd.Flags().String(labelSelectorFlag, "", "Filter by label") - - err := flags.MarkFlagsRequired(cmd, networkIdFlag) - cobra.CheckErr(err) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { @@ -129,15 +154,15 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, GlobalFlagModel: globalFlags, Limit: limit, LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), - NetworkId: flags.FlagToStringValue(p, cmd, networkIdFlag), + NetworkId: flags.FlagToStringPointer(p, cmd, networkIdFlag), } p.DebugInputModel(model) return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNicsRequest { - req := apiClient.ListNics(ctx, model.ProjectId, model.Region, model.NetworkId) +func buildProjectRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListProjectNICsRequest { + req := apiClient.ListProjectNICs(ctx, model.ProjectId, model.Region) if model.LabelSelector != nil { req = req.LabelSelector(*model.LabelSelector) } @@ -145,8 +170,55 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req } -func outputResult(p *print.Printer, outputFormat string, nics []iaas.NIC) error { +func buildNetworkRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListNicsRequest { + req := apiClient.ListNics(ctx, model.ProjectId, model.Region, *model.NetworkId) + if model.LabelSelector != nil { + req = req.LabelSelector(*model.LabelSelector) + } + + return req +} + +func outputProjectResult(p *print.Printer, outputFormat string, nics []iaas.NIC, projectLabel string) error { return p.OutputResult(outputFormat, nics, func() error { + if len(nics) == 0 { + p.Outputf("No network interfaces found for project %q\n", projectLabel) + return nil + } + + slices.SortFunc(nics, func(a, b iaas.NIC) int { + return cmp.Compare(utils.PtrValue(a.NetworkId), utils.PtrValue(b.NetworkId)) + }) + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "NETWORK ID", "NIC SECURITY", "DEVICE ID", "IPv4 ADDRESS", "STATUS", "TYPE") + + for _, nic := range nics { + table.AddRow( + utils.PtrString(nic.Id), + utils.PtrString(nic.Name), + utils.PtrString(nic.NetworkId), + utils.PtrString(nic.NicSecurity), + utils.PtrString(nic.Device), + utils.PtrString(nic.Ipv4), + utils.PtrString(nic.Status), + utils.PtrString(nic.Type), + ) + table.AddSeparator() + } + + p.Outputln(table.Render()) + return nil + }) +} + +func outputNetworkResult(p *print.Printer, outputFormat string, nics []iaas.NIC, networkLabel string) error { + return p.OutputResult(outputFormat, nics, func() error { + if len(nics) == 0 { + p.Outputf("No network interfaces found for network %q\n", networkLabel) + return nil + } + table := tables.NewTable() table.SetHeader("ID", "NAME", "NIC SECURITY", "DEVICE ID", "IPv4 ADDRESS", "STATUS", "TYPE") diff --git a/internal/cmd/network-interface/list/list_test.go b/internal/cmd/network-interface/list/list_test.go index d04c1d9b7..6c8d5b01e 100644 --- a/internal/cmd/network-interface/list/list_test.go +++ b/internal/cmd/network-interface/list/list_test.go @@ -53,7 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { }, Limit: utils.Ptr(int64(10)), LabelSelector: utils.Ptr(testLabelSelector), - NetworkId: testNetworkId, + NetworkId: utils.Ptr(testNetworkId), } for _, mod := range mods { mod(model) @@ -61,7 +61,16 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { return model } -func fixtureRequest(mods ...func(request *iaas.ApiListNicsRequest)) iaas.ApiListNicsRequest { +func fixtureProjectRequest(mods ...func(request *iaas.ApiListProjectNICsRequest)) iaas.ApiListProjectNICsRequest { + request := testClient.ListProjectNICs(testCtx, testProjectId, testRegion) + request = request.LabelSelector(testLabelSelector) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixtureNetworkRequest(mods ...func(request *iaas.ApiListNicsRequest)) iaas.ApiListNicsRequest { request := testClient.ListNics(testCtx, testProjectId, testRegion, testNetworkId) request = request.LabelSelector(testLabelSelector) for _, mod := range mods { @@ -148,7 +157,35 @@ func TestParseInput(t *testing.T) { } } -func TestBuildRequest(t *testing.T) { +func TestBuildProjectRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiListProjectNICsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureProjectRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildProjectRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildNetworkRequest(t *testing.T) { tests := []struct { description string model *inputModel @@ -157,13 +194,13 @@ func TestBuildRequest(t *testing.T) { { description: "base", model: fixtureInputModel(), - expectedRequest: fixtureRequest(), + expectedRequest: fixtureNetworkRequest(), }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildNetworkRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), @@ -176,7 +213,7 @@ func TestBuildRequest(t *testing.T) { } } -func TestOutputResult(t *testing.T) { +func TestOutputProjectResult(t *testing.T) { type args struct { outputFormat string nics []iaas.NIC @@ -187,8 +224,79 @@ func TestOutputResult(t *testing.T) { wantErr bool }{ { - name: "empty", - args: args{}, + name: "nil as NIC-slice", + args: args{ + outputFormat: print.PrettyOutputFormat, + }, + wantErr: false, + }, + { + name: "empty NIC-slice", + args: args{ + outputFormat: print.PrettyOutputFormat, + nics: []iaas.NIC{}, + }, + wantErr: false, + }, + { + name: "empty NIC in NIC-slice", + args: args{ + outputFormat: print.PrettyOutputFormat, + nics: []iaas.NIC{{}}, + }, + wantErr: false, + }, + { + name: "two empty NICs in NIC-slice to verify sorting by network id does not break on nil pointers", + args: args{ + outputFormat: print.PrettyOutputFormat, + nics: []iaas.NIC{{}, {}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputProjectResult(p, tt.args.outputFormat, tt.args.nics, ""); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestOutputNetworkResult(t *testing.T) { + type args struct { + outputFormat string + nics []iaas.NIC + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "nil as NIC-slice", + args: args{ + outputFormat: print.PrettyOutputFormat, + }, + wantErr: false, + }, + { + name: "empty NIC-slice", + args: args{ + outputFormat: print.PrettyOutputFormat, + nics: []iaas.NIC{}, + }, + wantErr: false, + }, + { + name: "empty NIC in NIC-slice", + args: args{ + outputFormat: print.PrettyOutputFormat, + nics: []iaas.NIC{{}}, + }, wantErr: false, }, } @@ -196,7 +304,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.nics); (err != nil) != tt.wantErr { + if err := outputNetworkResult(p, tt.args.outputFormat, tt.args.nics, ""); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From 77ccce218cfb6036ebbc3b728460262d1fa48fbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:01:41 +0100 Subject: [PATCH 347/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#1278) Bumps [github.com/stackitcloud/stackit-sdk-go/services/rabbitmq](https://github.com/stackitcloud/stackit-sdk-go) from 0.25.3 to 0.25.6. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/logme/v0.25.3...services/logme/v0.25.6) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/rabbitmq dependency-version: 0.25.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6ad5697b5..59efedf68 100644 --- a/go.mod +++ b/go.mod @@ -271,7 +271,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index bf6ec3575..0ca328cf9 100644 --- a/go.sum +++ b/go.sum @@ -638,8 +638,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQx954yI8fuQmxXwRf/myqAdLg2KvxImp00g= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5/go.mod h1:xmAWk9eom8wznvLuLfm0F4xyeiBX8LaggXsKFmos+dw= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3 h1:a9XjDC01il+3IDQIDgg5qcJBYcsu5rrTJyMfJZPyvCg= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.3/go.mod h1:tjbSLF5+5JFx+qNazqhakqfPlCZPzque9R4XqRZzTRc= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 h1:+TFfl1ON/uM5aO0FdkBNYKBa7vx0zrCYVtX6zvqQYBA= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6/go.mod h1:hnhvlLX1Y71R8KIQqLBeoSZqkU5ZJOG0J4wz0LeUdaw= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXOvRNmSYMeF0qQ2+w4/ez04YutVDz73hSMuuOJ54= From ac7009eadff7564df89d6f4c806c33d3617af60e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:09:54 +0100 Subject: [PATCH 348/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/dns (#1277) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/stackitcloud/stackit-sdk-go/services/dns](https://github.com/stackitcloud/stackit-sdk-go) from 0.17.3 to 0.17.6. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.17.3...services/dns/v0.17.6) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/dns dependency-version: 0.17.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gökce Gök Klingel <161626272+GokceGK@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 59efedf68..25a841c57 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 - github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 + github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 diff --git a/go.sum b/go.sum index 0ca328cf9..2831b2e97 100644 --- a/go.sum +++ b/go.sum @@ -608,8 +608,8 @@ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 h1:JMKEeNQ github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 h1:PiNC8VmLqi1WUnBSPefjDXThD43Fvb87p+Y6H8onGA0= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1/go.mod h1:Nnfe/Zv4Z8F56Ljw/MfXjL0/2Ajia4bGuL/CZuvIXk8= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3 h1:KD/FxU/cJIzfyMvwiOvTlSWq87ISENpHNmw/quznGnw= -github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.3/go.mod h1:BNiIZkDqwSV1LkWDjMKxVb9pxQ/HMIsXJ0AQ8pFoAo4= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew= +github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6/go.mod h1:IX9iL3MigDZUmzwswTJMfYvyi118KAHrFMfjJUy5NYk= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 h1:+96JOe4oS9BhdH4kHfc5jcl9DVIZiHrMN0/PXn8uWoI= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 h1:VIjkSofZz9utOOkBdNZCIb07P/JdKc1kHV1P8Rq9dLc= From 653a7dad1db3b9af4d9451bc0d4698f6507415b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:19:30 +0100 Subject: [PATCH 349/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex (#1276) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex](https://github.com/stackitcloud/stackit-sdk-go) from 1.4.0 to 1.4.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.4.0...services/runcommand/v1.4.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex dependency-version: 1.4.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gökce Gök Klingel <161626272+GokceGK@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 25a841c57..f195c570a 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 - github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 + github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.32.0 golang.org/x/oauth2 v0.34.0 diff --git a/go.sum b/go.sum index 2831b2e97..43420ca93 100644 --- a/go.sum +++ b/go.sum @@ -660,8 +660,8 @@ github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+N github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 h1:c+nQMvSml08cdRF1kE24vCw0r/l56olP/svQyhcnKOs= github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3/go.mod h1:1Jr+ImrmPERxbYnlTy6O2aSZYNnREf2qQyysv6YC1RY= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0 h1:KgIRTw4gpxx8qoiaLGLbXPVDcBgCxPl60gigw+tizYc= -github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.0/go.mod h1:fd13ANCU/Pye8uDd/6E0I605+6PYfHuVIQpPEK2Ph6c= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 h1:AQrcr+qeIuZob+3TT2q1L4WOPtpsu5SEpkTnOUHDqfE= +github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3/go.mod h1:8BBGC69WFXWWmKgzSjgE4HvsI7pEgO0RN2cASwuPJ18= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From 4e3ce39b698dbe0856c405459959cc0fe60cf55c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:28:28 +0100 Subject: [PATCH 350/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1272) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/stackitcloud/stackit-sdk-go/services/alb](https://github.com/stackitcloud/stackit-sdk-go) from 0.9.0 to 0.9.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.9.0...services/alb/v0.9.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/alb dependency-version: 0.9.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Gökce Gök Klingel <161626272+GokceGK@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f195c570a..3ddd924cc 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.21.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 diff --git a/go.sum b/go.sum index 43420ca93..43eb5a042 100644 --- a/go.sum +++ b/go.sum @@ -602,8 +602,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.21.1 h1:Y/PcAgM7DPYMNqum0MLv4n1mF9ieuevzcCIZYQfm3Ts= github.com/stackitcloud/stackit-sdk-go/core v0.21.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0 h1:P24WoKPt14dfUiUJ4czIv+IiVmdCFQGrKgVtw23fxNg= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.0/go.mod h1:63XvbCslxdfWEp+0Q4OSzQrpbY4kvVODOiIEAEEVH8M= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 h1:X82TZfc6lg8ZoYdckiv5+OsV0d+81Q2TFMJh1TfxGWk= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 h1:JMKEeNQpA+Mb1DRpY3MRQL3pko5JjUWGrevN0xOrx+4= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 h1:PiNC8VmLqi1WUnBSPefjDXThD43Fvb87p+Y6H8onGA0= From b25644323b116af0c18e2f516ac14b23ad166eb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 17:57:18 +0100 Subject: [PATCH 351/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#1270) Bumps [github.com/stackitcloud/stackit-sdk-go/services/loadbalancer](https://github.com/stackitcloud/stackit-sdk-go) from 1.7.0 to 1.7.3. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.7.0...services/loadbalancer/v1.7.3) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/loadbalancer dependency-version: 1.7.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3ddd924cc..0de779f68 100644 --- a/go.mod +++ b/go.mod @@ -266,7 +266,7 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 diff --git a/go.sum b/go.sum index 43eb5a042..f89784b61 100644 --- a/go.sum +++ b/go.sum @@ -620,8 +620,8 @@ github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 h1:cbXM7jUBCL7A5zx github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4/go.mod h1:z+7KKZf0uHXU/Kb4CRs/oaBrXRJ01LpiD0OH11MXLOk= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1R+fL5aX5nEoxL6ODVJl3emzho= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0 h1:ZyaB4jL71p+FWI/cXgP+p6t4iw1oAeGbLLOz4cs3dmI= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.0/go.mod h1:dYmNdSNDKUG+E0SwuFWu+c8CuMBF/l6w1bdzAHxQao0= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 h1:d/qIj+XNaqByVbLvwpWoA0Ekv0yrONWyNswg4/jGX7Y= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3/go.mod h1:ClPE4TOM1FeaJiwTXvApq4gWaSgTLq6nU3PPHAIQDN4= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7XpsAzTn0W+C/oP5flnLVgIh5u3O/P0o= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxeB69IIpANev/jw6HIw2yfh/HO7w= From 39e59396cb2264d4e31b388b09b7ab55d605d515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kce=20G=C3=B6k=20Klingel?= <161626272+GokceGK@users.noreply.github.com> Date: Wed, 11 Feb 2026 15:16:11 +0100 Subject: [PATCH 352/422] update logs service from beta to v1 (#1284) --- docs/stackit.md | 1 + docs/stackit_beta.md | 1 - docs/stackit_beta_logs_instance.md | 38 ------------------- .../{stackit_beta_logs.md => stackit_logs.md} | 10 ++--- docs/stackit_logs_instance.md | 38 +++++++++++++++++++ ...ate.md => stackit_logs_instance_create.md} | 14 +++---- ...ete.md => stackit_logs_instance_delete.md} | 10 ++--- ...e.md => stackit_logs_instance_describe.md} | 12 +++--- ..._list.md => stackit_logs_instance_list.md} | 12 +++--- ...ate.md => stackit_logs_instance_update.md} | 14 +++---- go.mod | 2 +- go.sum | 2 + internal/cmd/beta/beta.go | 2 - .../{beta => }/logs/instance/create/create.go | 6 +-- .../logs/instance/create/create_test.go | 0 .../{beta => }/logs/instance/delete/delete.go | 2 +- .../logs/instance/delete/delete_test.go | 0 .../logs/instance/describe/describe.go | 4 +- .../logs/instance/describe/describe_test.go | 0 .../cmd/{beta => }/logs/instance/instance.go | 10 ++--- .../cmd/{beta => }/logs/instance/list/list.go | 4 +- .../logs/instance/list/list_test.go | 0 .../{beta => }/logs/instance/update/update.go | 6 +-- .../logs/instance/update/update_test.go | 0 internal/cmd/{beta => }/logs/logs.go | 2 +- internal/cmd/root.go | 2 + 26 files changed, 97 insertions(+), 95 deletions(-) delete mode 100644 docs/stackit_beta_logs_instance.md rename docs/{stackit_beta_logs.md => stackit_logs.md} (69%) create mode 100644 docs/stackit_logs_instance.md rename docs/{stackit_beta_logs_instance_create.md => stackit_logs_instance_create.md} (66%) rename docs/{stackit_beta_logs_instance_delete.md => stackit_logs_instance_delete.md} (69%) rename docs/{stackit_beta_logs_instance_describe.md => stackit_logs_instance_describe.md} (67%) rename docs/{stackit_beta_logs_instance_list.md => stackit_logs_instance_list.md} (70%) rename docs/{stackit_beta_logs_instance_update.md => stackit_logs_instance_update.md} (69%) rename internal/cmd/{beta => }/logs/instance/create/create.go (94%) rename internal/cmd/{beta => }/logs/instance/create/create_test.go (100%) rename internal/cmd/{beta => }/logs/instance/delete/delete.go (98%) rename internal/cmd/{beta => }/logs/instance/delete/delete_test.go (100%) rename internal/cmd/{beta => }/logs/instance/describe/describe.go (96%) rename internal/cmd/{beta => }/logs/instance/describe/describe_test.go (100%) rename internal/cmd/{beta => }/logs/instance/instance.go (67%) rename internal/cmd/{beta => }/logs/instance/list/list.go (97%) rename internal/cmd/{beta => }/logs/instance/list/list_test.go (100%) rename internal/cmd/{beta => }/logs/instance/update/update.go (96%) rename internal/cmd/{beta => }/logs/instance/update/update_test.go (100%) rename internal/cmd/{beta => }/logs/logs.go (89%) diff --git a/docs/stackit.md b/docs/stackit.md index d0ddc4554..fe3f26296 100644 --- a/docs/stackit.md +++ b/docs/stackit.md @@ -37,6 +37,7 @@ stackit [flags] * [stackit key-pair](./stackit_key-pair.md) - Provides functionality for SSH key pairs * [stackit load-balancer](./stackit_load-balancer.md) - Provides functionality for Load Balancer * [stackit logme](./stackit_logme.md) - Provides functionality for LogMe +* [stackit logs](./stackit_logs.md) - Provides functionality for Logs * [stackit mariadb](./stackit_mariadb.md) - Provides functionality for MariaDB * [stackit mongodbflex](./stackit_mongodbflex.md) - Provides functionality for MongoDB Flex * [stackit network](./stackit_network.md) - Provides functionality for networks diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index 079333c69..77c078fa6 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -46,7 +46,6 @@ stackit beta [flags] * [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. * [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake * [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS -* [stackit beta logs](./stackit_beta_logs.md) - Provides functionality for Logs * [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) * [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex diff --git a/docs/stackit_beta_logs_instance.md b/docs/stackit_beta_logs_instance.md deleted file mode 100644 index 85831068e..000000000 --- a/docs/stackit_beta_logs_instance.md +++ /dev/null @@ -1,38 +0,0 @@ -## stackit beta logs instance - -Provides functionality for Logs instances - -### Synopsis - -Provides functionality for Logs instances. - -``` -stackit beta logs instance [flags] -``` - -### Options - -``` - -h, --help Help for "stackit beta logs instance" -``` - -### Options inherited from parent commands - -``` - -y, --assume-yes If set, skips all confirmation prompts - --async If set, runs the command asynchronously - -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] - -p, --project-id string Project ID - --region string Target region for region-specific requests - --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") -``` - -### SEE ALSO - -* [stackit beta logs](./stackit_beta_logs.md) - Provides functionality for Logs -* [stackit beta logs instance create](./stackit_beta_logs_instance_create.md) - Creates a Logs instance -* [stackit beta logs instance delete](./stackit_beta_logs_instance_delete.md) - Deletes the given Logs instance -* [stackit beta logs instance describe](./stackit_beta_logs_instance_describe.md) - Shows details of a Logs instance -* [stackit beta logs instance list](./stackit_beta_logs_instance_list.md) - Lists Logs instances -* [stackit beta logs instance update](./stackit_beta_logs_instance_update.md) - Updates a Logs instance - diff --git a/docs/stackit_beta_logs.md b/docs/stackit_logs.md similarity index 69% rename from docs/stackit_beta_logs.md rename to docs/stackit_logs.md index 91998e3c1..212cf8c4e 100644 --- a/docs/stackit_beta_logs.md +++ b/docs/stackit_logs.md @@ -1,4 +1,4 @@ -## stackit beta logs +## stackit logs Provides functionality for Logs @@ -7,13 +7,13 @@ Provides functionality for Logs Provides functionality for Logs. ``` -stackit beta logs [flags] +stackit logs [flags] ``` ### Options ``` - -h, --help Help for "stackit beta logs" + -h, --help Help for "stackit logs" ``` ### Options inherited from parent commands @@ -29,6 +29,6 @@ stackit beta logs [flags] ### SEE ALSO -* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands -* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances +* [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/docs/stackit_logs_instance.md b/docs/stackit_logs_instance.md new file mode 100644 index 000000000..546eb96b6 --- /dev/null +++ b/docs/stackit_logs_instance.md @@ -0,0 +1,38 @@ +## stackit logs instance + +Provides functionality for Logs instances + +### Synopsis + +Provides functionality for Logs instances. + +``` +stackit logs instance [flags] +``` + +### Options + +``` + -h, --help Help for "stackit logs instance" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs](./stackit_logs.md) - Provides functionality for Logs +* [stackit logs instance create](./stackit_logs_instance_create.md) - Creates a Logs instance +* [stackit logs instance delete](./stackit_logs_instance_delete.md) - Deletes the given Logs instance +* [stackit logs instance describe](./stackit_logs_instance_describe.md) - Shows details of a Logs instance +* [stackit logs instance list](./stackit_logs_instance_list.md) - Lists Logs instances +* [stackit logs instance update](./stackit_logs_instance_update.md) - Updates a Logs instance + diff --git a/docs/stackit_beta_logs_instance_create.md b/docs/stackit_logs_instance_create.md similarity index 66% rename from docs/stackit_beta_logs_instance_create.md rename to docs/stackit_logs_instance_create.md index 3d00e6cea..e68a37824 100644 --- a/docs/stackit_beta_logs_instance_create.md +++ b/docs/stackit_logs_instance_create.md @@ -1,4 +1,4 @@ -## stackit beta logs instance create +## stackit logs instance create Creates a Logs instance @@ -7,20 +7,20 @@ Creates a Logs instance Creates a Logs instance. ``` -stackit beta logs instance create [flags] +stackit logs instance create [flags] ``` ### Examples ``` Create a Logs instance with name "my-instance" and retention time 10 days - $ stackit beta logs instance create --display-name "my-instance" --retention-days 10 + $ stackit logs instance create --display-name "my-instance" --retention-days 10 Create a Logs instance with name "my-instance", retention time 10 days, and a description - $ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --description "Description of the instance" + $ stackit logs instance create --display-name "my-instance" --retention-days 10 --description "Description of the instance" Create a Logs instance with name "my-instance", retention time 10 days, and restrict access to a specific range of IP addresses. - $ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --acl 1.2.3.0/24 + $ stackit logs instance create --display-name "my-instance" --retention-days 10 --acl 1.2.3.0/24 ``` ### Options @@ -29,7 +29,7 @@ stackit beta logs instance create [flags] --acl strings Access control list --description string Description --display-name string Display name - -h, --help Help for "stackit beta logs instance create" + -h, --help Help for "stackit logs instance create" --retention-days int The days for how long the logs should be stored before being cleaned up ``` @@ -46,5 +46,5 @@ stackit beta logs instance create [flags] ### SEE ALSO -* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances +* [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/docs/stackit_beta_logs_instance_delete.md b/docs/stackit_logs_instance_delete.md similarity index 69% rename from docs/stackit_beta_logs_instance_delete.md rename to docs/stackit_logs_instance_delete.md index a64cedb3e..30eecdb7c 100644 --- a/docs/stackit_beta_logs_instance_delete.md +++ b/docs/stackit_logs_instance_delete.md @@ -1,4 +1,4 @@ -## stackit beta logs instance delete +## stackit logs instance delete Deletes the given Logs instance @@ -7,20 +7,20 @@ Deletes the given Logs instance Deletes the given Logs instance. ``` -stackit beta logs instance delete INSTANCE_ID [flags] +stackit logs instance delete INSTANCE_ID [flags] ``` ### Examples ``` Delete a Logs instance with ID "xxx" - $ stackit beta logs instance delete "xxx" + $ stackit logs instance delete "xxx" ``` ### Options ``` - -h, --help Help for "stackit beta logs instance delete" + -h, --help Help for "stackit logs instance delete" ``` ### Options inherited from parent commands @@ -36,5 +36,5 @@ stackit beta logs instance delete INSTANCE_ID [flags] ### SEE ALSO -* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances +* [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/docs/stackit_beta_logs_instance_describe.md b/docs/stackit_logs_instance_describe.md similarity index 67% rename from docs/stackit_beta_logs_instance_describe.md rename to docs/stackit_logs_instance_describe.md index 18218a879..f35dfc430 100644 --- a/docs/stackit_beta_logs_instance_describe.md +++ b/docs/stackit_logs_instance_describe.md @@ -1,4 +1,4 @@ -## stackit beta logs instance describe +## stackit logs instance describe Shows details of a Logs instance @@ -7,23 +7,23 @@ Shows details of a Logs instance Shows details of a Logs instance ``` -stackit beta logs instance describe INSTANCE_ID [flags] +stackit logs instance describe INSTANCE_ID [flags] ``` ### Examples ``` Get details of a Logs instance with ID "xxx" - $ stackit beta logs instance describe xxx + $ stackit logs instance describe xxx Get details of a Logs instance with ID "xxx" in JSON format - $ stackit beta logs instance describe xxx --output-format json + $ stackit logs instance describe xxx --output-format json ``` ### Options ``` - -h, --help Help for "stackit beta logs instance describe" + -h, --help Help for "stackit logs instance describe" ``` ### Options inherited from parent commands @@ -39,5 +39,5 @@ stackit beta logs instance describe INSTANCE_ID [flags] ### SEE ALSO -* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances +* [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/docs/stackit_beta_logs_instance_list.md b/docs/stackit_logs_instance_list.md similarity index 70% rename from docs/stackit_beta_logs_instance_list.md rename to docs/stackit_logs_instance_list.md index 6e53961ee..4a21422bb 100644 --- a/docs/stackit_beta_logs_instance_list.md +++ b/docs/stackit_logs_instance_list.md @@ -1,4 +1,4 @@ -## stackit beta logs instance list +## stackit logs instance list Lists Logs instances @@ -7,23 +7,23 @@ Lists Logs instances Lists Logs instances within the project. ``` -stackit beta logs instance list [flags] +stackit logs instance list [flags] ``` ### Examples ``` List all Logs instances - $ stackit beta logs instance list + $ stackit logs instance list List the first 10 Logs instances - $ stackit beta logs instance list --limit=10 + $ stackit logs instance list --limit=10 ``` ### Options ``` - -h, --help Help for "stackit beta logs instance list" + -h, --help Help for "stackit logs instance list" --limit int Limit the output to the first n elements ``` @@ -40,5 +40,5 @@ stackit beta logs instance list [flags] ### SEE ALSO -* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances +* [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/docs/stackit_beta_logs_instance_update.md b/docs/stackit_logs_instance_update.md similarity index 69% rename from docs/stackit_beta_logs_instance_update.md rename to docs/stackit_logs_instance_update.md index da546c4cf..a4fdd5a33 100644 --- a/docs/stackit_beta_logs_instance_update.md +++ b/docs/stackit_logs_instance_update.md @@ -1,4 +1,4 @@ -## stackit beta logs instance update +## stackit logs instance update Updates a Logs instance @@ -7,20 +7,20 @@ Updates a Logs instance Updates a Logs instance. ``` -stackit beta logs instance update INSTANCE_ID [flags] +stackit logs instance update INSTANCE_ID [flags] ``` ### Examples ``` Update the display name of the Logs instance with ID "xxx" - $ stackit beta logs instance update xxx --display-name new-name + $ stackit logs instance update xxx --display-name new-name Update the retention time of the Logs instance with ID "xxx" - $ stackit beta logs instance update xxx --retention-days 40 + $ stackit logs instance update xxx --retention-days 40 Update the ACL of the Logs instance with ID "xxx" - $ stackit beta logs instance update xxx --acl 1.2.3.0/24 + $ stackit logs instance update xxx --acl 1.2.3.0/24 ``` ### Options @@ -29,7 +29,7 @@ stackit beta logs instance update INSTANCE_ID [flags] --acl strings Access control list --description string Description --display-name string Display name - -h, --help Help for "stackit beta logs instance update" + -h, --help Help for "stackit logs instance update" --retention-days int The days for how long the logs should be stored before being cleaned up ``` @@ -46,5 +46,5 @@ stackit beta logs instance update INSTANCE_ID [flags] ### SEE ALSO -* [stackit beta logs instance](./stackit_beta_logs_instance.md) - Provides functionality for Logs instances +* [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/go.mod b/go.mod index 0de779f68..73255cfbd 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 - github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 + github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 diff --git a/go.sum b/go.sum index f89784b61..36a6c587a 100644 --- a/go.sum +++ b/go.sum @@ -626,6 +626,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7Xps github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxeB69IIpANev/jw6HIw2yfh/HO7w= github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= +github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 h1:vr4atxFRT+EL+DqONMT5R44f7AzEMbePa9U7PEE0THU= +github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2/go.mod h1:CAPsiTX7osAImfrG5RnIjaJ/Iz3QpoBKuH2fS346wuQ= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN8ZzdoY8d6VbF903zFpGjzqrU0FN27rJPg= diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index bf3bd4129..ebc082da7 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -10,7 +10,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -49,6 +48,5 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(edge.NewCmd(params)) cmd.AddCommand(intake.NewCmd(params)) cmd.AddCommand(kms.NewCmd(params)) - cmd.AddCommand(logs.NewCmd(params)) cmd.AddCommand(cdn.NewCmd(params)) } diff --git a/internal/cmd/beta/logs/instance/create/create.go b/internal/cmd/logs/instance/create/create.go similarity index 94% rename from internal/cmd/beta/logs/instance/create/create.go rename to internal/cmd/logs/instance/create/create.go index 2dafa7c1e..30c45de7a 100644 --- a/internal/cmd/beta/logs/instance/create/create.go +++ b/internal/cmd/logs/instance/create/create.go @@ -47,13 +47,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Create a Logs instance with name "my-instance" and retention time 10 days`, - `$ stackit beta logs instance create --display-name "my-instance" --retention-days 10`), + `$ stackit logs instance create --display-name "my-instance" --retention-days 10`), examples.NewExample( `Create a Logs instance with name "my-instance", retention time 10 days, and a description`, - `$ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --description "Description of the instance"`), + `$ stackit logs instance create --display-name "my-instance" --retention-days 10 --description "Description of the instance"`), examples.NewExample( `Create a Logs instance with name "my-instance", retention time 10 days, and restrict access to a specific range of IP addresses.`, - `$ stackit beta logs instance create --display-name "my-instance" --retention-days 10 --acl 1.2.3.0/24`), + `$ stackit logs instance create --display-name "my-instance" --retention-days 10 --acl 1.2.3.0/24`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/logs/instance/create/create_test.go b/internal/cmd/logs/instance/create/create_test.go similarity index 100% rename from internal/cmd/beta/logs/instance/create/create_test.go rename to internal/cmd/logs/instance/create/create_test.go diff --git a/internal/cmd/beta/logs/instance/delete/delete.go b/internal/cmd/logs/instance/delete/delete.go similarity index 98% rename from internal/cmd/beta/logs/instance/delete/delete.go rename to internal/cmd/logs/instance/delete/delete.go index 3344a3a93..937239fc2 100644 --- a/internal/cmd/beta/logs/instance/delete/delete.go +++ b/internal/cmd/logs/instance/delete/delete.go @@ -40,7 +40,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Delete a Logs instance with ID "xxx"`, - `$ stackit beta logs instance delete "xxx"`), + `$ stackit logs instance delete "xxx"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/logs/instance/delete/delete_test.go b/internal/cmd/logs/instance/delete/delete_test.go similarity index 100% rename from internal/cmd/beta/logs/instance/delete/delete_test.go rename to internal/cmd/logs/instance/delete/delete_test.go diff --git a/internal/cmd/beta/logs/instance/describe/describe.go b/internal/cmd/logs/instance/describe/describe.go similarity index 96% rename from internal/cmd/beta/logs/instance/describe/describe.go rename to internal/cmd/logs/instance/describe/describe.go index 66d27d99a..dc084eaeb 100644 --- a/internal/cmd/beta/logs/instance/describe/describe.go +++ b/internal/cmd/logs/instance/describe/describe.go @@ -36,11 +36,11 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Get details of a Logs instance with ID "xxx"`, - `$ stackit beta logs instance describe xxx`, + `$ stackit logs instance describe xxx`, ), examples.NewExample( `Get details of a Logs instance with ID "xxx" in JSON format`, - "$ stackit beta logs instance describe xxx --output-format json"), + "$ stackit logs instance describe xxx --output-format json"), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/logs/instance/describe/describe_test.go b/internal/cmd/logs/instance/describe/describe_test.go similarity index 100% rename from internal/cmd/beta/logs/instance/describe/describe_test.go rename to internal/cmd/logs/instance/describe/describe_test.go diff --git a/internal/cmd/beta/logs/instance/instance.go b/internal/cmd/logs/instance/instance.go similarity index 67% rename from internal/cmd/beta/logs/instance/instance.go rename to internal/cmd/logs/instance/instance.go index ad099a9d1..f69b7ddce 100644 --- a/internal/cmd/beta/logs/instance/instance.go +++ b/internal/cmd/logs/instance/instance.go @@ -1,11 +1,11 @@ package instance import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/create" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/delete" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/describe" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/beta/logs/instance/list/list.go b/internal/cmd/logs/instance/list/list.go similarity index 97% rename from internal/cmd/beta/logs/instance/list/list.go rename to internal/cmd/logs/instance/list/list.go index 226c3b5c3..571cb98b2 100644 --- a/internal/cmd/beta/logs/instance/list/list.go +++ b/internal/cmd/logs/instance/list/list.go @@ -38,11 +38,11 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `List all Logs instances`, - `$ stackit beta logs instance list`, + `$ stackit logs instance list`, ), examples.NewExample( `List the first 10 Logs instances`, - `$ stackit beta logs instance list --limit=10`, + `$ stackit logs instance list --limit=10`, ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/beta/logs/instance/list/list_test.go b/internal/cmd/logs/instance/list/list_test.go similarity index 100% rename from internal/cmd/beta/logs/instance/list/list_test.go rename to internal/cmd/logs/instance/list/list_test.go diff --git a/internal/cmd/beta/logs/instance/update/update.go b/internal/cmd/logs/instance/update/update.go similarity index 96% rename from internal/cmd/beta/logs/instance/update/update.go rename to internal/cmd/logs/instance/update/update.go index 2e6fcea0b..8898a2969 100644 --- a/internal/cmd/beta/logs/instance/update/update.go +++ b/internal/cmd/logs/instance/update/update.go @@ -48,13 +48,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Update the display name of the Logs instance with ID "xxx"`, - "$ stackit beta logs instance update xxx --display-name new-name"), + "$ stackit logs instance update xxx --display-name new-name"), examples.NewExample( `Update the retention time of the Logs instance with ID "xxx"`, - "$ stackit beta logs instance update xxx --retention-days 40"), + "$ stackit logs instance update xxx --retention-days 40"), examples.NewExample( `Update the ACL of the Logs instance with ID "xxx"`, - "$ stackit beta logs instance update xxx --acl 1.2.3.0/24"), + "$ stackit logs instance update xxx --acl 1.2.3.0/24"), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/logs/instance/update/update_test.go b/internal/cmd/logs/instance/update/update_test.go similarity index 100% rename from internal/cmd/beta/logs/instance/update/update_test.go rename to internal/cmd/logs/instance/update/update_test.go diff --git a/internal/cmd/beta/logs/logs.go b/internal/cmd/logs/logs.go similarity index 89% rename from internal/cmd/beta/logs/logs.go rename to internal/cmd/logs/logs.go index d7e0b803a..c6afc6a5f 100644 --- a/internal/cmd/beta/logs/logs.go +++ b/internal/cmd/logs/logs.go @@ -1,7 +1,7 @@ package logs import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/logs/instance" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/root.go b/internal/cmd/root.go index ccb1b9f5a..a264bddef 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -19,6 +19,7 @@ import ( keypair "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair" loadbalancer "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer" "github.com/stackitcloud/stackit-cli/internal/cmd/logme" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs" "github.com/stackitcloud/stackit-cli/internal/cmd/mariadb" "github.com/stackitcloud/stackit-cli/internal/cmd/mongodbflex" "github.com/stackitcloud/stackit-cli/internal/cmd/network" @@ -170,6 +171,7 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(dns.NewCmd(params)) cmd.AddCommand(loadbalancer.NewCmd(params)) cmd.AddCommand(logme.NewCmd(params)) + cmd.AddCommand(logs.NewCmd(params)) cmd.AddCommand(mariadb.NewCmd(params)) cmd.AddCommand(mongodbflex.NewCmd(params)) cmd.AddCommand(objectstorage.NewCmd(params)) From 3c0d4474bb471b47a6daa584ae12cf9fd65353c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:44:52 +0100 Subject: [PATCH 353/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/edge (#1279) --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 73255cfbd..0dd5f3c99 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 - github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 + github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 diff --git a/go.sum b/go.sum index 36a6c587a..e5fbbd7da 100644 --- a/go.sum +++ b/go.sum @@ -610,8 +610,8 @@ github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 h1:PiNC8VmLqi1WUnBSPe github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1/go.mod h1:Nnfe/Zv4Z8F56Ljw/MfXjL0/2Ajia4bGuL/CZuvIXk8= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6/go.mod h1:IX9iL3MigDZUmzwswTJMfYvyi118KAHrFMfjJUy5NYk= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0 h1:+96JOe4oS9BhdH4kHfc5jcl9DVIZiHrMN0/PXn8uWoI= -github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.0/go.mod h1:tFDkVkK+ESBTiH2XIcMPPR/pJJmeqT1VNDghg+ZxfMI= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 h1:TxChb2qbO82JiQEBYClSSD5HZxqKeKJ6dIvkEUCJmbs= +github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3/go.mod h1:KVWvQHb7CQLD9DzA4Np3WmakiCCsrHaCXvFEnOQ7nPk= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 h1:VIjkSofZz9utOOkBdNZCIb07P/JdKc1kHV1P8Rq9dLc= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3/go.mod h1:EJk1Ss9GTel2NPIu/w3+x9XcQcEd2k3ibea5aQDzVhQ= github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= @@ -624,8 +624,6 @@ github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 h1:d/qIj+XNa github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3/go.mod h1:ClPE4TOM1FeaJiwTXvApq4gWaSgTLq6nU3PPHAIQDN4= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7XpsAzTn0W+C/oP5flnLVgIh5u3O/P0o= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE= -github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0 h1:EOUVSKvu/m5N+psxeB69IIpANev/jw6HIw2yfh/HO7w= -github.com/stackitcloud/stackit-sdk-go/services/logs v0.4.0/go.mod h1:m4IjH1/RtJOF072kjAB0E/ejoIc++myrKmIahphfO6Q= github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 h1:vr4atxFRT+EL+DqONMT5R44f7AzEMbePa9U7PEE0THU= github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2/go.mod h1:CAPsiTX7osAImfrG5RnIjaJ/Iz3QpoBKuH2fS346wuQ= github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= From b95b64de55fc986e765fc3af36d892ee99a96625 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 15:51:09 +0000 Subject: [PATCH 354/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/mariadb (#1282) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0dd5f3c99..280661ca4 100644 --- a/go.mod +++ b/go.mod @@ -268,7 +268,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 - github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 + github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 diff --git a/go.sum b/go.sum index e5fbbd7da..38a831cb6 100644 --- a/go.sum +++ b/go.sum @@ -626,8 +626,8 @@ github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7Xps github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE= github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 h1:vr4atxFRT+EL+DqONMT5R44f7AzEMbePa9U7PEE0THU= github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2/go.mod h1:CAPsiTX7osAImfrG5RnIjaJ/Iz3QpoBKuH2fS346wuQ= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3 h1:Y5Ct3Zi5UcIOwjKMWpKl0nrqiq7psTf4NJv0IKgwTkc= -github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.3/go.mod h1:TMl5WcpjzUiAlLWaxMKbu9ysDzFziSPgg4xLxj9jjfY= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 h1:Y/byRjX2u/OZl0gKS/Rau6ob2bDyv26xnw6A6JNkKJk= +github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6/go.mod h1:sY66ZgCgBc1mScPV95ek5WtUEGYizdP1RMsGaqbdbhw= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN8ZzdoY8d6VbF903zFpGjzqrU0FN27rJPg= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA= From 355c53900554988773c18055f4810ed8f263dcf4 Mon Sep 17 00:00:00 2001 From: Devansh <72165346+devanshcache@users.noreply.github.com> Date: Wed, 11 Feb 2026 17:04:23 +0100 Subject: [PATCH 355/422] feat(intake): implement subcommands to manage intakes (#1124) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit relates to STACKITINT-1350 Co-authored-by: Ruben Hönle Co-authored-by: Yago Carlos Fernandez Gou --- docs/stackit_beta_intake.md | 5 + docs/stackit_beta_intake_create.md | 59 +++ docs/stackit_beta_intake_delete.md | 40 ++ docs/stackit_beta_intake_describe.md | 43 +++ docs/stackit_beta_intake_list.md | 47 +++ docs/stackit_beta_intake_update.md | 54 +++ internal/cmd/beta/intake/create/create.go | 247 ++++++++++++ .../cmd/beta/intake/create/create_test.go | 361 ++++++++++++++++++ internal/cmd/beta/intake/delete/delete.go | 114 ++++++ .../cmd/beta/intake/delete/delete_test.go | 155 ++++++++ internal/cmd/beta/intake/describe/describe.go | 145 +++++++ .../cmd/beta/intake/describe/describe_test.go | 192 ++++++++++ internal/cmd/beta/intake/intake.go | 12 + internal/cmd/beta/intake/list/list.go | 151 ++++++++ internal/cmd/beta/intake/list/list_test.go | 205 ++++++++++ internal/cmd/beta/intake/update/update.go | 267 +++++++++++++ .../cmd/beta/intake/update/update_test.go | 283 ++++++++++++++ 17 files changed, 2380 insertions(+) create mode 100644 docs/stackit_beta_intake_create.md create mode 100644 docs/stackit_beta_intake_delete.md create mode 100644 docs/stackit_beta_intake_describe.md create mode 100644 docs/stackit_beta_intake_list.md create mode 100644 docs/stackit_beta_intake_update.md create mode 100644 internal/cmd/beta/intake/create/create.go create mode 100644 internal/cmd/beta/intake/create/create_test.go create mode 100644 internal/cmd/beta/intake/delete/delete.go create mode 100644 internal/cmd/beta/intake/delete/delete_test.go create mode 100644 internal/cmd/beta/intake/describe/describe.go create mode 100644 internal/cmd/beta/intake/describe/describe_test.go create mode 100644 internal/cmd/beta/intake/list/list.go create mode 100644 internal/cmd/beta/intake/list/list_test.go create mode 100644 internal/cmd/beta/intake/update/update.go create mode 100644 internal/cmd/beta/intake/update/update_test.go diff --git a/docs/stackit_beta_intake.md b/docs/stackit_beta_intake.md index f44d3c12d..9a3672fb8 100644 --- a/docs/stackit_beta_intake.md +++ b/docs/stackit_beta_intake.md @@ -30,5 +30,10 @@ stackit beta intake [flags] ### SEE ALSO * [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands +* [stackit beta intake create](./stackit_beta_intake_create.md) - Creates a new Intake +* [stackit beta intake delete](./stackit_beta_intake_delete.md) - Deletes an Intake +* [stackit beta intake describe](./stackit_beta_intake_describe.md) - Shows details of an Intake +* [stackit beta intake list](./stackit_beta_intake_list.md) - Lists all Intakes * [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners +* [stackit beta intake update](./stackit_beta_intake_update.md) - Updates an Intake diff --git a/docs/stackit_beta_intake_create.md b/docs/stackit_beta_intake_create.md new file mode 100644 index 000000000..58e872d10 --- /dev/null +++ b/docs/stackit_beta_intake_create.md @@ -0,0 +1,59 @@ +## stackit beta intake create + +Creates a new Intake + +### Synopsis + +Creates a new Intake. + +``` +stackit beta intake create [flags] +``` + +### Examples + +``` + Create a new Intake with required parameters + $ stackit beta intake create --display-name my-intake --runner-id xxx --catalog-auth-type none --catalog-uri "http://dremio.example.com" --catalog-warehouse "my-warehouse" + + Create a new Intake with a description, labels, and Dremio authentication + $ stackit beta intake create --display-name my-intake --runner-id xxx --description "Production intake" --labels "env=prod,team=billing" --catalog-auth-type "dremio" --catalog-uri "http://dremio.example.com" --catalog-warehouse "my-warehouse" --dremio-token-endpoint "https://auth.dremio.cloud/oauth/token" --dremio-pat "MY_TOKEN" + + Create a new Intake with manual partitioning by a date field + $ stackit beta intake create --display-name my-partitioned-intake --runner-id xxx --catalog-auth-type "none" --catalog-uri "http://dremio.example.com" --catalog-warehouse "my-warehouse" --catalog-partitioning "manual" --catalog-partition-by "day(__intake_ts)" +``` + +### Options + +``` + --catalog-auth-type string Authentication type for the catalog (e.g., 'none', 'dremio') + --catalog-namespace string The namespace to which data shall be written (default: 'intake') + --catalog-partition-by strings List of Iceberg partitioning expressions. Only used when --catalog-partitioning is 'manual' + --catalog-partitioning string The target table's partitioning. One of 'none', 'intake-time', 'manual' + --catalog-table-name string The table name to identify the table in Iceberg + --catalog-uri string The URI to the Iceberg catalog endpoint + --catalog-warehouse string The Iceberg warehouse to connect to + --description string Description + --display-name string Display name + --dremio-pat string Dremio personal access token. Required if auth-type is 'dremio' + --dremio-token-endpoint string Dremio OAuth 2.0 token endpoint URL. Required if auth-type is 'dremio' + -h, --help Help for "stackit beta intake create" + --labels stringToString Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2" (default []) + --runner-id string The UUID of the Intake Runner to use +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake + diff --git a/docs/stackit_beta_intake_delete.md b/docs/stackit_beta_intake_delete.md new file mode 100644 index 000000000..305b81f90 --- /dev/null +++ b/docs/stackit_beta_intake_delete.md @@ -0,0 +1,40 @@ +## stackit beta intake delete + +Deletes an Intake + +### Synopsis + +Deletes an Intake. + +``` +stackit beta intake delete INTAKE_ID [flags] +``` + +### Examples + +``` + Delete an Intake with ID "xxx" + $ stackit beta intake delete xxx +``` + +### Options + +``` + -h, --help Help for "stackit beta intake delete" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake + diff --git a/docs/stackit_beta_intake_describe.md b/docs/stackit_beta_intake_describe.md new file mode 100644 index 000000000..9d13cc023 --- /dev/null +++ b/docs/stackit_beta_intake_describe.md @@ -0,0 +1,43 @@ +## stackit beta intake describe + +Shows details of an Intake + +### Synopsis + +Shows details of an Intake. + +``` +stackit beta intake describe INTAKE_ID [flags] +``` + +### Examples + +``` + Get details of an Intake with ID "xxx" + $ stackit beta intake describe xxx + + Get details of an Intake with ID "xxx" in JSON format + $ stackit beta intake describe xxx --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta intake describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake + diff --git a/docs/stackit_beta_intake_list.md b/docs/stackit_beta_intake_list.md new file mode 100644 index 000000000..5086a65fe --- /dev/null +++ b/docs/stackit_beta_intake_list.md @@ -0,0 +1,47 @@ +## stackit beta intake list + +Lists all Intakes + +### Synopsis + +Lists all Intakes for the current project. + +``` +stackit beta intake list [flags] +``` + +### Examples + +``` + List all Intakes + $ stackit beta intake list + + List all Intakes in JSON format + $ stackit beta intake list --output-format json + + List up to 5 Intakes + $ stackit beta intake list --limit 5 +``` + +### Options + +``` + -h, --help Help for "stackit beta intake list" + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake + diff --git a/docs/stackit_beta_intake_update.md b/docs/stackit_beta_intake_update.md new file mode 100644 index 000000000..3b36ac0b7 --- /dev/null +++ b/docs/stackit_beta_intake_update.md @@ -0,0 +1,54 @@ +## stackit beta intake update + +Updates an Intake + +### Synopsis + +Updates an Intake. Only the specified fields are updated. + +``` +stackit beta intake update INTAKE_ID [flags] +``` + +### Examples + +``` + Update the display name of an Intake with ID "xxx" + $ stackit beta intake update xxx --runner-id yyy --display-name new-intake-name + + Update the catalog details for an Intake with ID "xxx" + $ stackit beta intake update xxx --runner-id yyy --catalog-uri "http://new.uri" --catalog-warehouse "new-warehouse" +``` + +### Options + +``` + --catalog-auth-type string Authentication type for the catalog (e.g., 'none', 'dremio') + --catalog-namespace string The namespace to which data shall be written + --catalog-table-name string The table name to identify the table in Iceberg + --catalog-uri string The URI to the Iceberg catalog endpoint + --catalog-warehouse string The Iceberg warehouse to connect to + --description string Description + --display-name string Display name + --dremio-pat string Dremio personal access token + --dremio-token-endpoint string Dremio OAuth 2.0 token endpoint URL + -h, --help Help for "stackit beta intake update" + --labels stringToString Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2". (default []) + --runner-id string The UUID of the Intake Runner to use +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake + diff --git a/internal/cmd/beta/intake/create/create.go b/internal/cmd/beta/intake/create/create.go new file mode 100644 index 000000000..820e13b90 --- /dev/null +++ b/internal/cmd/beta/intake/create/create.go @@ -0,0 +1,247 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" +) + +const ( + displayNameFlag = "display-name" + runnerIdFlag = "runner-id" + descriptionFlag = "description" + labelsFlag = "labels" + catalogURIFlag = "catalog-uri" + catalogWarehouseFlag = "catalog-warehouse" + catalogNamespaceFlag = "catalog-namespace" + catalogTableNameFlag = "catalog-table-name" + catalogPartitioningFlag = "catalog-partitioning" + catalogPartitionByFlag = "catalog-partition-by" + catalogAuthTypeFlag = "catalog-auth-type" + dremioTokenEndpointFlag = "dremio-token-endpoint" //nolint:gosec // false positive + dremioPatFlag = "dremio-pat" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + + // Top-level fields + DisplayName *string + RunnerId *string + Description *string + Labels *map[string]string + + // Catalog fields + CatalogURI *string + CatalogWarehouse *string + CatalogNamespace *string + CatalogTableName *string + CatalogPartitioning *string + CatalogPartitionBy *[]string + + // Auth fields + CatalogAuthType *string + DremioTokenEndpoint *string + DremioToken *string +} + +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a new Intake", + Long: "Creates a new Intake.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a new Intake with required parameters`, + `$ stackit beta intake create --display-name my-intake --runner-id xxx --catalog-auth-type none --catalog-uri "http://dremio.example.com" --catalog-warehouse "my-warehouse"`), + examples.NewExample( + `Create a new Intake with a description, labels, and Dremio authentication`, + `$ stackit beta intake create --display-name my-intake --runner-id xxx --description "Production intake" --labels "env=prod,team=billing" --catalog-auth-type "dremio" --catalog-uri "http://dremio.example.com" --catalog-warehouse "my-warehouse" --dremio-token-endpoint "https://auth.dremio.cloud/oauth/token" --dremio-pat "MY_TOKEN"`), + examples.NewExample( + `Create a new Intake with manual partitioning by a date field`, + `$ stackit beta intake create --display-name my-partitioned-intake --runner-id xxx --catalog-auth-type "none" --catalog-uri "http://dremio.example.com" --catalog-warehouse "my-warehouse" --catalog-partitioning "manual" --catalog-partition-by "day(__intake_ts)"`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to create an Intake for project %q?", projectLabel) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create Intake: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(p.Printer) + s.Start("Creating STACKIT Intake instance") + _, err = wait.CreateOrUpdateIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resp.GetId()).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for STACKIT Instance creation: %w", err) + } + s.Stop() + } + + return outputResult(p.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + // Top-level flags + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().Var(flags.UUIDFlag(), runnerIdFlag, "The UUID of the Intake Runner to use") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringToString(labelsFlag, nil, "Labels in key=value format, separated by commas. Example: --labels \"key1=value1,key2=value2\"") + + // Catalog flags + cmd.Flags().String(catalogURIFlag, "", "The URI to the Iceberg catalog endpoint") + cmd.Flags().String(catalogWarehouseFlag, "", "The Iceberg warehouse to connect to") + cmd.Flags().String(catalogNamespaceFlag, "", "The namespace to which data shall be written (default: 'intake')") + cmd.Flags().String(catalogTableNameFlag, "", "The table name to identify the table in Iceberg") + cmd.Flags().String(catalogPartitioningFlag, "", "The target table's partitioning. One of 'none', 'intake-time', 'manual'") + cmd.Flags().StringSlice(catalogPartitionByFlag, nil, "List of Iceberg partitioning expressions. Only used when --catalog-partitioning is 'manual'") + + // Auth flags + cmd.Flags().String(catalogAuthTypeFlag, "", "Authentication type for the catalog (e.g., 'none', 'dremio')") + cmd.Flags().String(dremioTokenEndpointFlag, "", "Dremio OAuth 2.0 token endpoint URL. Required if auth-type is 'dremio'") + cmd.Flags().String(dremioPatFlag, "", "Dremio personal access token. Required if auth-type is 'dremio'") + + err := flags.MarkFlagsRequired(cmd, displayNameFlag, runnerIdFlag, catalogURIFlag, catalogWarehouseFlag, catalogAuthTypeFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + // Top-level fields + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + RunnerId: flags.FlagToStringPointer(p, cmd, runnerIdFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag), + + // Catalog fields + CatalogURI: flags.FlagToStringPointer(p, cmd, catalogURIFlag), + CatalogWarehouse: flags.FlagToStringPointer(p, cmd, catalogWarehouseFlag), + CatalogNamespace: flags.FlagToStringPointer(p, cmd, catalogNamespaceFlag), + CatalogTableName: flags.FlagToStringPointer(p, cmd, catalogTableNameFlag), + CatalogPartitioning: flags.FlagToStringPointer(p, cmd, catalogPartitioningFlag), + CatalogPartitionBy: flags.FlagToStringSlicePointer(p, cmd, catalogPartitionByFlag), + + // Auth fields + CatalogAuthType: flags.FlagToStringPointer(p, cmd, catalogAuthTypeFlag), + DremioTokenEndpoint: flags.FlagToStringPointer(p, cmd, dremioTokenEndpointFlag), + DremioToken: flags.FlagToStringPointer(p, cmd, dremioPatFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiCreateIntakeRequest { + req := apiClient.CreateIntake(ctx, model.ProjectId, model.Region) + + // Build catalog authentication + var catalogAuth *intake.CatalogAuth + if model.CatalogAuthType != nil { + authType := intake.CatalogAuthType(*model.CatalogAuthType) + catalogAuth = &intake.CatalogAuth{ + Type: &authType, + } + if *model.CatalogAuthType == "dremio" { + catalogAuth.Dremio = &intake.DremioAuth{ + TokenEndpoint: model.DremioTokenEndpoint, + PersonalAccessToken: model.DremioToken, + } + } + } + + var partitioning *intake.PartitioningType + if model.CatalogPartitioning != nil { + partitioning = utils.Ptr(intake.PartitioningType(*model.CatalogPartitioning)) + } + + // Build catalog + catalogPayload := intake.IntakeCatalog{ + Uri: model.CatalogURI, + Warehouse: model.CatalogWarehouse, + Namespace: model.CatalogNamespace, + TableName: model.CatalogTableName, + Partitioning: partitioning, + PartitionBy: model.CatalogPartitionBy, + Auth: catalogAuth, + } + + // Build main payload + payload := intake.CreateIntakePayload{ + DisplayName: model.DisplayName, + IntakeRunnerId: model.RunnerId, + Description: model.Description, + Labels: model.Labels, + Catalog: &catalogPayload, + } + req = req.CreateIntakePayload(payload) + + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *intake.IntakeResponse) error { + return p.OutputResult(model.OutputFormat, resp, func() error { + if resp == nil { + p.Outputf("Triggered creation of Intake for project %q, but no intake ID was returned.\n", projectLabel) + return nil + } + + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s Intake for project %q. Intake ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/intake/create/create_test.go b/internal/cmd/beta/intake/create/create_test.go new file mode 100644 index 000000000..38a0febe3 --- /dev/null +++ b/internal/cmd/beta/intake/create/create_test.go @@ -0,0 +1,361 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// Define a unique key for the context to avoid collisions +type testCtxKey struct{} + +const ( + testRegion = "eu01" + + testDisplayName = "testintake" + testDescription = "This is a test intake" + testLabelsString = "env=test,team=dev" + testCatalogURI = "http://dremio.example.com" + testCatalogWarehouse = "my-warehouse" + testCatalogNamespace = "test-namespace" + testCatalogTableName = "test-table" + testCatalogPartitioning = "manual" + testCatalogPartitionByFlag = "year,month" + testCatalogAuthType = "dremio" + testDremioTokenEndpoint = "https://auth.dremio.cloud/oauth/token" //nolint:gosec // false url + testDremioToken = "dremio-secret-token" +) + +var ( + // testCtx dummy context for testing purposes + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + // testClient mock API client + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testRunnerId = uuid.NewString() + + testLabels = map[string]string{"env": "test", "team": "dev"} + testCatalogPartitionBy = []string{"year", "month"} +) + +// fixtureFlagValues generates a map of flag values for tests +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + runnerIdFlag: testRunnerId, + descriptionFlag: testDescription, + labelsFlag: testLabelsString, + catalogURIFlag: testCatalogURI, + catalogWarehouseFlag: testCatalogWarehouse, + catalogNamespaceFlag: testCatalogNamespace, + catalogTableNameFlag: testCatalogTableName, + catalogPartitionByFlag: testCatalogPartitionByFlag, + catalogPartitioningFlag: testCatalogPartitioning, + catalogAuthTypeFlag: testCatalogAuthType, + dremioTokenEndpointFlag: testDremioTokenEndpoint, + dremioPatFlag: testDremioToken, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// fixtureInputModel generates an input model for tests +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + DisplayName: utils.Ptr(testDisplayName), + RunnerId: utils.Ptr(testRunnerId), + Description: utils.Ptr(testDescription), + Labels: utils.Ptr(testLabels), + CatalogURI: utils.Ptr(testCatalogURI), + CatalogWarehouse: utils.Ptr(testCatalogWarehouse), + CatalogNamespace: utils.Ptr(testCatalogNamespace), + CatalogTableName: utils.Ptr(testCatalogTableName), + CatalogPartitionBy: utils.Ptr(testCatalogPartitionBy), + CatalogPartitioning: utils.Ptr(testCatalogPartitioning), + CatalogAuthType: utils.Ptr(testCatalogAuthType), + DremioTokenEndpoint: utils.Ptr(testDremioTokenEndpoint), + DremioToken: utils.Ptr(testDremioToken), + } + for _, mod := range mods { + mod(model) + } + return model +} + +// fixtureCreatePayload generates a CreateIntakePayload for tests +func fixtureCreatePayload(mods ...func(payload *intake.CreateIntakePayload)) intake.CreateIntakePayload { + authType := intake.CatalogAuthType(testCatalogAuthType) + testPartitioningType := intake.PartitioningType(testCatalogPartitioning) + payload := intake.CreateIntakePayload{ + DisplayName: utils.Ptr(testDisplayName), + IntakeRunnerId: utils.Ptr(testRunnerId), + Description: utils.Ptr(testDescription), + Labels: utils.Ptr(testLabels), + Catalog: &intake.IntakeCatalog{ + Uri: utils.Ptr(testCatalogURI), + Warehouse: utils.Ptr(testCatalogWarehouse), + Namespace: utils.Ptr(testCatalogNamespace), + TableName: utils.Ptr(testCatalogTableName), + Partitioning: &testPartitioningType, + PartitionBy: utils.Ptr(testCatalogPartitionBy), + Auth: &intake.CatalogAuth{ + Type: &authType, + Dremio: &intake.DremioAuth{ + TokenEndpoint: utils.Ptr(testDremioTokenEndpoint), + PersonalAccessToken: utils.Ptr(testDremioToken), + }, + }, + }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +// fixtureRequest generates an API request for tests +func fixtureRequest(mods ...func(request *intake.ApiCreateIntakeRequest)) intake.ApiCreateIntakeRequest { + request := testClient.CreateIntake(testCtx, testProjectId, testRegion) + request = request.CreateIntakePayload(fixtureCreatePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "runner-id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, runnerIdFlag) + }), + isValid: false, + }, + { + description: "catalog-uri missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, catalogURIFlag) + }), + isValid: false, + }, + { + description: "catalog-warehouse missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, catalogWarehouseFlag) + }), + isValid: false, + }, + { + description: "required fields only", + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + runnerIdFlag: testRunnerId, + catalogURIFlag: testCatalogURI, + catalogWarehouseFlag: testCatalogWarehouse, + catalogAuthTypeFlag: testCatalogAuthType, + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.Labels = nil + model.CatalogNamespace = nil + model.CatalogTableName = nil + model.CatalogPartitioning = nil + model.CatalogPartitionBy = nil + model.DremioTokenEndpoint = nil + model.DremioToken = nil + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiCreateIntakeRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "no optionals", + model: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.Labels = nil + model.CatalogNamespace = nil + model.CatalogTableName = nil + model.CatalogPartitioning = nil + model.CatalogPartitionBy = nil + model.CatalogAuthType = nil + model.DremioTokenEndpoint = nil + model.DremioToken = nil + }), + expectedRequest: fixtureRequest(func(request *intake.ApiCreateIntakeRequest) { + *request = (*request).CreateIntakePayload(fixtureCreatePayload(func(payload *intake.CreateIntakePayload) { + payload.Description = nil + payload.Labels = nil + payload.Catalog.Namespace = nil + payload.Catalog.TableName = nil + payload.Catalog.PartitionBy = nil + payload.Catalog.Partitioning = nil + payload.Catalog.Auth = nil + })) + }), + }, + { + description: "auth type none", + model: fixtureInputModel(func(model *inputModel) { + model.CatalogAuthType = utils.Ptr("none") + model.DremioTokenEndpoint = nil + model.DremioToken = nil + }), + expectedRequest: fixtureRequest(func(request *intake.ApiCreateIntakeRequest) { + *request = (*request).CreateIntakePayload(fixtureCreatePayload(func(payload *intake.CreateIntakePayload) { + authType := intake.CatalogAuthType("none") + payload.Catalog.Auth.Type = &authType + payload.Catalog.Auth.Dremio = nil + })) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + projectLabel string + resp *intake.IntakeResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{ + model: fixtureInputModel(), + projectLabel: "my-project", + resp: &intake.IntakeResponse{Id: utils.Ptr("intake-id-123")}, + }, + wantErr: false, + }, + { + name: "default output - async", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Async = true + }), + projectLabel: "my-project", + resp: &intake.IntakeResponse{Id: utils.Ptr("intake-id-123")}, + }, + wantErr: false, + }, + { + name: "json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: &intake.IntakeResponse{Id: utils.Ptr("intake-id-123")}, + }, + wantErr: false, + }, + { + name: "nil response - default output", + args: args{ + model: fixtureInputModel(), + resp: nil, + }, + wantErr: false, + }, + { + name: "nil response - json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: nil, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/delete/delete.go b/internal/cmd/beta/intake/delete/delete.go new file mode 100644 index 000000000..b55d9997e --- /dev/null +++ b/internal/cmd/beta/intake/delete/delete.go @@ -0,0 +1,114 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +const ( + intakeIdArg = "INTAKE_ID" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + IntakeId string +} + +// NewCmd creates a new cobra command for deleting an Intake +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", intakeIdArg), + Short: "Deletes an Intake", + Long: "Deletes an Intake.", + Args: args.SingleArg(intakeIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete an Intake with ID "xxx"`, + `$ stackit beta intake delete xxx`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + prompt := fmt.Sprintf("Are you sure you want to delete an Intake %q?", model.IntakeId) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + if err = req.Execute(); err != nil { + return fmt.Errorf("delete Intake: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(p.Printer) + s.Start("Deleting STACKIT Intake instance") + _, err = wait.DeleteIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for STACKIT Instance deletion: %w", err) + } + s.Stop() + } + + operationState := "Deleted" + if model.Async { + operationState = "Triggered deletion of" + } + p.Printer.Outputf("%s STACKIT Intake instance %s \n", operationState, model.IntakeId) + + return nil + }, + } + return cmd +} + +// parseInput parses the command arguments and flags into a standardized model +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + intakeId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: intakeId, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to delete an Intake +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiDeleteIntakeRequest { + req := apiClient.DeleteIntake(ctx, model.ProjectId, model.Region, model.IntakeId) + return req +} diff --git a/internal/cmd/beta/intake/delete/delete_test.go b/internal/cmd/beta/intake/delete/delete_test.go new file mode 100644 index 000000000..641c74866 --- /dev/null +++ b/internal/cmd/beta/intake/delete/delete_test.go @@ -0,0 +1,155 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// Define a unique key for the context to avoid collisions +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + // testCtx is a dummy context for testing purposes + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + // testClient is a mock API client + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() +) + +// fixtureArgValues generates a slice of arguments for tests +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testIntakeId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// fixtureFlagValues generates a map of flag values for tests +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// fixtureInputModel generates an input model for tests +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: testIntakeId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// fixtureRequest generates an API request for tests +func fixtureRequest(mods ...func(request *intake.ApiDeleteIntakeRequest)) intake.ApiDeleteIntakeRequest { + request := testClient.DeleteIntake(testCtx, testProjectId, testRegion, testIntakeId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiDeleteIntakeRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/intake/describe/describe.go b/internal/cmd/beta/intake/describe/describe.go new file mode 100644 index 000000000..7c0926591 --- /dev/null +++ b/internal/cmd/beta/intake/describe/describe.go @@ -0,0 +1,145 @@ +package describe + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + intakeIdArg = "INTAKE_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + IntakeId string +} + +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", intakeIdArg), + Short: "Shows details of an Intake", + Long: "Shows details of an Intake.", + Args: args.SingleArg(intakeIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of an Intake with ID "xxx"`, + `$ stackit beta intake describe xxx`), + examples.NewExample( + `Get details of an Intake with ID "xxx" in JSON format`, + `$ stackit beta intake describe xxx --output-format json`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get Intake: %w", err) + } + + return outputResult(p.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + intakeId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: intakeId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiGetIntakeRequest { + req := apiClient.GetIntake(ctx, model.ProjectId, model.Region, model.IntakeId) + return req +} + +func outputResult(p *print.Printer, outputFormat string, intk *intake.IntakeResponse) error { + if intk == nil { + return fmt.Errorf("received nil response, could not display details") + } + + return p.OutputResult(outputFormat, intk, func() error { + table := tables.NewTable() + table.SetHeader("Attribute", "Value") + + table.AddRow("ID", intk.GetId()) + table.AddRow("Name", intk.GetDisplayName()) + table.AddRow("State", intk.GetState()) + table.AddRow("Runner ID", intk.GetIntakeRunnerId()) + table.AddRow("Created", intk.GetCreateTime()) + table.AddRow("Labels", intk.GetLabels()) + + if description := intk.GetDescription(); description != "" { + table.AddRow("Description", description) + } + + if failureMessage := intk.GetFailureMessage(); failureMessage != "" { + table.AddRow("Failure Message", failureMessage) + } + + table.AddSeparator() + table.AddRow("Ingestion URI", intk.GetUri()) + table.AddRow("Topic", intk.GetTopic()) + table.AddRow("Dead Letter Topic", intk.GetDeadLetterTopic()) + table.AddRow("Undelivered Messages", intk.GetUndeliveredMessageCount()) + + table.AddSeparator() + catalog := intk.GetCatalog() + table.AddRow("Catalog URI", catalog.GetUri()) + table.AddRow("Catalog Warehouse", catalog.GetWarehouse()) + if namespace := catalog.GetNamespace(); namespace != "" { + table.AddRow("Catalog Namespace", namespace) + } + if tableName := catalog.GetTableName(); tableName != "" { + table.AddRow("Catalog Table Name", tableName) + } + table.AddRow("Catalog Partitioning", catalog.GetPartitioning()) + if partitionBy := catalog.GetPartitionBy(); partitionBy != nil && len(*partitionBy) > 0 { + table.AddRow("Catalog Partition By", strings.Join(*partitionBy, ", ")) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/beta/intake/describe/describe_test.go b/internal/cmd/beta/intake/describe/describe_test.go new file mode 100644 index 000000000..37c6d3c47 --- /dev/null +++ b/internal/cmd/beta/intake/describe/describe_test.go @@ -0,0 +1,192 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testIntakeId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: testIntakeId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiGetIntakeRequest)) intake.ApiGetIntakeRequest { + request := testClient.GetIntake(testCtx, testProjectId, testRegion, testIntakeId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiGetIntakeRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + intakeResp *intake.IntakeResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", intakeResp: &intake.IntakeResponse{Catalog: &intake.IntakeCatalog{}}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, intakeResp: &intake.IntakeResponse{Catalog: &intake.IntakeCatalog{}}}, + wantErr: false, + }, + { + name: "yaml output", + args: args{outputFormat: print.YAMLOutputFormat, intakeResp: &intake.IntakeResponse{Catalog: &intake.IntakeCatalog{}}}, + wantErr: false, + }, + { + name: "nil response", + args: args{intakeResp: nil}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.intakeResp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/intake.go b/internal/cmd/beta/intake/intake.go index bf298f946..528a9e392 100644 --- a/internal/cmd/beta/intake/intake.go +++ b/internal/cmd/beta/intake/intake.go @@ -2,7 +2,12 @@ package intake import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -23,4 +28,11 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(runner.NewCmd(params)) + + // Intake instance subcommands + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) } diff --git a/internal/cmd/beta/intake/list/list.go b/internal/cmd/beta/intake/list/list.go new file mode 100644 index 000000000..2f19c91f7 --- /dev/null +++ b/internal/cmd/beta/intake/list/list.go @@ -0,0 +1,151 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" +) + +const ( + limitFlag = "limit" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 +} + +// NewCmd creates a new cobra command for listing Intakes +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all Intakes", + Long: "Lists all Intakes for the current project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all Intakes`, + `$ stackit beta intake list`), + examples.NewExample( + `List all Intakes in JSON format`, + `$ stackit beta intake list --output-format json`), + examples.NewExample( + `List up to 5 Intakes`, + `$ stackit beta intake list --limit 5`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list Intakes: %w", err) + } + intakes := resp.GetIntakes() + + // Truncate output + if model.Limit != nil && len(intakes) > int(*model.Limit) { + intakes = intakes[:*model.Limit] + } + + projectLabel := model.ProjectId + if len(intakes) == 0 { + projectLabel, err = projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + } + } + + return outputResult(p.Printer, model.OutputFormat, projectLabel, intakes) + }, + } + configureFlags(cmd) + return cmd +} + +// configureFlags adds the --limit flag to the command +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") +} + +// parseInput parses the command flags into a standardized model +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &cliErr.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to list Intakes +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiListIntakesRequest { + req := apiClient.ListIntakes(ctx, model.ProjectId, model.Region) + return req +} + +// outputResult formats the API response and prints it to the console +func outputResult(p *print.Printer, outputFormat, projectLabel string, intakes []intake.IntakeResponse) error { + return p.OutputResult(outputFormat, intakes, func() error { + if len(intakes) == 0 { + p.Outputf("No intakes found for project %q\n", projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "STATE", "RUNNER ID") + for i := range intakes { + intakeItem := intakes[i] + table.AddRow( + intakeItem.GetId(), + intakeItem.GetDisplayName(), + intakeItem.GetState(), + intakeItem.GetIntakeRunnerId(), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/intake/list/list_test.go b/internal/cmd/beta/intake/list/list_test.go new file mode 100644 index 000000000..e57e733e8 --- /dev/null +++ b/internal/cmd/beta/intake/list/list_test.go @@ -0,0 +1,205 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testLimit = int64(5) +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiListIntakesRequest)) intake.ApiListIntakesRequest { + request := testClient.ListIntakes(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "with limit", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = strconv.FormatInt(testLimit, 10) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(testLimit) + }), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "limit is zero", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + { + description: "limit is negative", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-1" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiListIntakesRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + intakes []intake.IntakeResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", intakes: []intake.IntakeResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, intakes: []intake.IntakeResponse{}}, + wantErr: false, + }, + { + name: "empty slice", + args: args{intakes: []intake.IntakeResponse{}}, + wantErr: false, + }, + { + name: "nil slice", + args: args{intakes: nil}, + wantErr: false, + }, + { + name: "empty intake in slice", + args: args{ + intakes: []intake.IntakeResponse{{}}, + }, + wantErr: false, + }, + { + name: "with project label", + args: args{ + projectLabel: "my-project", + intakes: []intake.IntakeResponse{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.intakes); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/update/update.go b/internal/cmd/beta/intake/update/update.go new file mode 100644 index 000000000..e531e2c91 --- /dev/null +++ b/internal/cmd/beta/intake/update/update.go @@ -0,0 +1,267 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + intakeIdArg = "INTAKE_ID" + + // Top-level flags + displayNameFlag = "display-name" + runnerIdFlag = "runner-id" + descriptionFlag = "description" + labelsFlag = "labels" + + // Catalog flags + catalogURIFlag = "catalog-uri" + catalogWarehouseFlag = "catalog-warehouse" + catalogNamespaceFlag = "catalog-namespace" + catalogTableNameFlag = "catalog-table-name" + + // Auth flags + catalogAuthTypeFlag = "catalog-auth-type" + dremioTokenEndpointFlag = "dremio-token-endpoint" //nolint:gosec // false positive + dremioPatFlag = "dremio-pat" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + + // Main + IntakeId string + DisplayName *string + RunnerId *string + Description *string + Labels *map[string]string + + // Catalog + CatalogURI *string + CatalogWarehouse *string + CatalogNamespace *string + CatalogTableName *string + + // Auth + CatalogAuthType *string + DremioTokenEndpoint *string + DremioToken *string +} + +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", intakeIdArg), + Short: "Updates an Intake", + Long: "Updates an Intake. Only the specified fields are updated.", + Args: args.SingleArg(intakeIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update the display name of an Intake with ID "xxx"`, + `$ stackit beta intake update xxx --runner-id yyy --display-name new-intake-name`), + examples.NewExample( + `Update the catalog details for an Intake with ID "xxx"`, + `$ stackit beta intake update xxx --runner-id yyy --catalog-uri "http://new.uri" --catalog-warehouse "new-warehouse"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update Intake: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + s := spinner.New(p.Printer) + s.Start("Updating STACKIT Intake Runner instance") + _, err = wait.CreateOrUpdateIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("wait for STACKIT Instance creation: %w", err) + } + s.Stop() + } + + return outputResult(p.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + // Top-level flags + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().Var(flags.UUIDFlag(), runnerIdFlag, "The UUID of the Intake Runner to use") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringToString(labelsFlag, nil, `Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2".`) + + // Catalog flags + cmd.Flags().String(catalogURIFlag, "", "The URI to the Iceberg catalog endpoint") + cmd.Flags().String(catalogWarehouseFlag, "", "The Iceberg warehouse to connect to") + cmd.Flags().String(catalogNamespaceFlag, "", "The namespace to which data shall be written") + cmd.Flags().String(catalogTableNameFlag, "", "The table name to identify the table in Iceberg") + + // Auth flags + cmd.Flags().String(catalogAuthTypeFlag, "", "Authentication type for the catalog (e.g., 'none', 'dremio')") + cmd.Flags().String(dremioTokenEndpointFlag, "", "Dremio OAuth 2.0 token endpoint URL") + cmd.Flags().String(dremioPatFlag, "", "Dremio personal access token") + + err := flags.MarkFlagsRequired(cmd, runnerIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + intakeId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := &inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: intakeId, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + RunnerId: flags.FlagToStringPointer(p, cmd, runnerIdFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag), + CatalogURI: flags.FlagToStringPointer(p, cmd, catalogURIFlag), + CatalogWarehouse: flags.FlagToStringPointer(p, cmd, catalogWarehouseFlag), + CatalogNamespace: flags.FlagToStringPointer(p, cmd, catalogNamespaceFlag), + CatalogTableName: flags.FlagToStringPointer(p, cmd, catalogTableNameFlag), + CatalogAuthType: flags.FlagToStringPointer(p, cmd, catalogAuthTypeFlag), + DremioTokenEndpoint: flags.FlagToStringPointer(p, cmd, dremioTokenEndpointFlag), + DremioToken: flags.FlagToStringPointer(p, cmd, dremioPatFlag), + } + + // Check if any optional flag was provided + if model.DisplayName == nil && model.Description == nil && model.Labels == nil && + model.CatalogURI == nil && model.CatalogWarehouse == nil && model.CatalogNamespace == nil && + model.CatalogTableName == nil && model.CatalogAuthType == nil && + model.DremioTokenEndpoint == nil && model.DremioToken == nil { + return nil, &cliErr.EmptyUpdateError{} + } + + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiUpdateIntakeRequest { + req := apiClient.UpdateIntake(ctx, model.ProjectId, model.Region, model.IntakeId) + + payload := intake.UpdateIntakePayload{ + IntakeRunnerId: model.RunnerId, // This is required by the API + DisplayName: model.DisplayName, + Description: model.Description, + Labels: model.Labels, + } + + // Build catalog patch payload only if catalog-related flags are set + catalogPatch := &intake.IntakeCatalogPatch{} + catalogNeedsPatching := false + + if model.CatalogURI != nil { + catalogPatch.Uri = model.CatalogURI + catalogNeedsPatching = true + } + if model.CatalogWarehouse != nil { + catalogPatch.Warehouse = model.CatalogWarehouse + catalogNeedsPatching = true + } + if model.CatalogNamespace != nil { + catalogPatch.Namespace = model.CatalogNamespace + catalogNeedsPatching = true + } + if model.CatalogTableName != nil { + catalogPatch.TableName = model.CatalogTableName + catalogNeedsPatching = true + } + + // Build auth patch payload only if auth-related flags are set + authPatch := &intake.CatalogAuthPatch{} + authNeedsPatching := false + + if model.CatalogAuthType != nil { + authType := intake.CatalogAuthType(*model.CatalogAuthType) + authPatch.Type = &authType + authNeedsPatching = true + } + + dremioPatch := &intake.DremioAuthPatch{} + dremioNeedsPatching := false + if model.DremioTokenEndpoint != nil { + dremioPatch.TokenEndpoint = model.DremioTokenEndpoint + dremioNeedsPatching = true + } + if model.DremioToken != nil { + dremioPatch.PersonalAccessToken = model.DremioToken + dremioNeedsPatching = true + } + + if dremioNeedsPatching { + authPatch.Dremio = dremioPatch + authNeedsPatching = true + } + + if authNeedsPatching { + catalogPatch.Auth = authPatch + catalogNeedsPatching = true + } + + if catalogNeedsPatching { + payload.Catalog = catalogPatch + } + + req = req.UpdateIntakePayload(payload) + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *intake.IntakeResponse) error { + return p.OutputResult(model.OutputFormat, resp, func() error { + if resp == nil { + p.Outputf("Updated Intake for project %q, but no intake ID was returned.\n", projectLabel) + return nil + } + + operationState := "Updated" + if model.Async { + operationState = "Triggered update of" + } + p.Outputf("%s Intake for project %q. Intake ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/intake/update/update_test.go b/internal/cmd/beta/intake/update/update_test.go new file mode 100644 index 000000000..6d6635cb0 --- /dev/null +++ b/internal/cmd/beta/intake/update/update_test.go @@ -0,0 +1,283 @@ +package update + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() + testRunnerId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{testIntakeId} + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + runnerIdFlag: testRunnerId, + displayNameFlag: "new-display-name", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: testIntakeId, + RunnerId: utils.Ptr(testRunnerId), + DisplayName: utils.Ptr("new-display-name"), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no optional flags provided", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + runnerIdFlag: testRunnerId, + }, + isValid: false, + }, + { + description: "update all fields", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[descriptionFlag] = "new description" + flagValues[labelsFlag] = "env=prod,team=sre" + flagValues[catalogURIFlag] = "new-uri" + flagValues[catalogWarehouseFlag] = "new-warehouse" + flagValues[catalogNamespaceFlag] = "new-namespace" + flagValues[catalogTableNameFlag] = "new-table" + flagValues[catalogAuthTypeFlag] = "dremio" + flagValues[dremioTokenEndpointFlag] = "new-endpoint" + flagValues[dremioPatFlag] = "new-pat" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = utils.Ptr("new description") + model.Labels = utils.Ptr(map[string]string{"env": "prod", "team": "sre"}) + model.CatalogURI = utils.Ptr("new-uri") + model.CatalogWarehouse = utils.Ptr("new-warehouse") + model.CatalogNamespace = utils.Ptr("new-namespace") + model.CatalogTableName = utils.Ptr("new-table") + model.CatalogAuthType = utils.Ptr("dremio") + model.DremioTokenEndpoint = utils.Ptr("new-endpoint") + model.DremioToken = utils.Ptr("new-pat") + }), + }, + { + description: "no args", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "runner-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, runnerIdFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedReq intake.ApiUpdateIntakeRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedReq: testClient.UpdateIntake(testCtx, testProjectId, testRegion, testIntakeId). + UpdateIntakePayload(intake.UpdateIntakePayload{ + IntakeRunnerId: utils.Ptr(testRunnerId), + DisplayName: utils.Ptr("new-display-name"), + }), + }, + { + description: "update description and catalog uri", + model: fixtureInputModel(func(model *inputModel) { + model.DisplayName = nil + model.Description = utils.Ptr("new-desc") + model.CatalogURI = utils.Ptr("new-uri") + }), + expectedReq: testClient.UpdateIntake(testCtx, testProjectId, testRegion, testIntakeId). + UpdateIntakePayload(intake.UpdateIntakePayload{ + IntakeRunnerId: utils.Ptr(testRunnerId), + Description: utils.Ptr("new-desc"), + Catalog: &intake.IntakeCatalogPatch{ + Uri: utils.Ptr("new-uri"), + }, + }), + }, + { + description: "update all fields", + model: fixtureInputModel(func(model *inputModel) { + model.DisplayName = utils.Ptr("another-name") + model.Description = utils.Ptr("final-desc") + model.Labels = utils.Ptr(map[string]string{"a": "b"}) + model.CatalogURI = utils.Ptr("final-uri") + model.CatalogWarehouse = utils.Ptr("final-warehouse") + model.CatalogNamespace = utils.Ptr("final-namespace") + model.CatalogTableName = utils.Ptr("final-table") + model.CatalogAuthType = utils.Ptr("dremio") + model.DremioTokenEndpoint = utils.Ptr("final-endpoint") + model.DremioToken = utils.Ptr("final-token") + }), + expectedReq: testClient.UpdateIntake(testCtx, testProjectId, testRegion, testIntakeId). + UpdateIntakePayload(intake.UpdateIntakePayload{ + IntakeRunnerId: utils.Ptr(testRunnerId), + DisplayName: utils.Ptr("another-name"), + Description: utils.Ptr("final-desc"), + Labels: utils.Ptr(map[string]string{"a": "b"}), + Catalog: &intake.IntakeCatalogPatch{ + Uri: utils.Ptr("final-uri"), + Warehouse: utils.Ptr("final-warehouse"), + Namespace: utils.Ptr("final-namespace"), + TableName: utils.Ptr("final-table"), + Auth: &intake.CatalogAuthPatch{ + Type: utils.Ptr(intake.CatalogAuthType("dremio")), + Dremio: &intake.DremioAuthPatch{ + TokenEndpoint: utils.Ptr("final-endpoint"), + PersonalAccessToken: utils.Ptr("final-token"), + }, + }, + }, + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedReq, request, + cmp.AllowUnexported(request), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + intakeId string + resp *intake.IntakeResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", projectLabel: "my-project", intakeId: "intake-id-123", resp: &intake.IntakeResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, resp: &intake.IntakeResponse{Id: utils.Ptr("intake-id-123")}}, + wantErr: false, + }, + { + name: "yaml output", + args: args{outputFormat: print.YAMLOutputFormat, resp: &intake.IntakeResponse{Id: utils.Ptr("runner-id-123")}}, + wantErr: false, + }, + { + name: "nil response", + args: args{outputFormat: print.JSONOutputFormat, resp: nil}, + wantErr: false, + }, + { + name: "nil response - default output", + args: args{outputFormat: "default", resp: nil}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: tt.args.outputFormat}}, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} From 043481b2ef826565c281697d32f2c8af406890e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 16:51:31 +0000 Subject: [PATCH 356/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceenablement (#1283) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 280661ca4..72629a50a 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 - github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 + github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 diff --git a/go.sum b/go.sum index 38a831cb6..6ffb19a44 100644 --- a/go.sum +++ b/go.sum @@ -654,8 +654,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 h1:sQ3fdtUjg github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6/go.mod h1:3fjlL+9YtuI9Oocl1ZeYIK48ImtY4DwPggFhqAygr7o= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 h1:WU76mZkJP6diMDjGFqM8On6fZhUDmGcy6ppX0+kWx9Y= github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6/go.mod h1:hRllU+yEJM6ovrLeXwVeT5hI70ftPKjX4z/Nj8TZqJw= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4 h1:h4aSfJPMBBcXrG/BZiLLZRvvGJesRdll4bLP7jetuKA= -github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.4/go.mod h1:Iv+svIxk5baXnvrEdvVl5JZri6a3H/2OrQDlRWmUFMI= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 h1:M2PYLF8k3zmAwYWSKfUiCTNTXr7ROGuJganVVEQA3YI= +github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7/go.mod h1:jitkQuP2K/SH63Qor0C4pcqz1GDCy/lK2H4t8/VDse4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 h1:c+nQMvSml08cdRF1kE24vCw0r/l56olP/svQyhcnKOs= From 66e00dc3a7b0980694ee801f70fa92ce7ac81be3 Mon Sep 17 00:00:00 2001 From: Manuel Vaas <34416897+Manuelvaas@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:47:33 +0100 Subject: [PATCH 357/422] feat(logs): onboard access-token commands (#1253) relates to STACKITCLI-293 --- docs/stackit_logs.md | 1 + docs/stackit_logs_access-token.md | 40 +++ docs/stackit_logs_access-token_create.md | 51 ++++ ...it_logs_access-token_delete-all-expired.md | 41 +++ docs/stackit_logs_access-token_delete-all.md | 41 +++ docs/stackit_logs_access-token_delete.md | 41 +++ docs/stackit_logs_access-token_describe.md | 44 +++ docs/stackit_logs_access-token_list.md | 48 +++ docs/stackit_logs_access-token_update.md | 46 +++ .../cmd/logs/access_token/access_token.go | 38 +++ .../cmd/logs/access_token/create/create.go | 157 ++++++++++ .../logs/access_token/create/create_test.go | 282 ++++++++++++++++++ .../cmd/logs/access_token/delete/delete.go | 116 +++++++ .../logs/access_token/delete/delete_test.go | 207 +++++++++++++ .../access_token/delete_all/delete_all.go | 111 +++++++ .../delete_all/delete_all_test.go | 163 ++++++++++ .../delete_all_expired/delete_all_expired.go | 111 +++++++ .../delete_all_expired_test.go | 163 ++++++++++ .../logs/access_token/describe/describe.go | 135 +++++++++ .../access_token/describe/describe_test.go | 263 ++++++++++++++++ internal/cmd/logs/access_token/list/list.go | 160 ++++++++++ .../cmd/logs/access_token/list/list_test.go | 240 +++++++++++++++ .../cmd/logs/access_token/update/update.go | 144 +++++++++ .../logs/access_token/update/update_test.go | 277 +++++++++++++++++ internal/cmd/logs/logs.go | 2 + internal/pkg/services/logs/utils/utils.go | 13 + .../pkg/services/logs/utils/utils_test.go | 80 ++++- 27 files changed, 3011 insertions(+), 4 deletions(-) create mode 100644 docs/stackit_logs_access-token.md create mode 100644 docs/stackit_logs_access-token_create.md create mode 100644 docs/stackit_logs_access-token_delete-all-expired.md create mode 100644 docs/stackit_logs_access-token_delete-all.md create mode 100644 docs/stackit_logs_access-token_delete.md create mode 100644 docs/stackit_logs_access-token_describe.md create mode 100644 docs/stackit_logs_access-token_list.md create mode 100644 docs/stackit_logs_access-token_update.md create mode 100644 internal/cmd/logs/access_token/access_token.go create mode 100644 internal/cmd/logs/access_token/create/create.go create mode 100644 internal/cmd/logs/access_token/create/create_test.go create mode 100644 internal/cmd/logs/access_token/delete/delete.go create mode 100644 internal/cmd/logs/access_token/delete/delete_test.go create mode 100644 internal/cmd/logs/access_token/delete_all/delete_all.go create mode 100644 internal/cmd/logs/access_token/delete_all/delete_all_test.go create mode 100644 internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go create mode 100644 internal/cmd/logs/access_token/delete_all_expired/delete_all_expired_test.go create mode 100644 internal/cmd/logs/access_token/describe/describe.go create mode 100644 internal/cmd/logs/access_token/describe/describe_test.go create mode 100644 internal/cmd/logs/access_token/list/list.go create mode 100644 internal/cmd/logs/access_token/list/list_test.go create mode 100644 internal/cmd/logs/access_token/update/update.go create mode 100644 internal/cmd/logs/access_token/update/update_test.go diff --git a/docs/stackit_logs.md b/docs/stackit_logs.md index 212cf8c4e..f01dc7d0d 100644 --- a/docs/stackit_logs.md +++ b/docs/stackit_logs.md @@ -30,5 +30,6 @@ stackit logs [flags] ### SEE ALSO * [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens * [stackit logs instance](./stackit_logs_instance.md) - Provides functionality for Logs instances diff --git a/docs/stackit_logs_access-token.md b/docs/stackit_logs_access-token.md new file mode 100644 index 000000000..a42baa613 --- /dev/null +++ b/docs/stackit_logs_access-token.md @@ -0,0 +1,40 @@ +## stackit logs access-token + +Provides functionality for Logs access-tokens + +### Synopsis + +Provides functionality for Logs access-tokens. + +``` +stackit logs access-token [flags] +``` + +### Options + +``` + -h, --help Help for "stackit logs access-token" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs](./stackit_logs.md) - Provides functionality for Logs +* [stackit logs access-token create](./stackit_logs_access-token_create.md) - Creates a Logs access token +* [stackit logs access-token delete](./stackit_logs_access-token_delete.md) - Deletes a Logs access token +* [stackit logs access-token delete-all](./stackit_logs_access-token_delete-all.md) - Deletes all Logs access token +* [stackit logs access-token delete-all-expired](./stackit_logs_access-token_delete-all-expired.md) - Deletes all expired Logs access token +* [stackit logs access-token describe](./stackit_logs_access-token_describe.md) - Shows details of a Logs access token +* [stackit logs access-token list](./stackit_logs_access-token_list.md) - Lists all Logs access tokens of a project +* [stackit logs access-token update](./stackit_logs_access-token_update.md) - Updates a Logs access token + diff --git a/docs/stackit_logs_access-token_create.md b/docs/stackit_logs_access-token_create.md new file mode 100644 index 000000000..947260d03 --- /dev/null +++ b/docs/stackit_logs_access-token_create.md @@ -0,0 +1,51 @@ +## stackit logs access-token create + +Creates a Logs access token + +### Synopsis + +Creates a Logs access token. + +``` +stackit logs access-token create [flags] +``` + +### Examples + +``` + Create a access token with the display name "access-token-1" for the instance "xxx" with read and write permissions + $ stackit logs access-token create --display-name access-token-1 --instance-id xxx --permissions read,write + + Create a write only access token with a description + $ stackit logs access-token create --display-name access-token-2 --instance-id xxx --permissions write --description "Access token for service" + + Create a read only access token which expires in 30 days + $ stackit logs access-token create --display-name access-token-3 --instance-id xxx --permissions read --lifetime 30 +``` + +### Options + +``` + --description string Description of the access token + --display-name string Display name for the access token + -h, --help Help for "stackit logs access-token create" + --instance-id string ID of the Logs instance + --lifetime int Lifetime of the access token in days [1 - 180] + --permissions strings Permissions of the access token ["read" "write"] +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/docs/stackit_logs_access-token_delete-all-expired.md b/docs/stackit_logs_access-token_delete-all-expired.md new file mode 100644 index 000000000..b63792e63 --- /dev/null +++ b/docs/stackit_logs_access-token_delete-all-expired.md @@ -0,0 +1,41 @@ +## stackit logs access-token delete-all-expired + +Deletes all expired Logs access token + +### Synopsis + +Deletes all expired Logs access token. + +``` +stackit logs access-token delete-all-expired [flags] +``` + +### Examples + +``` + Delete all expired access tokens in instance "xxx" + $ stackit logs access-token delete-all-expired --instance-id xxx +``` + +### Options + +``` + -h, --help Help for "stackit logs access-token delete-all-expired" + --instance-id string ID of the Logs instance +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/docs/stackit_logs_access-token_delete-all.md b/docs/stackit_logs_access-token_delete-all.md new file mode 100644 index 000000000..de546fdef --- /dev/null +++ b/docs/stackit_logs_access-token_delete-all.md @@ -0,0 +1,41 @@ +## stackit logs access-token delete-all + +Deletes all Logs access token + +### Synopsis + +Deletes all Logs access token. + +``` +stackit logs access-token delete-all [flags] +``` + +### Examples + +``` + Delete all access tokens in instance "xxx" + $ stackit logs access-token delete-all --instance-id xxx +``` + +### Options + +``` + -h, --help Help for "stackit logs access-token delete-all" + --instance-id string ID of the Logs instance +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/docs/stackit_logs_access-token_delete.md b/docs/stackit_logs_access-token_delete.md new file mode 100644 index 000000000..99d700c81 --- /dev/null +++ b/docs/stackit_logs_access-token_delete.md @@ -0,0 +1,41 @@ +## stackit logs access-token delete + +Deletes a Logs access token + +### Synopsis + +Deletes a Logs access token. + +``` +stackit logs access-token delete ACCESS_TOKEN_ID [flags] +``` + +### Examples + +``` + Delete access token with ID "xxx" in instance "yyy" + $ stackit logs access-token delete xxx --instance-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit logs access-token delete" + --instance-id string ID of the Logs instance +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/docs/stackit_logs_access-token_describe.md b/docs/stackit_logs_access-token_describe.md new file mode 100644 index 000000000..1e690bcda --- /dev/null +++ b/docs/stackit_logs_access-token_describe.md @@ -0,0 +1,44 @@ +## stackit logs access-token describe + +Shows details of a Logs access token + +### Synopsis + +Shows details of a Logs access token. + +``` +stackit logs access-token describe ACCESS_TOKEN_ID [flags] +``` + +### Examples + +``` + Show details of a Logs access token with ID "xxx" + $ stackit logs access-token describe xxx + + Show details of a Logs access token with ID "xxx" in JSON format + $ stackit logs access-token describe xxx --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit logs access-token describe" + --instance-id string ID of the Logs instance +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/docs/stackit_logs_access-token_list.md b/docs/stackit_logs_access-token_list.md new file mode 100644 index 000000000..0fc6b899e --- /dev/null +++ b/docs/stackit_logs_access-token_list.md @@ -0,0 +1,48 @@ +## stackit logs access-token list + +Lists all Logs access tokens of a project + +### Synopsis + +Lists all access tokens of a project. + +``` +stackit logs access-token list [flags] +``` + +### Examples + +``` + Lists all access tokens of the instance "xxx" + $ stackit logs access-token list --instance-id xxx + + Lists all access tokens in JSON format + $ stackit logs access-token list --instance-id xxx --output-format json + + Lists up to 10 access-token + $ stackit logs access-token list --instance-id xxx --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit logs access-token list" + --instance-id string ID of the Logs instance + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/docs/stackit_logs_access-token_update.md b/docs/stackit_logs_access-token_update.md new file mode 100644 index 000000000..10bc62701 --- /dev/null +++ b/docs/stackit_logs_access-token_update.md @@ -0,0 +1,46 @@ +## stackit logs access-token update + +Updates a Logs access token + +### Synopsis + +Updates a access token. + +``` +stackit logs access-token update ACCESS_TOKEN_ID [flags] +``` + +### Examples + +``` + Update access token with ID "xxx" with new name "access-token-1" + $ stackit logs access-token update xxx --instance-id yyy --display-name access-token-1 + + Update access token with ID "xxx" with new description "Access token for Service XY" + $ stackit logs access-token update xxx --instance-id yyy --description "Access token for Service XY" +``` + +### Options + +``` + --description string Description of the access token + --display-name string Display name for the access token + -h, --help Help for "stackit logs access-token update" + --instance-id string ID of the Logs instance +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit logs access-token](./stackit_logs_access-token.md) - Provides functionality for Logs access-tokens + diff --git a/internal/cmd/logs/access_token/access_token.go b/internal/cmd/logs/access_token/access_token.go new file mode 100644 index 000000000..1013dfe77 --- /dev/null +++ b/internal/cmd/logs/access_token/access_token.go @@ -0,0 +1,38 @@ +package access_token + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/delete_all" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/delete_all_expired" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "access-token", + Short: "Provides functionality for Logs access-tokens", + Long: "Provides functionality for Logs access-tokens.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(delete_all.NewCmd(params)) + cmd.AddCommand(delete_all_expired.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) +} diff --git a/internal/cmd/logs/access_token/create/create.go b/internal/cmd/logs/access_token/create/create.go new file mode 100644 index 000000000..452342b3d --- /dev/null +++ b/internal/cmd/logs/access_token/create/create.go @@ -0,0 +1,157 @@ +package create + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/cobra" +) + +const ( + displayNameFlag = "display-name" + instanceIdFlag = "instance-id" + lifetimeFlag = "lifetime" + descriptionFlag = "description" + permissionsFlag = "permissions" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string + Description *string + DisplayName string + Lifetime *int64 + Permissions []string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a Logs access token", + Long: "Creates a Logs access token.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a access token with the display name "access-token-1" for the instance "xxx" with read and write permissions`, + `$ stackit logs access-token create --display-name access-token-1 --instance-id xxx --permissions read,write`, + ), + examples.NewExample( + `Create a write only access token with a description`, + `$ stackit logs access-token create --display-name access-token-2 --instance-id xxx --permissions write --description "Access token for service"`, + ), + examples.NewExample( + `Create a read only access token which expires in 30 days`, + `$ stackit logs access-token create --display-name access-token-3 --instance-id xxx --permissions read --lifetime 30`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + instanceLabel, err := logsUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId + } + + prompt := fmt.Sprintf("Are you sure you want to create a access token for the Logs instance %q in the project %q?", instanceLabel, projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create Logs access-token : %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, instanceLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + cmd.Flags().String(displayNameFlag, "", "Display name for the access token") + cmd.Flags().String(descriptionFlag, "", "Description of the access token") + cmd.Flags().Int64(lifetimeFlag, 0, "Lifetime of the access token in days [1 - 180]") + cmd.Flags().StringSlice(permissionsFlag, []string{}, `Permissions of the access token ["read" "write"]`) + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag, displayNameFlag, permissionsFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + DisplayName: flags.FlagToStringValue(p, cmd, displayNameFlag), + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Lifetime: flags.FlagToInt64Pointer(p, cmd, lifetimeFlag), + Permissions: flags.FlagToStringSliceValue(p, cmd, permissionsFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiCreateAccessTokenRequest { + req := apiClient.CreateAccessToken(ctx, model.ProjectId, model.Region, model.InstanceId) + + return req.CreateAccessTokenPayload(logs.CreateAccessTokenPayload{ + Description: model.Description, + DisplayName: &model.DisplayName, + Lifetime: model.Lifetime, + Permissions: &model.Permissions, + }) +} + +func outputResult(p *print.Printer, outputFormat, instanceLabel string, accessToken *logs.AccessToken) error { + if accessToken == nil { + return fmt.Errorf("access token cannot be nil") + } + return p.OutputResult(outputFormat, accessToken, func() error { + p.Outputf("Created access token for Logs instance %q.\n\nID: %s\nToken: %s\n", instanceLabel, utils.PtrValue(accessToken.Id), utils.PtrValue(accessToken.AccessToken)) + return nil + }) +} diff --git a/internal/cmd/logs/access_token/create/create_test.go b/internal/cmd/logs/access_token/create/create_test.go new file mode 100644 index 000000000..e29fc864e --- /dev/null +++ b/internal/cmd/logs/access_token/create/create_test.go @@ -0,0 +1,282 @@ +package create + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" + + testDisplayName = "display-name" + testDescription = "description" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + displayNameFlag: testDisplayName, + descriptionFlag: testDescription, + permissionsFlag: "read,write", + lifetimeFlag: "0", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + Description: utils.Ptr(testDescription), + DisplayName: testDisplayName, + Lifetime: utils.Ptr(int64(0)), + Permissions: []string{ + "read", + "write", + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiCreateAccessTokenRequest)) logs.ApiCreateAccessTokenRequest { + request := testClient.CreateAccessToken(testCtx, testProjectId, testRegion, testInstanceId) + request = request.CreateAccessTokenPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *logs.CreateAccessTokenPayload)) logs.CreateAccessTokenPayload { + payload := logs.CreateAccessTokenPayload{ + DisplayName: utils.Ptr(testDisplayName), + Description: utils.Ptr(testDescription), + Lifetime: utils.Ptr(int64(0)), + Permissions: utils.Ptr([]string{ + "read", + "write", + }), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "only required flags", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, lifetimeFlag) + delete(flagValues, descriptionFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Lifetime = nil + model.Description = nil + }), + }, + { + description: "one permission", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[permissionsFlag] = "read" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Permissions = []string{ + "read", + } + }), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "lifetime invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[lifetimeFlag] = "invalid-integer" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + var tests = []struct { + description string + model *inputModel + expectedRequest logs.ApiCreateAccessTokenRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedRequest, request, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + instanceLabel string + accessToken *logs.AccessToken + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "base", + args: args{ + instanceLabel: "", + accessToken: utils.Ptr(logs.AccessToken{ + Id: utils.Ptr(uuid.NewString()), + Permissions: utils.Ptr([]string{ + "read", + "write", + }), + DisplayName: utils.Ptr("Token"), + AccessToken: utils.Ptr("Secret access token"), + Creator: utils.Ptr(uuid.NewString()), + Expires: utils.Ptr(false), + Status: utils.Ptr(logs.ACCESSTOKENSTATUS_ACTIVE), + }), + }, + wantErr: false, + }, + { + name: "empty access token", + args: args{ + instanceLabel: "", + accessToken: utils.Ptr(logs.AccessToken{}), + }, + wantErr: false, + }, + { + name: "empty", + args: args{}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.instanceLabel, tt.args.accessToken); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/logs/access_token/delete/delete.go b/internal/cmd/logs/access_token/delete/delete.go new file mode 100644 index 000000000..77b4777dc --- /dev/null +++ b/internal/cmd/logs/access_token/delete/delete.go @@ -0,0 +1,116 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +const ( + instanceIdFlag = "instance-id" + accessTokenIdArg = "ACCESS_TOKEN_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string + AccessTokenId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", accessTokenIdArg), + Short: "Deletes a Logs access token", + Long: "Deletes a Logs access token.", + Args: args.SingleArg(accessTokenIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete access token with ID "xxx" in instance "yyy"`, + "$ stackit logs access-token delete xxx --instance-id yyy", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get the display name for confirmation + accessTokenLabel, err := logUtils.GetAccessTokenName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId, model.AccessTokenId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get access token: %v", err) + } + if accessTokenLabel == "" { + accessTokenLabel = model.AccessTokenId + } + + prompt := fmt.Sprintf("Are you sure you want to delete access token %q?", accessTokenLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete access token: %w", err) + } + + params.Printer.Outputf("Deleted access token %q\n", accessTokenLabel) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + accessTokenId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + AccessTokenId: accessTokenId, + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiDeleteAccessTokenRequest { + return apiClient.DeleteAccessToken(ctx, model.ProjectId, model.Region, model.InstanceId, model.AccessTokenId) +} diff --git a/internal/cmd/logs/access_token/delete/delete_test.go b/internal/cmd/logs/access_token/delete/delete_test.go new file mode 100644 index 000000000..23bbb5464 --- /dev/null +++ b/internal/cmd/logs/access_token/delete/delete_test.go @@ -0,0 +1,207 @@ +package delete + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() + testAccessTokenId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testAccessTokenId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + AccessTokenId: testAccessTokenId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiDeleteAccessTokenRequest)) logs.ApiDeleteAccessTokenRequest { + request := testClient.DeleteAccessToken(testCtx, testProjectId, testRegion, testInstanceId, testAccessTokenId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "access token id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "access token id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiDeleteAccessTokenRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/logs/access_token/delete_all/delete_all.go b/internal/cmd/logs/access_token/delete_all/delete_all.go new file mode 100644 index 000000000..337010be8 --- /dev/null +++ b/internal/cmd/logs/access_token/delete_all/delete_all.go @@ -0,0 +1,111 @@ +package delete_all + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + + "github.com/spf13/cobra" +) + +const ( + instanceIdFlag = "instance-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete-all", + Short: "Deletes all Logs access token", + Long: "Deletes all Logs access token.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Delete all access tokens in instance "xxx"`, + "$ stackit logs access-token delete-all --instance-id xxx", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + instanceLabel, err := logUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId + } + + prompt := fmt.Sprintf("Are you sure you want to delete all access tokens for instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + items, err := req.Execute() + if err != nil { + return fmt.Errorf("delete all access token: %w", err) + } + if items == nil { + return fmt.Errorf("delete all access token: nil result") + } + + params.Printer.Outputf("Deleted %d access token(s)\n", len(utils.PtrValue(items.Tokens))) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiDeleteAllAccessTokensRequest { + return apiClient.DeleteAllAccessTokens(ctx, model.ProjectId, model.Region, model.InstanceId) +} diff --git a/internal/cmd/logs/access_token/delete_all/delete_all_test.go b/internal/cmd/logs/access_token/delete_all/delete_all_test.go new file mode 100644 index 000000000..7cc8e8a81 --- /dev/null +++ b/internal/cmd/logs/access_token/delete_all/delete_all_test.go @@ -0,0 +1,163 @@ +package delete_all + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiDeleteAllAccessTokensRequest)) logs.ApiDeleteAllAccessTokensRequest { + request := testClient.DeleteAllAccessTokens(testCtx, testProjectId, testRegion, testInstanceId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no flag values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiDeleteAllAccessTokensRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go b/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go new file mode 100644 index 000000000..a4673a073 --- /dev/null +++ b/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go @@ -0,0 +1,111 @@ +package delete_all_expired + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + + "github.com/spf13/cobra" +) + +const ( + instanceIdFlag = "instance-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "delete-all-expired", + Short: "Deletes all expired Logs access token", + Long: "Deletes all expired Logs access token.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Delete all expired access tokens in instance "xxx"`, + "$ stackit logs access-token delete-all-expired --instance-id xxx", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + instanceLabel, err := logUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) + instanceLabel = model.InstanceId + } + + prompt := fmt.Sprintf("Are you sure you want to delete all expired access tokens in instance %q?", instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + items, err := req.Execute() + if err != nil { + return fmt.Errorf("delete all expired access token: %w", err) + } + if items == nil { + return fmt.Errorf("delete all expired access token: nil result") + } + + params.Printer.Outputf("Deleted %d expired access token(s)\n", len(utils.PtrValue(items.Tokens))) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiDeleteAllAccessTokensRequest { + return apiClient.DeleteAllExpiredAccessTokens(ctx, model.ProjectId, model.Region, model.InstanceId) +} diff --git a/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired_test.go b/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired_test.go new file mode 100644 index 000000000..f369afa91 --- /dev/null +++ b/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired_test.go @@ -0,0 +1,163 @@ +package delete_all_expired + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiDeleteAllExpiredAccessTokensRequest)) logs.ApiDeleteAllExpiredAccessTokensRequest { + request := testClient.DeleteAllExpiredAccessTokens(testCtx, testProjectId, testRegion, testInstanceId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no flag values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiDeleteAllExpiredAccessTokensRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/logs/access_token/describe/describe.go b/internal/cmd/logs/access_token/describe/describe.go new file mode 100644 index 000000000..21f734a51 --- /dev/null +++ b/internal/cmd/logs/access_token/describe/describe.go @@ -0,0 +1,135 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/cobra" +) + +const ( + instanceIdFlag = "instance-id" + accessTokenIdArg = "ACCESS_TOKEN_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string + AccessTokenId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", accessTokenIdArg), + Short: "Shows details of a Logs access token", + Long: "Shows details of a Logs access token.", + Args: args.SingleArg(accessTokenIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Show details of a Logs access token with ID "xxx"`, + "$ stackit logs access-token describe xxx", + ), + examples.NewExample( + `Show details of a Logs access token with ID "xxx" in JSON format`, + "$ stackit logs access-token describe xxx --output-format json", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("read access token: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + accessTokenId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + AccessTokenId: accessTokenId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiGetAccessTokenRequest { + return apiClient.GetAccessToken(ctx, model.ProjectId, model.Region, model.InstanceId, model.AccessTokenId) +} + +func outputResult(p *print.Printer, outputFormat string, token *logs.AccessToken) error { + if token == nil { + return fmt.Errorf("access token cannot be nil") + } + return p.OutputResult(outputFormat, token, func() error { + table := tables.NewTable() + table.AddRow("ID", utils.PtrString(token.Id)) + table.AddSeparator() + table.AddRow("DISPLAY NAME", utils.PtrString(token.DisplayName)) + table.AddSeparator() + table.AddRow("DESCRIPTION", utils.PtrString(token.Description)) + table.AddSeparator() + table.AddRow("PERMISSIONS", utils.PtrString(token.Permissions)) + table.AddSeparator() + table.AddRow("CREATOR", utils.PtrString(token.Creator)) + table.AddSeparator() + table.AddRow("STATE", utils.PtrString(token.Status)) + table.AddSeparator() + table.AddRow("EXPIRES", utils.PtrString(token.Expires)) + table.AddSeparator() + table.AddRow("VALID UNTIL", utils.PtrString(token.ValidUntil)) + table.AddSeparator() + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/logs/access_token/describe/describe_test.go b/internal/cmd/logs/access_token/describe/describe_test.go new file mode 100644 index 000000000..be083cd72 --- /dev/null +++ b/internal/cmd/logs/access_token/describe/describe_test.go @@ -0,0 +1,263 @@ +package describe + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() + testAccessTokenId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testAccessTokenId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + AccessTokenId: testAccessTokenId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiGetAccessTokenRequest)) logs.ApiGetAccessTokenRequest { + request := testClient.GetAccessToken(testCtx, testProjectId, testRegion, testInstanceId, testAccessTokenId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "access token id invalid 1", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "access token id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiGetAccessTokenRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + accessToken *logs.AccessToken + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "base", + args: args{ + accessToken: utils.Ptr(logs.AccessToken{ + Id: utils.Ptr(uuid.NewString()), + Permissions: utils.Ptr([]string{ + "read", + "write", + }), + DisplayName: utils.Ptr("Token"), + AccessToken: utils.Ptr("Secret access token"), + Creator: utils.Ptr(uuid.NewString()), + Expires: utils.Ptr(false), + Status: utils.Ptr(logs.ACCESSTOKENSTATUS_ACTIVE), + }), + }, + wantErr: false, + }, + { + name: "set empty access token", + args: args{ + accessToken: utils.Ptr(logs.AccessToken{}), + }, + wantErr: false, + }, + { + name: "empty", + args: args{}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.accessToken); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/logs/access_token/list/list.go b/internal/cmd/logs/access_token/list/list.go new file mode 100644 index 000000000..309fd073f --- /dev/null +++ b/internal/cmd/logs/access_token/list/list.go @@ -0,0 +1,160 @@ +package list + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/spf13/cobra" +) + +const ( + limitFlag = "limit" + instanceIdFlag = "instance-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string + Limit *int64 +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all Logs access tokens of a project", + Long: "Lists all access tokens of a project.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Lists all access tokens of the instance "xxx"`, + "$ stackit logs access-token list --instance-id xxx", + ), + examples.NewExample( + `Lists all access tokens in JSON format`, + "$ stackit logs access-token list --instance-id xxx --output-format json", + ), + examples.NewExample( + `Lists up to 10 access-token`, + "$ stackit logs access-token list --instance-id xxx --limit 10", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list access tokens: %w", err) + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + // Truncate output + items := utils.PtrValue(resp.Tokens) + if model.Limit != nil && len(items) > int(*model.Limit) { + items = items[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, items, projectLabel) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiListAccessTokensRequest { + return apiClient.ListAccessTokens(ctx, model.ProjectId, model.Region, model.InstanceId) +} + +func outputResult(p *print.Printer, outputFormat string, tokens []logs.AccessToken, projectLabel string) error { + return p.OutputResult(outputFormat, tokens, func() error { + if len(tokens) == 0 { + p.Outputf("No access token found for project %q\n", projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "DESCRIPTION", "PERMISSIONS", "VALID UNTIL", "STATUS") + + for _, token := range tokens { + table.AddRow( + utils.PtrString(token.Id), + utils.PtrString(token.DisplayName), + utils.PtrString(token.Description), + utils.PtrString(token.Permissions), + utils.PtrString(token.ValidUntil), + utils.PtrString(token.Status), + ) + table.AddSeparator() + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/logs/access_token/list/list_test.go b/internal/cmd/logs/access_token/list/list_test.go new file mode 100644 index 000000000..41c8c2b29 --- /dev/null +++ b/internal/cmd/logs/access_token/list/list_test.go @@ -0,0 +1,240 @@ +package list + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + limitFlag: "10", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + Limit: utils.Ptr(int64(10)), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiListAccessTokensRequest)) logs.ApiListAccessTokensRequest { + request := testClient.ListAccessTokens(testCtx, testProjectId, testRegion, testInstanceId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no flag values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "limit invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "limit invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiListAccessTokensRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + accessTokens []logs.AccessToken + projectLabel string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "base", + args: args{ + accessTokens: []logs.AccessToken{ + { + Id: utils.Ptr(uuid.NewString()), + Permissions: utils.Ptr([]string{ + "read", + "write", + }), + DisplayName: utils.Ptr("Token"), + AccessToken: utils.Ptr("Secret access token"), + Creator: utils.Ptr(uuid.NewString()), + Expires: utils.Ptr(false), + Status: utils.Ptr(logs.ACCESSTOKENSTATUS_ACTIVE), + }, + }, + }, + wantErr: false, + }, + { + name: "set empty access token", + args: args{ + accessTokens: []logs.AccessToken{ + {}, + }, + }, + wantErr: false, + }, + { + name: "empty", + args: args{}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.accessTokens, tt.args.projectLabel); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/logs/access_token/update/update.go b/internal/cmd/logs/access_token/update/update.go new file mode 100644 index 000000000..85952136a --- /dev/null +++ b/internal/cmd/logs/access_token/update/update.go @@ -0,0 +1,144 @@ +package update + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + logUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +const ( + instanceIdFlag = "instance-id" + displayNameFlag = "display-name" + descriptionFlag = "description" + accessTokenIdArg = "ACCESS_TOKEN_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + InstanceId string + AccessTokenId string + Description *string + DisplayName *string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", accessTokenIdArg), + Short: "Updates a Logs access token", + Long: "Updates a access token.", + Args: args.SingleArg(accessTokenIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update access token with ID "xxx" with new name "access-token-1"`, + `$ stackit logs access-token update xxx --instance-id yyy --display-name access-token-1`, + ), + examples.NewExample( + `Update access token with ID "xxx" with new description "Access token for Service XY"`, + `$ stackit logs access-token update xxx --instance-id yyy --description "Access token for Service XY"`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Get the display name for confirmation + instanceLabel, err := logUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get Logs instance: %v", err) + } + if instanceLabel == "" { + instanceLabel = model.InstanceId + } + + // Get the display name for confirmation + accessTokenLabel, err := logUtils.GetAccessTokenName(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId, model.AccessTokenId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get access token: %v", err) + } + if accessTokenLabel == "" { + accessTokenLabel = model.AccessTokenId + } + + prompt := fmt.Sprintf("Are you sure you want to update access token %q for instance %q?", accessTokenLabel, instanceLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("update access token: %w", err) + } + + params.Printer.Outputf("Updated access token %q\n", accessTokenLabel) + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), instanceIdFlag, "ID of the Logs instance") + cmd.Flags().String(displayNameFlag, "", "Display name for the access token") + cmd.Flags().String(descriptionFlag, "", "Description of the access token") + + err := flags.MarkFlagsRequired(cmd, instanceIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + accessTokenId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + AccessTokenId: accessTokenId, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + InstanceId: flags.FlagToStringValue(p, cmd, instanceIdFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *logs.APIClient) logs.ApiUpdateAccessTokenRequest { + req := apiClient.UpdateAccessToken(ctx, model.ProjectId, model.Region, model.InstanceId, model.AccessTokenId) + + payload := logs.UpdateAccessTokenPayload{ + DisplayName: model.DisplayName, + Description: model.Description, + } + + return req.UpdateAccessTokenPayload(payload) +} diff --git a/internal/cmd/logs/access_token/update/update_test.go b/internal/cmd/logs/access_token/update/update_test.go new file mode 100644 index 000000000..fa458e5fc --- /dev/null +++ b/internal/cmd/logs/access_token/update/update_test.go @@ -0,0 +1,277 @@ +package update + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" +) + +const ( + testRegion = "eu01" + + testDisplayName = "display-name" + testDescription = "description" +) + +type testCtxKey struct{} + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &logs.APIClient{} + + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() + testAccessTokenId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testAccessTokenId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + instanceIdFlag: testInstanceId, + displayNameFlag: testDisplayName, + descriptionFlag: testDescription, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + + InstanceId: testInstanceId, + AccessTokenId: testAccessTokenId, + DisplayName: utils.Ptr(testDisplayName), + Description: utils.Ptr(testDescription), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *logs.ApiUpdateAccessTokenRequest)) logs.ApiUpdateAccessTokenRequest { + request := testClient.UpdateAccessToken(testCtx, testProjectId, testRegion, testInstanceId, testAccessTokenId) + request = request.UpdateAccessTokenPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *logs.UpdateAccessTokenPayload)) logs.UpdateAccessTokenPayload { + payload := logs.UpdateAccessTokenPayload{ + DisplayName: utils.Ptr(testDisplayName), + Description: utils.Ptr(testDescription), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "required only", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, displayNameFlag) + delete(flagValues, descriptionFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.DisplayName = nil + model.Description = nil + }), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "instance id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, instanceIdFlag) + }), + isValid: false, + }, + { + description: "instance id invalid 1", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "" + }), + isValid: false, + }, + { + description: "instance id invalid 2", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[instanceIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "access token id invalid 1", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "access token id invalid 2", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + p := print.NewPrinter() + cmd := NewCmd(&types.CmdParams{Printer: p}) + err := globalflags.Configure(cmd.Flags()) + if err != nil { + t.Fatalf("configure global flags: %v", err) + } + + for flag, value := range tt.flagValues { + err := cmd.Flags().Set(flag, value) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("setting flag --%s=%s: %v", flag, value, err) + } + } + + err = cmd.ValidateRequiredFlags() + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating flags: %v", err) + } + + err = cmd.ValidateArgs(tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error validating args: %v", err) + } + + model, err := parseInput(p, cmd, tt.argValues) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("error parsing flags: %v", err) + } + + if !tt.isValid { + t.Fatalf("did not fail on invalid input") + } + diff := cmp.Diff(model, tt.expectedModel) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest logs.ApiUpdateAccessTokenRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/logs/logs.go b/internal/cmd/logs/logs.go index c6afc6a5f..e72cc5830 100644 --- a/internal/cmd/logs/logs.go +++ b/internal/cmd/logs/logs.go @@ -1,6 +1,7 @@ package logs import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/logs/access_token" "github.com/stackitcloud/stackit-cli/internal/cmd/logs/instance" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" @@ -23,4 +24,5 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(instance.NewCmd(params)) + cmd.AddCommand(access_token.NewCmd(params)) } diff --git a/internal/pkg/services/logs/utils/utils.go b/internal/pkg/services/logs/utils/utils.go index 4008db158..d67272254 100644 --- a/internal/pkg/services/logs/utils/utils.go +++ b/internal/pkg/services/logs/utils/utils.go @@ -15,6 +15,7 @@ var ( type LogsClient interface { GetLogsInstanceExecute(ctx context.Context, projectId, regionId, instanceId string) (*logs.LogsInstance, error) + GetAccessTokenExecute(ctx context.Context, projectId string, regionId string, instanceId string, tId string) (*logs.AccessToken, error) } func GetInstanceName(ctx context.Context, apiClient LogsClient, projectId, regionId, instanceId string) (string, error) { @@ -28,3 +29,15 @@ func GetInstanceName(ctx context.Context, apiClient LogsClient, projectId, regio } return *resp.DisplayName, nil } + +func GetAccessTokenName(ctx context.Context, apiClient LogsClient, projectId, regionId, instanceId, accessTokenId string) (string, error) { + resp, err := apiClient.GetAccessTokenExecute(ctx, projectId, regionId, instanceId, accessTokenId) + if err != nil { + return "", fmt.Errorf("get Logs access token: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.DisplayName == nil { + return "", ErrNameNil + } + return *resp.DisplayName, nil +} diff --git a/internal/pkg/services/logs/utils/utils_test.go b/internal/pkg/services/logs/utils/utils_test.go index 0c21b4d09..78839fb10 100644 --- a/internal/pkg/services/logs/utils/utils_test.go +++ b/internal/pkg/services/logs/utils/utils_test.go @@ -12,8 +12,9 @@ import ( ) var ( - testProjectId = uuid.NewString() - testInstanceId = uuid.NewString() + testProjectId = uuid.NewString() + testInstanceId = uuid.NewString() + testAccessTokenId = uuid.NewString() ) const ( @@ -22,8 +23,10 @@ const ( ) type logsClientMocked struct { - getInstanceFails bool - getInstanceResp *logs.LogsInstance + getInstanceFails bool + getInstanceResp *logs.LogsInstance + getAccessTokenFails bool + getAccessTokenResp *logs.AccessToken } func (m *logsClientMocked) GetLogsInstanceExecute(_ context.Context, _, _, _ string) (*logs.LogsInstance, error) { @@ -33,6 +36,13 @@ func (m *logsClientMocked) GetLogsInstanceExecute(_ context.Context, _, _, _ str return m.getInstanceResp, nil } +func (m *logsClientMocked) GetAccessTokenExecute(_ context.Context, _, _, _, _ string) (*logs.AccessToken, error) { + if m.getAccessTokenFails { + return nil, fmt.Errorf("could not get access token") + } + return m.getAccessTokenResp, nil +} + func TestGetInstanceName(t *testing.T) { tests := []struct { description string @@ -94,3 +104,65 @@ func TestGetInstanceName(t *testing.T) { }) } } + +func TestGetAccessTokenName(t *testing.T) { + tests := []struct { + description string + getAccessTokenFails bool + getAccessTokenResp *logs.AccessToken + isValid bool + expectedOutput string + }{ + { + description: "base", + getAccessTokenResp: &logs.AccessToken{ + DisplayName: utils.Ptr(testInstanceName), + }, + isValid: true, + expectedOutput: testInstanceName, + }, + { + description: "get instance fails", + getAccessTokenFails: true, + isValid: false, + }, + { + description: "response is nil", + getAccessTokenFails: false, + getAccessTokenResp: nil, + isValid: false, + }, + { + description: "name in response is nil", + getAccessTokenFails: false, + getAccessTokenResp: &logs.AccessToken{ + DisplayName: nil, + }, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + client := &logsClientMocked{ + getAccessTokenFails: tt.getAccessTokenFails, + getAccessTokenResp: tt.getAccessTokenResp, + } + + output, err := GetAccessTokenName(context.Background(), client, testProjectId, testRegion, testInstanceId, testAccessTokenId) + + if tt.isValid && err != nil { + t.Errorf("failed on valid input") + } + if !tt.isValid && err == nil { + t.Errorf("did not fail on invalid input") + } + if !tt.isValid { + return + } + if output != tt.expectedOutput { + t.Errorf("expected output to be %s, got %s", tt.expectedOutput, output) + } + }) + } +} From 562e9e4bbe6feebca4899e36a9296a0b376c2266 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 15:51:32 +0000 Subject: [PATCH 358/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/cdn (#1288) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 72629a50a..e04900652 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.21.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 - github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 + github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 diff --git a/go.sum b/go.sum index 6ffb19a44..230c982dc 100644 --- a/go.sum +++ b/go.sum @@ -606,8 +606,8 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 h1:X82TZfc6lg8ZoYdcki github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 h1:JMKEeNQpA+Mb1DRpY3MRQL3pko5JjUWGrevN0xOrx+4= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= -github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1 h1:PiNC8VmLqi1WUnBSPefjDXThD43Fvb87p+Y6H8onGA0= -github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.1/go.mod h1:Nnfe/Zv4Z8F56Ljw/MfXjL0/2Ajia4bGuL/CZuvIXk8= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4 h1:6xBogGvhlw/F74g2aK1iSRoOUdiP37pjRK9DTgNZF3o= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4/go.mod h1:vvWMnaLTsgAj9bTUwrCkC9NN+U4NCXMCOAkU8ExlReE= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6/go.mod h1:IX9iL3MigDZUmzwswTJMfYvyi118KAHrFMfjJUy5NYk= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 h1:TxChb2qbO82JiQEBYClSSD5HZxqKeKJ6dIvkEUCJmbs= From d8901aafd3838c7e95e52732cb8c3d8be366cf04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:17:43 +0100 Subject: [PATCH 359/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/resourcemanager (#1287) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e04900652..80920bc6a 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 - github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 + github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.5 github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 diff --git a/go.sum b/go.sum index 230c982dc..5f718dffe 100644 --- a/go.sum +++ b/go.sum @@ -642,8 +642,8 @@ github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 h1:+TFfl1ON/uM5 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6/go.mod h1:hnhvlLX1Y71R8KIQqLBeoSZqkU5ZJOG0J4wz0LeUdaw= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2 h1:VDIXOvRNmSYMeF0qQ2+w4/ez04YutVDz73hSMuuOJ54= -github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.2/go.mod h1:9zyEzPL4DnmU/SHq+SuMWTSO5BPxM1Z4g8Fp28n00ds= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.5 h1:MZ5aTO2NQ1Jecmi67ByGskve5nKXHl91fE+z+vFjxt4= +github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.5/go.mod h1:CJLmdqWvJm5/3+lXPDKu8k4WXs2UG8euGoqQX5xE79k= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 h1:AiGNJmpQ/f9cglaIQQ4SyePbtCI3K1DQLNvqVN9jKSo= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3/go.mod h1:U/q0V89fvCF2O1ZJfi68/Chie9YY/5s7xBHI1Klq7wA= github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 h1:3hZSg3z+4AXa5LbR2Vl38VmSA83ABItE63E53LuyWv8= From cf601feec9e653c8aafdce6a27aef732d2df0e05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:18:05 +0100 Subject: [PATCH 360/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/iaas (#1286) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 80920bc6a..e4611d48d 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 - github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 + github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5 github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 diff --git a/go.sum b/go.sum index 5f718dffe..f9d7bf18f 100644 --- a/go.sum +++ b/go.sum @@ -614,8 +614,8 @@ github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 h1:TxChb2qbO82JiQEBY github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3/go.mod h1:KVWvQHb7CQLD9DzA4Np3WmakiCCsrHaCXvFEnOQ7nPk= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 h1:VIjkSofZz9utOOkBdNZCIb07P/JdKc1kHV1P8Rq9dLc= github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3/go.mod h1:EJk1Ss9GTel2NPIu/w3+x9XcQcEd2k3ibea5aQDzVhQ= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5yZYjrBAAKrCx87Trmt0kh8JiARA= -github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5 h1:W57+XRa8wTLsi5CV9Tqa7mGgt/PvlRM//RurXSmvII8= +github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5/go.mod h1:lTWjW57eAq1bwfM6nsNinhoBr3MHFW/GaFasdAsYfDM= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 h1:cbXM7jUBCL7A5zxJKFWolRIDl45sdJMMMAzeumeIEOA= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4/go.mod h1:z+7KKZf0uHXU/Kb4CRs/oaBrXRJ01LpiD0OH11MXLOk= github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1R+fL5aX5nEoxL6ODVJl3emzho= From 5e61c3335bfbdd00b0510290b2bd203c5db54391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 12 Feb 2026 18:25:10 +0100 Subject: [PATCH 361/422] fix(release): don't put license in root directory on apt installation (#1285) relates to STACKITCLI-324 and #1265 --- .goreleaser.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 2ef5c2ad1..7fb43c81d 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -105,7 +105,9 @@ nfpms: license: Apache 2.0 contents: - src: LICENSE.md - dst: LICENSE.md + dst: /usr/share/doc/stackit/copyright + file_info: + mode: 0644 formats: - deb - rpm From 19b9b6de40e2fcf1d471e70499ac77723a993a74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 07:56:04 +0000 Subject: [PATCH 362/422] chore(deps): bump github.com/lmittmann/tint from 1.1.2 to 1.1.3 (#1280) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e4611d48d..fd45ede85 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/google/uuid v1.6.0 github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf github.com/jedib0t/go-pretty/v6 v6.7.8 - github.com/lmittmann/tint v1.1.2 + github.com/lmittmann/tint v1.1.3 github.com/mattn/go-colorable v0.1.14 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 diff --git a/go.sum b/go.sum index f9d7bf18f..bb4001e95 100644 --- a/go.sum +++ b/go.sum @@ -433,8 +433,8 @@ github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lmittmann/tint v1.1.2 h1:2CQzrL6rslrsyjqLDwD11bZ5OpLBPU+g3G/r5LSfS8w= -github.com/lmittmann/tint v1.1.2/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= +github.com/lmittmann/tint v1.1.3 h1:Hv4EaHWXQr+GTFnOU4VKf8UvAtZgn0VuKT+G0wFlO3I= +github.com/lmittmann/tint v1.1.3/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= From 1f42e3ade7f4c796bb5a0742c3dc3eded10b0142 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 14:47:19 +0100 Subject: [PATCH 363/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/kms (#1292) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fd45ede85..49e4c50ec 100644 --- a/go.mod +++ b/go.mod @@ -265,7 +265,7 @@ require ( github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect - github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 + github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2 github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 diff --git a/go.sum b/go.sum index bb4001e95..1f7edfd24 100644 --- a/go.sum +++ b/go.sum @@ -618,8 +618,8 @@ github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5 h1:W57+XRa8wTLsi5CV9 github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.5/go.mod h1:lTWjW57eAq1bwfM6nsNinhoBr3MHFW/GaFasdAsYfDM= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 h1:cbXM7jUBCL7A5zxJKFWolRIDl45sdJMMMAzeumeIEOA= github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4/go.mod h1:z+7KKZf0uHXU/Kb4CRs/oaBrXRJ01LpiD0OH11MXLOk= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0 h1:Ar2n9GKmrTN80G/Ta1R+fL5aX5nEoxL6ODVJl3emzho= -github.com/stackitcloud/stackit-sdk-go/services/kms v1.2.0/go.mod h1:sHMFoYvVrkRZcH13DkLvp48nW+ssRVVVuwqJHDGpa5M= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2 h1:2ulSL2IkIAKND59eAjbEhVkOoBMyvm48ojwz1a3t0U0= +github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2/go.mod h1:cuIaMMiHeHQsbvy7BOFMutoV3QtN+ZBx7Tg3GmYUw7s= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 h1:d/qIj+XNaqByVbLvwpWoA0Ekv0yrONWyNswg4/jGX7Y= github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3/go.mod h1:ClPE4TOM1FeaJiwTXvApq4gWaSgTLq6nU3PPHAIQDN4= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7XpsAzTn0W+C/oP5flnLVgIh5u3O/P0o= From cc82694463a501b211ad25b423d68aa32cf8aafd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 13:53:50 +0000 Subject: [PATCH 364/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/redis (#1290) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 49e4c50ec..a73e056b3 100644 --- a/go.mod +++ b/go.mod @@ -272,7 +272,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 - github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 + github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.40.0 // indirect diff --git a/go.sum b/go.sum index 1f7edfd24..9e9a9a038 100644 --- a/go.sum +++ b/go.sum @@ -640,8 +640,8 @@ github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQ github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5/go.mod h1:xmAWk9eom8wznvLuLfm0F4xyeiBX8LaggXsKFmos+dw= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 h1:+TFfl1ON/uM5aO0FdkBNYKBa7vx0zrCYVtX6zvqQYBA= github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6/go.mod h1:hnhvlLX1Y71R8KIQqLBeoSZqkU5ZJOG0J4wz0LeUdaw= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3 h1:AcJSIEu1QCzRughJLzVjRP5ICop0DkvV2TgFb9LS7/c= -github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.3/go.mod h1:DLXqpz1WhmOergfOLMJ4pybozz33ysOZNIO7fv9Wtfc= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 h1:CXM9cZ9WeTyJd+Aw/hnJnDsKRVAQi4qgtd0RJ3zoPwo= +github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6/go.mod h1:KJNceOHRefjku1oVBoHG7idCS/SeW42WJ+55bN3AxrQ= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.5 h1:MZ5aTO2NQ1Jecmi67ByGskve5nKXHl91fE+z+vFjxt4= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.5/go.mod h1:CJLmdqWvJm5/3+lXPDKu8k4WXs2UG8euGoqQX5xE79k= github.com/stackitcloud/stackit-sdk-go/services/runcommand v1.4.3 h1:AiGNJmpQ/f9cglaIQQ4SyePbtCI3K1DQLNvqVN9jKSo= From 1ee25e2d1608c3e672e7c5586953a4997675dfad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kce=20G=C3=B6k=20Klingel?= <161626272+GokceGK@users.noreply.github.com> Date: Mon, 16 Feb 2026 12:59:46 +0100 Subject: [PATCH 365/422] update read me (#1294) --- README.md | 52 +++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 8c66fa532..579b9a4d1 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/stackitcloud/stackit-cli)](https://goreportcard.com/report/github.com/stackitcloud/stackit-cli) ![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/stackitcloud/stackit-cli) [![GitHub License](https://img.shields.io/github/license/stackitcloud/stackit-cli)](https://www.apache.org/licenses/LICENSE-2.0) -Welcome to the STACKIT CLI, a command-line interface for [STACKIT - The German business cloud](https://www.stackit.de/en). +Welcome to the STACKIT CLI, a command-line interface for [STACKIT - The sovereign cloud for Europe](https://www.stackit.de/en). The STACKIT CLI allows you to manage your STACKIT services and resources as well as perform operations using the command-line or in scripts or automation, such as: @@ -68,28 +68,34 @@ Help is available for any command by specifying the special flag `--help` (or si Below you can find a list of the STACKIT services already available in the CLI (along with their respective command names) and the ones that are currently planned to be integrated. -| Service | CLI Commands | Status | -| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | -| Authorization | `project`, `organization` | :white_check_mark: | -| DNS | `dns` | :white_check_mark: | -| Infrastructure as a Service (IaaS) | `image`
`key-pair`
`network`
`network-area`
`network-interface`
`public-ip`
`quota`
`security-group`
`server`
`volume` | :white_check_mark:| -| Kubernetes Engine (SKE) | `ske` | :white_check_mark: | -| Load Balancer | `load-balancer` | :white_check_mark: | -| LogMe | `logme` | :white_check_mark: | -| MariaDB | `mariadb` | :white_check_mark: | -| MongoDB Flex | `mongodbflex` | :white_check_mark: | -| Observability | `observability` | :white_check_mark: | -| Object Storage | `object-storage` | :white_check_mark: | -| OpenSearch | `opensearch` | :white_check_mark: | -| PostgreSQL Flex | `postgresflex` | :white_check_mark: | -| RabbitMQ | `rabbitmq` | :white_check_mark: | -| Redis | `redis` | :white_check_mark: | -| Resource Manager | `project` | :white_check_mark: | -| Secrets Manager | `secrets-manager` | :white_check_mark: | -| Server Backup Management | `server backup` | :white_check_mark: | -| Server Command (Run Command) | `server command` | :white_check_mark: | -| Service Account | `service-account` | :white_check_mark: | -| SQLServer Flex | `beta sqlserverflex` | :white_check_mark: (beta) | +| Service | CLI Commands | Status | +|------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------| +| Application Load Balancer | `beta alb` | :white_check_mark: (beta) | +| Authorization | `project`, `organization` | :white_check_mark: | +| DNS | `dns` | :white_check_mark: | +| Edge Cloud | `beta edge-cloud` | :white_check_mark: (beta) | +| Git | `git` | :white_check_mark: | +| Infrastructure as a Service (IaaS) | `affinity-group`
`image`
`key-pair`
`network`
`network-area`
`network-interface`
`public-ip`
`quota`
`security-group`
`server`
`volume` | :white_check_mark: | +| Intake | `beta intake` | :white_check_mark: (beta) | +| Key Management Service (KMS) | `beta kms` | :white_check_mark: (beta) | +| Kubernetes Engine (SKE) | `ske` | :white_check_mark: | +| Load Balancer | `load-balancer` | :white_check_mark: | +| LogMe | `logme` | :white_check_mark: | +| MariaDB | `mariadb` | :white_check_mark: | +| MongoDB Flex | `mongodbflex` | :white_check_mark: | +| Observability | `observability` | :white_check_mark: | +| Object Storage | `object-storage` | :white_check_mark: | +| OpenSearch | `opensearch` | :white_check_mark: | +| PostgreSQL Flex | `postgresflex` | :white_check_mark: | +| RabbitMQ | `rabbitmq` | :white_check_mark: | +| Redis | `redis` | :white_check_mark: | +| Resource Manager | `project` | :white_check_mark: | +| Secrets Manager | `secrets-manager` | :white_check_mark: | +| Server Backup Management | `server backup` | :white_check_mark: | +| Server Command (Run Command) | `server command` | :white_check_mark: | +| Service Account | `service-account` | :white_check_mark: | +| SQLServer Flex | `beta sqlserverflex` | :white_check_mark: (beta) | +| File Storage (SFS) | `beta sfs` | :white_check_mark: (beta) | ## Authentication From e3c2af839020bd9684b94759622f7a4a9fc270e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 10:08:15 +0100 Subject: [PATCH 366/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1296) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a73e056b3..d9c98c281 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.32.0 diff --git a/go.sum b/go.sum index 9e9a9a038..afe28f5c2 100644 --- a/go.sum +++ b/go.sum @@ -658,8 +658,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 h1:M2PY github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7/go.mod h1:jitkQuP2K/SH63Qor0C4pcqz1GDCy/lK2H4t8/VDse4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3 h1:c+nQMvSml08cdRF1kE24vCw0r/l56olP/svQyhcnKOs= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.6.3/go.mod h1:1Jr+ImrmPERxbYnlTy6O2aSZYNnREf2qQyysv6YC1RY= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 h1:l1QjxW7sdE/6B6BZtHxbmus8XJdI9KDuXX3fwUa5fog= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0/go.mod h1:1Jr+ImrmPERxbYnlTy6O2aSZYNnREf2qQyysv6YC1RY= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 h1:AQrcr+qeIuZob+3TT2q1L4WOPtpsu5SEpkTnOUHDqfE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3/go.mod h1:8BBGC69WFXWWmKgzSjgE4HvsI7pEgO0RN2cASwuPJ18= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= From 2cdb9d0b62581fbfa73fa3b16181b9a858ad953e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 09:14:51 +0000 Subject: [PATCH 367/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/rabbitmq (#1297) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d9c98c281..c4a9cdfd9 100644 --- a/go.mod +++ b/go.mod @@ -271,7 +271,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 - github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 + github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 github.com/subosito/gotenv v1.6.0 // indirect diff --git a/go.sum b/go.sum index afe28f5c2..f4447a8d2 100644 --- a/go.sum +++ b/go.sum @@ -638,8 +638,8 @@ github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177 github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQx954yI8fuQmxXwRf/myqAdLg2KvxImp00g= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5/go.mod h1:xmAWk9eom8wznvLuLfm0F4xyeiBX8LaggXsKFmos+dw= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6 h1:+TFfl1ON/uM5aO0FdkBNYKBa7vx0zrCYVtX6zvqQYBA= -github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.25.6/go.mod h1:hnhvlLX1Y71R8KIQqLBeoSZqkU5ZJOG0J4wz0LeUdaw= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 h1:/8lmviszgrB+0Cz7HdhFELyTiTeqIs7LfnI6sNX4rW8= +github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0/go.mod h1:hnhvlLX1Y71R8KIQqLBeoSZqkU5ZJOG0J4wz0LeUdaw= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 h1:CXM9cZ9WeTyJd+Aw/hnJnDsKRVAQi4qgtd0RJ3zoPwo= github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6/go.mod h1:KJNceOHRefjku1oVBoHG7idCS/SeW42WJ+55bN3AxrQ= github.com/stackitcloud/stackit-sdk-go/services/resourcemanager v0.18.5 h1:MZ5aTO2NQ1Jecmi67ByGskve5nKXHl91fE+z+vFjxt4= From 7760d482ef11739b314a3580f7bb1e1a64c36da2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 11:13:00 +0100 Subject: [PATCH 368/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/authorization (#1295) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c4a9cdfd9..757565dd1 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.21.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 - github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 + github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 diff --git a/go.sum b/go.sum index f4447a8d2..9f52cfb00 100644 --- a/go.sum +++ b/go.sum @@ -604,8 +604,8 @@ github.com/stackitcloud/stackit-sdk-go/core v0.21.1 h1:Y/PcAgM7DPYMNqum0MLv4n1mF github.com/stackitcloud/stackit-sdk-go/core v0.21.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 h1:X82TZfc6lg8ZoYdckiv5+OsV0d+81Q2TFMJh1TfxGWk= github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3 h1:JMKEeNQpA+Mb1DRpY3MRQL3pko5JjUWGrevN0xOrx+4= -github.com/stackitcloud/stackit-sdk-go/services/authorization v0.11.3/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 h1:HxPgBu04j5tj6nfZ2r0l6v4VXC0/tYOGe4sA5Addra8= +github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4 h1:6xBogGvhlw/F74g2aK1iSRoOUdiP37pjRK9DTgNZF3o= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4/go.mod h1:vvWMnaLTsgAj9bTUwrCkC9NN+U4NCXMCOAkU8ExlReE= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew= From 28d5984002af0a1a43a51aabb484f3376743e093 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 10:20:02 +0000 Subject: [PATCH 369/422] chore(deps): bump golang.org/x/oauth2 from 0.34.0 to 0.35.0 (#1291) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 757565dd1..9e8e23867 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.32.0 - golang.org/x/oauth2 v0.34.0 + golang.org/x/oauth2 v0.35.0 golang.org/x/term v0.39.0 golang.org/x/text v0.33.0 k8s.io/apimachinery v0.34.2 diff --git a/go.sum b/go.sum index 9f52cfb00..7696642ed 100644 --- a/go.sum +++ b/go.sum @@ -848,8 +848,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= -golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= +golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From d2e78455e762b7e316153bb5559776ecbfc600b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Feb 2026 13:49:19 +0100 Subject: [PATCH 370/422] chore(deps): bump k8s.io/apimachinery from 0.34.2 to 0.35.1 (#1281) Bumps [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) from 0.34.2 to 0.35.1. - [Commits](https://github.com/kubernetes/apimachinery/compare/v0.34.2...v0.35.1) --- updated-dependencies: - dependency-name: k8s.io/apimachinery dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 11 ++++++----- go.sum | 25 ++++++++++++------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 9e8e23867..38888e6c8 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/stackitcloud/stackit-cli -go 1.24.0 +go 1.25.0 require ( github.com/fatih/color v1.18.0 @@ -42,7 +42,7 @@ require ( golang.org/x/oauth2 v0.35.0 golang.org/x/term v0.39.0 golang.org/x/text v0.33.0 - k8s.io/apimachinery v0.34.2 + k8s.io/apimachinery v0.35.1 k8s.io/client-go v0.34.2 ) @@ -231,7 +231,7 @@ require ( go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.27.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp/typeparams v0.0.0-20251023183803-a4bb9ffd2546 // indirect golang.org/x/sync v0.19.0 // indirect @@ -239,6 +239,7 @@ require ( golang.org/x/tools v0.41.0 // indirect google.golang.org/protobuf v1.36.8 // indirect honnef.co/go/tools v0.6.1 // indirect + k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect mvdan.cc/gofumpt v0.9.2 // indirect mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect sigs.k8s.io/randfill v1.0.0 // indirect @@ -279,8 +280,8 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index 7696642ed..16736659c 100644 --- a/go.sum +++ b/go.sum @@ -504,7 +504,6 @@ github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0 github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -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= @@ -744,8 +743,8 @@ go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1092,8 +1091,8 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -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.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1116,16 +1115,16 @@ honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY= k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw= -k8s.io/apimachinery v0.34.2 h1:zQ12Uk3eMHPxrsbUJgNF8bTauTVR2WgqJsTmwTE/NW4= -k8s.io/apimachinery v0.34.2/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU= +k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M= k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE= 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= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= +k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= mvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4= mvdan.cc/gofumpt v0.9.2/go.mod h1:iB7Hn+ai8lPvofHd9ZFGVg2GOr8sBUw1QUWjNbmIL/s= mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI= @@ -1133,8 +1132,8 @@ mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6y rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -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/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= From e64d9e3b584ba37f4bf809714b142e125a37c2a1 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 17 Feb 2026 16:12:09 +0100 Subject: [PATCH 371/422] chore: disable temporary snapcraft release (#1302) follow-up ticket STACKITCLI-330 --- .goreleaser.yaml | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 7fb43c81d..4e1d779d2 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -137,24 +137,25 @@ homebrew_casks: bash: ./completions/stackit.bash fish: ./completions/stackit.fish -snapcrafts: - # IDs of the builds for which to create packages for - - ids: - - linux-builds - # The name of the snap - name: stackit - # The canonical title of the application, displayed in the software - # centre graphical frontends - title: STACKIT CLI - summary: A command-line interface to manage STACKIT resources. - description: "A command-line interface to manage STACKIT resources." - license: Apache-2.0 - confinement: classic - # Grade "devel" will only release to `edge` and `beta` channels - # Grade "stable" will also release to the `candidate` and `stable` channels - grade: stable - # Whether to publish the Snap to the store - publish: true +# Temporary disable snap release, see https://jira.schwarz/browse/STACKITCLI-330 +# snapcrafts: +# # IDs of the builds for which to create packages for +# - ids: +# - linux-builds +# # The name of the snap +# name: stackit +# # The canonical title of the application, displayed in the software +# # centre graphical frontends +# title: STACKIT CLI +# summary: A command-line interface to manage STACKIT resources. +# description: "A command-line interface to manage STACKIT resources." +# license: Apache-2.0 +# confinement: classic +# # Grade "devel" will only release to `edge` and `beta` channels +# # Grade "stable" will also release to the `candidate` and `stable` channels +# grade: stable +# # Whether to publish the Snap to the store +# publish: true winget: - name: stackit From 7614ee8b4edd71edc322052e94a187d4a3574810 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 06:29:05 +0000 Subject: [PATCH 372/422] chore(deps): bump golang.org/x/mod from 0.32.0 to 0.33.0 (#1298) Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.32.0 to 0.33.0. - [Commits](https://github.com/golang/mod/compare/v0.32.0...v0.33.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 38888e6c8..3e610ce78 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 - golang.org/x/mod v0.32.0 + golang.org/x/mod v0.33.0 golang.org/x/oauth2 v0.35.0 golang.org/x/term v0.39.0 golang.org/x/text v0.33.0 diff --git a/go.sum b/go.sum index 16736659c..58990a21f 100644 --- a/go.sum +++ b/go.sum @@ -799,8 +799,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= -golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= +golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8= +golang.org/x/mod v0.33.0/go.mod h1:swjeQEj+6r7fODbD2cqrnje9PnziFuw4bmLbBZFrQ5w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= From 5d5375bd8a5b0dc7a0597e93f5df738efe2bd4f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 06:36:19 +0000 Subject: [PATCH 373/422] chore(deps): bump golang.org/x/text from 0.33.0 to 0.34.0 (#1299) Bumps [golang.org/x/text](https://github.com/golang/text) from 0.33.0 to 0.34.0. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.33.0...v0.34.0) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-version: 0.34.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3e610ce78..3ba3b7488 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( golang.org/x/mod v0.33.0 golang.org/x/oauth2 v0.35.0 golang.org/x/term v0.39.0 - golang.org/x/text v0.33.0 + golang.org/x/text v0.34.0 k8s.io/apimachinery v0.35.1 k8s.io/client-go v0.34.2 ) diff --git a/go.sum b/go.sum index 58990a21f..de83bf51d 100644 --- a/go.sum +++ b/go.sum @@ -938,8 +938,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= -golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 13a5762d68f8be35bebc428fdd46807de14fef81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 07:58:12 +0100 Subject: [PATCH 374/422] chore(deps): bump golang.org/x/term from 0.39.0 to 0.40.0 (#1300) Bumps [golang.org/x/term](https://github.com/golang/term) from 0.39.0 to 0.40.0. - [Commits](https://github.com/golang/term/compare/v0.39.0...v0.40.0) --- updated-dependencies: - dependency-name: golang.org/x/term dependency-version: 0.40.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 3ba3b7488..c4dca77ef 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.33.0 golang.org/x/oauth2 v0.35.0 - golang.org/x/term v0.39.0 + golang.org/x/term v0.40.0 golang.org/x/text v0.34.0 k8s.io/apimachinery v0.35.1 k8s.io/client-go v0.34.2 @@ -276,7 +276,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 github.com/subosito/gotenv v1.6.0 // indirect - golang.org/x/sys v0.40.0 // indirect + golang.org/x/sys v0.41.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.34.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect diff --git a/go.sum b/go.sum index de83bf51d..a85ed5117 100644 --- a/go.sum +++ b/go.sum @@ -916,8 +916,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= -golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 h1:O1cMQHRfwNpDfDJerqRoE2oD+AFlyid87D40L/OkkJo= golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -926,8 +926,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= -golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg= +golang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 677aacb3e61e9b085969d884159ffd89e4b242ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 07:04:46 +0000 Subject: [PATCH 375/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/cdn (#1301) Bumps [github.com/stackitcloud/stackit-sdk-go/services/cdn](https://github.com/stackitcloud/stackit-sdk-go) from 1.9.4 to 1.10.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/cdn/v1.9.4...services/cdn/v1.10.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/cdn dependency-version: 1.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c4dca77ef..5e9bbaeb7 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/core v0.21.1 github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 - github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4 + github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 github.com/stackitcloud/stackit-sdk-go/services/git v0.10.3 diff --git a/go.sum b/go.sum index a85ed5117..ec7d62c0c 100644 --- a/go.sum +++ b/go.sum @@ -605,8 +605,8 @@ github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 h1:X82TZfc6lg8ZoYdcki github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 h1:HxPgBu04j5tj6nfZ2r0l6v4VXC0/tYOGe4sA5Addra8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= -github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4 h1:6xBogGvhlw/F74g2aK1iSRoOUdiP37pjRK9DTgNZF3o= -github.com/stackitcloud/stackit-sdk-go/services/cdn v1.9.4/go.mod h1:vvWMnaLTsgAj9bTUwrCkC9NN+U4NCXMCOAkU8ExlReE= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0 h1:YALzjYAApyQMKyt4C2LKhPRZHa6brmbFeKuuwl+KOTs= +github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0/go.mod h1:915b/lJgDikYFEoRQ8wc8aCtPvUCceYk7gGm9nViJe0= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 h1:GBRb49x5Nax/oQQaaf2F3kKwv8DQQOL0TQOC0C/v/Ew= github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6/go.mod h1:IX9iL3MigDZUmzwswTJMfYvyi118KAHrFMfjJUy5NYk= github.com/stackitcloud/stackit-sdk-go/services/edge v0.4.3 h1:TxChb2qbO82JiQEBYClSSD5HZxqKeKJ6dIvkEUCJmbs= From 14d2145678433ede4595e49eaaa92cb5ffdf4538 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 14:20:34 +0100 Subject: [PATCH 376/422] chore(deps): bump k8s.io/client-go from 0.34.2 to 0.35.1 (#1303) Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.34.2 to 0.35.1. - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes/client-go/compare/v0.34.2...v0.35.1) --- updated-dependencies: - dependency-name: k8s.io/client-go dependency-version: 0.35.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 5 ++--- go.sum | 13 ++++--------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 5e9bbaeb7..323071e52 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( golang.org/x/term v0.40.0 golang.org/x/text v0.34.0 k8s.io/apimachinery v0.35.1 - k8s.io/client-go v0.34.2 + k8s.io/client-go v0.35.1 ) require ( @@ -253,7 +253,6 @@ require ( github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect @@ -278,7 +277,7 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.41.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.34.2 // indirect + k8s.io/api v0.35.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect diff --git a/go.sum b/go.sum index ec7d62c0c..12b27f754 100644 --- a/go.sum +++ b/go.sum @@ -250,8 +250,6 @@ github.com/godoc-lint/godoc-lint v0.11.1/go.mod h1:BAqayheFSuZrEAqCRxgw9MyvsM+S/ github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -397,7 +395,6 @@ github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0= github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.9.0 h1:9xt1zI9EBfcYBvdU1nVrzMzzUPUtPKs9bVSIM3TAb3M= github.com/kisielk/errcheck v1.9.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -983,12 +980,10 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -1113,12 +1108,12 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= -k8s.io/api v0.34.2 h1:fsSUNZhV+bnL6Aqrp6O7lMTy6o5x2C4XLjnh//8SLYY= -k8s.io/api v0.34.2/go.mod h1:MMBPaWlED2a8w4RSeanD76f7opUoypY8TFYkSM+3XHw= +k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q= +k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM= k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU= k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= -k8s.io/client-go v0.34.2 h1:Co6XiknN+uUZqiddlfAjT68184/37PS4QAzYvQvDR8M= -k8s.io/client-go v0.34.2/go.mod h1:2VYDl1XXJsdcAxw7BenFslRQX28Dxz91U9MWKjX97fE= +k8s.io/client-go v0.35.1 h1:+eSfZHwuo/I19PaSxqumjqZ9l5XiTEKbIaJ+j1wLcLM= +k8s.io/client-go v0.35.1/go.mod h1:1p1KxDt3a0ruRfc/pG4qT/3oHmUj1AhSHEcxNSGg+OA= 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-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= From 9d3e23f427d17fb26ccf0b2fbeeb4274f0b0cc34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 13:26:46 +0000 Subject: [PATCH 377/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/serviceaccount (#1304) Bumps [github.com/stackitcloud/stackit-sdk-go/services/serviceaccount](https://github.com/stackitcloud/stackit-sdk-go) from 0.11.6 to 0.12.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/serviceaccount/v0.11.6...core/v0.12.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/serviceaccount dependency-version: 0.12.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 323071e52..a99254f3e 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/secretsmanager v0.14.3 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 - github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 + github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 diff --git a/go.sum b/go.sum index 12b27f754..cb43a9686 100644 --- a/go.sum +++ b/go.sum @@ -648,8 +648,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8 h1:LLyANBzE8 github.com/stackitcloud/stackit-sdk-go/services/serverbackup v1.3.8/go.mod h1:/bmg57XZu+bGczzcoumrukiGMPGzI2mOyTT4BVIQUBs= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 h1:sQ3fdtUjgIL2Ul8nRYVVacHOwi5aSMTGGbYVL30oQBU= github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6/go.mod h1:3fjlL+9YtuI9Oocl1ZeYIK48ImtY4DwPggFhqAygr7o= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6 h1:WU76mZkJP6diMDjGFqM8On6fZhUDmGcy6ppX0+kWx9Y= -github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.11.6/go.mod h1:hRllU+yEJM6ovrLeXwVeT5hI70ftPKjX4z/Nj8TZqJw= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0 h1:l1EDIlXce2C8JcbBDHVa6nZ4SjPTqmnALTgrhms+NKI= +github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0/go.mod h1:EXq8/J7t9p8zPmdIq+atuxyAbnQwxrQT18fI+Qpv98k= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 h1:M2PYLF8k3zmAwYWSKfUiCTNTXr7ROGuJganVVEQA3YI= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7/go.mod h1:jitkQuP2K/SH63Qor0C4pcqz1GDCy/lK2H4t8/VDse4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= From 76070eabf4a5c375fc374d9575102800c0670b6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:11:27 +0100 Subject: [PATCH 378/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/alb (#1307) Bumps [github.com/stackitcloud/stackit-sdk-go/services/alb](https://github.com/stackitcloud/stackit-sdk-go) from 0.9.3 to 0.10.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/alb/v0.9.3...core/v0.10.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/alb dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a99254f3e..992c35326 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 github.com/stackitcloud/stackit-sdk-go/core v0.21.1 - github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 + github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0 github.com/stackitcloud/stackit-sdk-go/services/dns v0.17.6 diff --git a/go.sum b/go.sum index cb43a9686..67b4fca0e 100644 --- a/go.sum +++ b/go.sum @@ -598,8 +598,8 @@ github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YE github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stackitcloud/stackit-sdk-go/core v0.21.1 h1:Y/PcAgM7DPYMNqum0MLv4n1mF9ieuevzcCIZYQfm3Ts= github.com/stackitcloud/stackit-sdk-go/core v0.21.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3 h1:X82TZfc6lg8ZoYdckiv5+OsV0d+81Q2TFMJh1TfxGWk= -github.com/stackitcloud/stackit-sdk-go/services/alb v0.9.3/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0 h1:V9+885qkSv621rZZatg1YE5ENM1ElALxQDJsh+hDIUg= +github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 h1:HxPgBu04j5tj6nfZ2r0l6v4VXC0/tYOGe4sA5Addra8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0/go.mod h1:uYI9pHAA2g84jJN25ejFUxa0/JtfpPZqMDkctQ1BzJk= github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0 h1:YALzjYAApyQMKyt4C2LKhPRZHa6brmbFeKuuwl+KOTs= From 085e9f57662795db54d7d71d2bac0fa430deda17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:18:40 +0000 Subject: [PATCH 379/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/loadbalancer (#1308) Bumps [github.com/stackitcloud/stackit-sdk-go/services/loadbalancer](https://github.com/stackitcloud/stackit-sdk-go) from 1.7.3 to 1.8.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/loadbalancer/v1.7.3...services/cdn/v1.8.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/loadbalancer dependency-version: 1.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 992c35326..e11952658 100644 --- a/go.mod +++ b/go.mod @@ -266,7 +266,7 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2 - github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 + github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 diff --git a/go.sum b/go.sum index 67b4fca0e..1405af00f 100644 --- a/go.sum +++ b/go.sum @@ -616,8 +616,8 @@ github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4 h1:cbXM7jUBCL7A5zx github.com/stackitcloud/stackit-sdk-go/services/intake v0.4.4/go.mod h1:z+7KKZf0uHXU/Kb4CRs/oaBrXRJ01LpiD0OH11MXLOk= github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2 h1:2ulSL2IkIAKND59eAjbEhVkOoBMyvm48ojwz1a3t0U0= github.com/stackitcloud/stackit-sdk-go/services/kms v1.3.2/go.mod h1:cuIaMMiHeHQsbvy7BOFMutoV3QtN+ZBx7Tg3GmYUw7s= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3 h1:d/qIj+XNaqByVbLvwpWoA0Ekv0yrONWyNswg4/jGX7Y= -github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.7.3/go.mod h1:ClPE4TOM1FeaJiwTXvApq4gWaSgTLq6nU3PPHAIQDN4= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0 h1:DxrN85V738CRLynu6MULQHO+OXyYnkhVPgoZKULfFIs= +github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0/go.mod h1:ClPE4TOM1FeaJiwTXvApq4gWaSgTLq6nU3PPHAIQDN4= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 h1:4x30lC+YBmo7XpsAzTn0W+C/oP5flnLVgIh5u3O/P0o= github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6/go.mod h1:ewaYUiZcBTSS6urE5zEJBPCqxu70w2IjnBHCvnKdFKE= github.com/stackitcloud/stackit-sdk-go/services/logs v0.5.2 h1:vr4atxFRT+EL+DqONMT5R44f7AzEMbePa9U7PEE0THU= From c2c98cbf5ec55659d9af45b5e7109cb83d6f7fc7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:37:56 +0100 Subject: [PATCH 380/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/sfs (#1309) Bumps [github.com/stackitcloud/stackit-sdk-go/services/sfs](https://github.com/stackitcloud/stackit-sdk-go) from 0.3.0 to 0.4.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.3.0...core/v0.4.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/sfs dependency-version: 0.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e11952658..606141d22 100644 --- a/go.mod +++ b/go.mod @@ -273,7 +273,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 - github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 + github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0 github.com/subosito/gotenv v1.6.0 // indirect golang.org/x/sys v0.41.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 1405af00f..e5d523ee6 100644 --- a/go.sum +++ b/go.sum @@ -652,8 +652,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0 h1:l1EDIl github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0/go.mod h1:EXq8/J7t9p8zPmdIq+atuxyAbnQwxrQT18fI+Qpv98k= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 h1:M2PYLF8k3zmAwYWSKfUiCTNTXr7ROGuJganVVEQA3YI= github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7/go.mod h1:jitkQuP2K/SH63Qor0C4pcqz1GDCy/lK2H4t8/VDse4= -github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0 h1:4567q2dFp3Hw+5Kx+NLDKDcMWsRHMazTlh5aBrhlkXs= -github.com/stackitcloud/stackit-sdk-go/services/sfs v0.3.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= +github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0 h1:ofdGO2dGH6ywKbIVxaxRVal3jWX9WlcHSm5BTud5bC4= +github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 h1:l1QjxW7sdE/6B6BZtHxbmus8XJdI9KDuXX3fwUa5fog= github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0/go.mod h1:1Jr+ImrmPERxbYnlTy6O2aSZYNnREf2qQyysv6YC1RY= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 h1:AQrcr+qeIuZob+3TT2q1L4WOPtpsu5SEpkTnOUHDqfE= From ba82c0d9f34344f861fd17f62e199f4e0839ff39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:58:35 +0000 Subject: [PATCH 381/422] chore(deps): bump goreleaser/goreleaser-action from 6 to 7 (#1310) --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 67954c08f..7e022d958 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -50,7 +50,7 @@ jobs: uses: actions/checkout@v6 - name: Check GoReleaser - uses: goreleaser/goreleaser-action@v6 + uses: goreleaser/goreleaser-action@v7 with: args: check diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e9377a728..acb2c9bd8 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -74,7 +74,7 @@ jobs: uses: samuelmeuli/action-snapcraft@v3 - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v6 + uses: goreleaser/goreleaser-action@v7 with: args: release --clean env: From f9e97d0d23e0e3b86df00e69848d7b9ad9843d4a Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Tue, 24 Feb 2026 12:32:49 +0100 Subject: [PATCH 382/422] feat: Document scoop as installation option for Windows (#1311) Signed-off-by: Jorge Turrado --- INSTALLATION.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/INSTALLATION.md b/INSTALLATION.md index 14976fe69..69756bf2d 100644 --- a/INSTALLATION.md +++ b/INSTALLATION.md @@ -188,7 +188,22 @@ Alternatively, you can install via [Homebrew](https://brew.sh/) or refer to one ### Windows -> We are currently working on distributing the CLI on a package manager for Windows. For the moment, please refer to one of the installation methods below. +#### Scoop + +The STACKIT CLI can be installed through the [Scoop](https://scoop.sh/) package manager. + +1. Install Scoop (if not already installed): + +```powershell +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression +``` + +2. Install the CLI: + +```powershell +scoop install stackit +``` ## Manual installation From 2329310046bd334c0e6c8381c9c40eb0e3fcc465 Mon Sep 17 00:00:00 2001 From: Manuel Vaas <34416897+Manuelvaas@users.noreply.github.com> Date: Tue, 24 Feb 2026 17:49:20 +0100 Subject: [PATCH 383/422] feat(resourcemanager): List and describe organizations (#1312) relates to STACKITCLI-325 --- docs/stackit_organization.md | 2 + docs/stackit_organization_describe.md | 43 ++++ docs/stackit_organization_list.md | 44 ++++ .../cmd/organization/describe/describe.go | 119 +++++++++++ .../organization/describe/describe_test.go | 190 +++++++++++++++++ internal/cmd/organization/list/list.go | 145 +++++++++++++ internal/cmd/organization/list/list_test.go | 191 ++++++++++++++++++ internal/cmd/organization/organization.go | 4 + 8 files changed, 738 insertions(+) create mode 100644 docs/stackit_organization_describe.md create mode 100644 docs/stackit_organization_list.md create mode 100644 internal/cmd/organization/describe/describe.go create mode 100644 internal/cmd/organization/describe/describe_test.go create mode 100644 internal/cmd/organization/list/list.go create mode 100644 internal/cmd/organization/list/list_test.go diff --git a/docs/stackit_organization.md b/docs/stackit_organization.md index f1bbaedde..ad124b975 100644 --- a/docs/stackit_organization.md +++ b/docs/stackit_organization.md @@ -31,6 +31,8 @@ stackit organization [flags] ### SEE ALSO * [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit organization describe](./stackit_organization_describe.md) - Show an organization +* [stackit organization list](./stackit_organization_list.md) - Lists all organizations * [stackit organization member](./stackit_organization_member.md) - Manages organization members * [stackit organization role](./stackit_organization_role.md) - Manages organization roles diff --git a/docs/stackit_organization_describe.md b/docs/stackit_organization_describe.md new file mode 100644 index 000000000..795cf38e5 --- /dev/null +++ b/docs/stackit_organization_describe.md @@ -0,0 +1,43 @@ +## stackit organization describe + +Show an organization + +### Synopsis + +Show an organization. + +``` +stackit organization describe [flags] +``` + +### Examples + +``` + Describe the organization with the organization uuid "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + $ stackit organization describe xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + Describe the organization with the container id "foo-bar-organization" + $ stackit organization describe foo-bar-organization +``` + +### Options + +``` + -h, --help Help for "stackit organization describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit organization](./stackit_organization.md) - Manages organizations + diff --git a/docs/stackit_organization_list.md b/docs/stackit_organization_list.md new file mode 100644 index 000000000..a258807ba --- /dev/null +++ b/docs/stackit_organization_list.md @@ -0,0 +1,44 @@ +## stackit organization list + +Lists all organizations + +### Synopsis + +Lists all organizations. + +``` +stackit organization list [flags] +``` + +### Examples + +``` + Lists organizations for your user + $ stackit organization list + + Lists the first 10 organizations + $ stackit organization list --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit organization list" + --limit int Maximum number of entries to list (default 50) +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit organization](./stackit_organization.md) - Manages organizations + diff --git a/internal/cmd/organization/describe/describe.go b/internal/cmd/organization/describe/describe.go new file mode 100644 index 000000000..d17179c8e --- /dev/null +++ b/internal/cmd/organization/describe/describe.go @@ -0,0 +1,119 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" +) + +const ( + organizationIdArg = "ORGANIZATION_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "describe", + Short: "Show an organization", + Long: "Show an organization.", + // the arg can be the organization uuid or the container id, which is not a uuid, so no validation needed + Args: args.SingleArg(organizationIdArg, nil), + Example: examples.Build( + examples.NewExample( + `Describe the organization with the organization uuid "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"`, + "$ stackit organization describe xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + ), + examples.NewExample( + `Describe the organization with the container id "foo-bar-organization"`, + "$ stackit organization describe foo-bar-organization", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return err + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + organizationId := inputArgs[0] + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: globalFlags, + OrganizationId: organizationId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *resourcemanager.APIClient) resourcemanager.ApiGetOrganizationRequest { + req := apiClient.GetOrganization(ctx, model.OrganizationId) + return req +} + +func outputResult(p *print.Printer, outputFormat string, organization *resourcemanager.OrganizationResponse) error { + return p.OutputResult(outputFormat, organization, func() error { + if organization == nil { + p.Outputln("show organization: empty response") + return nil + } + + table := tables.NewTable() + + table.AddRow("ORGANIZATION ID", utils.PtrString(organization.OrganizationId)) + table.AddSeparator() + table.AddRow("NAME", utils.PtrString(organization.Name)) + table.AddSeparator() + table.AddRow("CONTAINER ID", utils.PtrString(organization.ContainerId)) + table.AddSeparator() + table.AddRow("STATUS", utils.PtrString(organization.LifecycleState)) + table.AddSeparator() + table.AddRow("CREATION TIME", utils.PtrString(organization.CreationTime)) + table.AddSeparator() + table.AddRow("UPDATE TIME", utils.PtrString(organization.UpdateTime)) + table.AddSeparator() + table.AddRow("LABELS", utils.JoinStringMap(utils.PtrValue(organization.Labels), ": ", ", ")) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/organization/describe/describe_test.go b/internal/cmd/organization/describe/describe_test.go new file mode 100644 index 000000000..00d1d2598 --- /dev/null +++ b/internal/cmd/organization/describe/describe_test.go @@ -0,0 +1,190 @@ +package describe + +import ( + "context" + "testing" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &resourcemanager.APIClient{} + +var ( + testOrganizationId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testOrganizationId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + OrganizationId: testOrganizationId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *resourcemanager.ApiGetOrganizationRequest)) resourcemanager.ApiGetOrganizationRequest { + request := testClient.GetOrganization(testCtx, testOrganizationId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "uuid as example for an organization id", + argValues: []string{"12345678-90ab-cdef-1234-1234567890ab"}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.OrganizationId = "12345678-90ab-cdef-1234-1234567890ab" + }), + }, + { + description: "non uuid string as example for a container id", + argValues: []string{"foo-bar-organization"}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.OrganizationId = "foo-bar-organization" + }), + }, + { + description: "no args", + argValues: []string{}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest resourcemanager.ApiGetOrganizationRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + organization *resourcemanager.OrganizationResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "nil pointer as organization", + args: args{ + organization: nil, + }, + wantErr: false, + }, + { + name: "empty organization", + args: args{ + organization: utils.Ptr(resourcemanager.OrganizationResponse{}), + }, + wantErr: false, + }, + { + name: "full response", + args: args{ + organization: utils.Ptr(resourcemanager.OrganizationResponse{ + OrganizationId: utils.Ptr(uuid.NewString()), + Name: utils.Ptr("foo bar"), + LifecycleState: utils.Ptr(resourcemanager.LIFECYCLESTATE_ACTIVE), + ContainerId: utils.Ptr("foo-bar-organization"), + CreationTime: utils.Ptr(time.Now()), + UpdateTime: utils.Ptr(time.Now()), + Labels: utils.Ptr(map[string]string{ + "foo": "true", + "bar": "false", + }), + }), + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.organization); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/organization/list/list.go b/internal/cmd/organization/list/list.go new file mode 100644 index 000000000..07a85c10b --- /dev/null +++ b/internal/cmd/organization/list/list.go @@ -0,0 +1,145 @@ +package list + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" +) + +const ( + limitFlag = "limit" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Limit *int64 + Member string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all organizations", + Long: "Lists all organizations.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Lists organizations for your user`, + "$ stackit organization list", + ), + examples.NewExample( + `Lists the first 10 organizations`, + "$ stackit organization list --limit 10", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + activeProfile, err := config.GetProfile() + if err != nil { + return fmt.Errorf("get profile: %w", err) + } + model.Member = auth.GetProfileEmail(activeProfile) + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return err + } + + if resp == nil { + return fmt.Errorf("list organizations: empty response") + } + + return outputResult(params.Printer, model.OutputFormat, utils.PtrValue(resp.Items)) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list (default 50)") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && (*limit < 1 || *limit > 100) { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be between 0 and 100", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *resourcemanager.APIClient) resourcemanager.ApiListOrganizationsRequest { + req := apiClient.ListOrganizations(ctx) + req = req.Member(model.Member) + if model.Limit != nil { + req = req.Limit(float32(*model.Limit)) + } + return req +} + +func outputResult(p *print.Printer, outputFormat string, organizations []resourcemanager.ListOrganizationsResponseItemsInner) error { + return p.OutputResult(outputFormat, organizations, func() error { + if len(organizations) == 0 { + p.Outputln("No organizations found") + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "CONTAINER ID") + + for _, organization := range organizations { + table.AddRow( + utils.PtrString(organization.OrganizationId), + utils.PtrString(organization.Name), + utils.PtrString(organization.ContainerId), + ) + table.AddSeparator() + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/organization/list/list_test.go b/internal/cmd/organization/list/list_test.go new file mode 100644 index 000000000..ec54c69ea --- /dev/null +++ b/internal/cmd/organization/list/list_test.go @@ -0,0 +1,191 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &resourcemanager.APIClient{} + +const ( + testEmail = "foo@bar" + testLimit = 10 +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + limitFlag: strconv.Itoa(int(testLimit)), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + }, + Limit: utils.Ptr(int64(testLimit)), + Member: testEmail, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *resourcemanager.ApiListOrganizationsRequest)) resourcemanager.ApiListOrganizationsRequest { + request := testClient.ListOrganizations(testCtx) + request = request.Limit(testLimit) + request = request.Member(testEmail) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + // model.Member is set by the Run function afterwards + model.Member = "" + }), + }, + { + description: "no limit", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, limitFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + // model.Member is set by the Run function afterwards + model.Member = "" + model.Limit = nil + }), + }, + { + description: "limit invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "limit invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest resourcemanager.ApiListOrganizationsRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "empty input model", + model: fixtureInputModel(func(model *inputModel) { + model.Member = "" + model.Limit = nil + }), + expectedRequest: testClient.ListOrganizations(testCtx).Member(""), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + organizations []resourcemanager.ListOrganizationsResponseItemsInner + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: false, + }, + { + name: "empty organizations slice", + args: args{ + organizations: []resourcemanager.ListOrganizationsResponseItemsInner{}, + }, + wantErr: false, + }, + { + name: "empty organization in organizations slice", + args: args{ + organizations: []resourcemanager.ListOrganizationsResponseItemsInner{{}}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.organizations); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/organization/organization.go b/internal/cmd/organization/organization.go index 7a68177b7..adc9fa8e8 100644 --- a/internal/cmd/organization/organization.go +++ b/internal/cmd/organization/organization.go @@ -5,6 +5,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/cmd/organization/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/organization/list" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/member" "github.com/stackitcloud/stackit-cli/internal/cmd/organization/role" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -31,4 +33,6 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(member.NewCmd(params)) cmd.AddCommand(role.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) } From fad8e6dc0f974c7340b56b6fc8ff7944f0a9c742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 25 Feb 2026 10:46:28 +0100 Subject: [PATCH 384/422] fix(run-command): prevent nil pointer dereference on missing params flag (#1306) relates to #1289 --- internal/cmd/server/command/create/create.go | 5 +-- .../cmd/server/command/create/create_test.go | 10 ++++++ .../pkg/services/runcommand/utils/utils.go | 9 +++-- .../services/runcommand/utils/utils_test.go | 33 ++++++++++++------- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 1561ab3b5..6ac6fed6d 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -119,14 +119,15 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, CommandTemplateName: flags.FlagToStringValue(p, cmd, commandTemplateNameFlag), Params: flags.FlagToStringToStringPointer(p, cmd, paramsFlag), } - parsedParams, err := runcommandUtils.ParseScriptParams(*model.Params) + + var err error + model.Params, err = runcommandUtils.ParseScriptParams(model.Params) if err != nil { return nil, &cliErr.FlagValidationError{ Flag: paramsFlag, Details: err.Error(), } } - model.Params = &parsedParams p.DebugInputModel(model) return &model, nil diff --git a/internal/cmd/server/command/create/create_test.go b/internal/cmd/server/command/create/create_test.go index 5b19bf508..8029d65e5 100644 --- a/internal/cmd/server/command/create/create_test.go +++ b/internal/cmd/server/command/create/create_test.go @@ -105,6 +105,16 @@ func TestParseInput(t *testing.T) { flagValues: map[string]string{}, isValid: false, }, + { + description: "params flag missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, paramsFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Params = nil + }), + }, { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { diff --git a/internal/pkg/services/runcommand/utils/utils.go b/internal/pkg/services/runcommand/utils/utils.go index d6775f373..358e27c59 100644 --- a/internal/pkg/services/runcommand/utils/utils.go +++ b/internal/pkg/services/runcommand/utils/utils.go @@ -5,13 +5,15 @@ import ( "strings" ) -func ParseScriptParams(params map[string]string) (map[string]string, error) { +func ParseScriptParams(params *map[string]string) (*map[string]string, error) { //nolint:gocritic // flag value is a map pointer if params == nil { return nil, nil } + parsed := map[string]string{} - for k, v := range params { + for k, v := range *params { parsed[k] = v + if k == "script" && strings.HasPrefix(v, "@{") && strings.HasSuffix(v, "}") { // Check if a script file path was specified, like: --params script=@{/tmp/test.sh} fileContents, err := os.ReadFile(v[2 : len(v)-1]) @@ -21,5 +23,6 @@ func ParseScriptParams(params map[string]string) (map[string]string, error) { parsed[k] = string(fileContents) } } - return parsed, nil + + return &parsed, nil } diff --git a/internal/pkg/services/runcommand/utils/utils_test.go b/internal/pkg/services/runcommand/utils/utils_test.go index 5b1d1c69f..320bac18c 100644 --- a/internal/pkg/services/runcommand/utils/utils_test.go +++ b/internal/pkg/services/runcommand/utils/utils_test.go @@ -2,26 +2,34 @@ package utils import ( "testing" + + "github.com/google/go-cmp/cmp" ) func TestParseScriptParams(t *testing.T) { tests := []struct { description string - input map[string]string - expectedOutput map[string]string + input *map[string]string + expectedOutput *map[string]string isValid bool }{ { - "base-ok", - map[string]string{"script": "ls /"}, - map[string]string{"script": "ls /"}, - true, + description: "base-ok", + input: &map[string]string{"script": "ls /"}, + expectedOutput: &map[string]string{"script": "ls /"}, + isValid: true, + }, + { + description: "nil input", + input: nil, + expectedOutput: nil, + isValid: true, }, { - "not-ok-nonexistant-file-specified-for-script", - map[string]string{"script": "@{/some/file/which/does/not/exist/and/thus/fails}"}, - nil, - false, + description: "not-ok-nonexistant-file-specified-for-script", + input: &map[string]string{"script": "@{/some/file/which/does/not/exist/and/thus/fails}"}, + expectedOutput: nil, + isValid: false, }, } @@ -38,8 +46,9 @@ func TestParseScriptParams(t *testing.T) { if !tt.isValid { return } - if output["script"] != tt.expectedOutput["script"] { - t.Errorf("expected output to be %s, got %s", tt.expectedOutput["script"], output["script"]) + diff := cmp.Diff(output, tt.expectedOutput) + if diff != "" { + t.Fatalf("ParseScriptParams() output mismatch (-want +got):\n%s", diff) } }) } From 4ae032eac1b6d483ce397468516a812db2e2e8c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 07:08:41 +0000 Subject: [PATCH 385/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability from 0.16.3 to 0.17.0 (#1305) * chore(deps): bump github.com/stackitcloud/stackit-sdk-go/services/observability Bumps [github.com/stackitcloud/stackit-sdk-go/services/observability](https://github.com/stackitcloud/stackit-sdk-go) from 0.16.3 to 0.17.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/services/observability/v0.16.3...core/v0.17.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/services/observability dependency-version: 0.17.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * chore(observablity): Update version to v0.17.0 Signed-off-by: Alexander Dahmen --------- Signed-off-by: dependabot[bot] Signed-off-by: Alexander Dahmen Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexander Dahmen --- go.mod | 2 +- go.sum | 4 +-- .../scrape-config/create/create_test.go | 10 +++---- .../scrape-config/update/update_test.go | 6 ++--- .../pkg/services/observability/utils/utils.go | 18 ++++++------- .../observability/utils/utils_test.go | 26 +++++++++---------- 6 files changed, 33 insertions(+), 33 deletions(-) diff --git a/go.mod b/go.mod index 606141d22..fc3821c81 100644 --- a/go.mod +++ b/go.mod @@ -270,7 +270,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 - github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 + github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0 diff --git a/go.sum b/go.sum index e5d523ee6..1d3d73795 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA= github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3 h1:J/R6iBALMiNpg+JDEx1adH50TM4UTF/KBYFuHENMKIs= -github.com/stackitcloud/stackit-sdk-go/services/observability v0.16.3/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 h1:LGwCvvST0fwUgZ6bOxYIfu45qqTgv421ZS07UhKjZL8= +github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177Ojn8OvXIOUbRSwtx7L59jhxDPrZEQFOfQ= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6/go.mod h1:6ZBeCCY6qG8w1oK7osf61Egyv3mp7Ahv6GDGxiarDGo= github.com/stackitcloud/stackit-sdk-go/services/postgresflex v1.3.5 h1:H67e3KnHQx954yI8fuQmxXwRf/myqAdLg2KvxImp00g= diff --git a/internal/cmd/observability/scrape-config/create/create_test.go b/internal/cmd/observability/scrape-config/create/create_test.go index 9d4ab9ba9..8da9b00a2 100644 --- a/internal/cmd/observability/scrape-config/create/create_test.go +++ b/internal/cmd/observability/scrape-config/create/create_test.go @@ -26,7 +26,7 @@ var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() var testPayload = &observability.CreateScrapeConfigPayload{ - BasicAuth: &observability.CreateScrapeConfigPayloadBasicAuth{ + BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, @@ -35,9 +35,9 @@ var testPayload = &observability.CreateScrapeConfigPayload{ HonorTimeStamps: utils.Ptr(true), MetricsPath: utils.Ptr("/metrics"), JobName: utils.Ptr("default-name"), - MetricsRelabelConfigs: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ + MetricsRelabelConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ { - Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), + Action: observability.PARTIALUPDATESCRAPECONFIGSREQUESTINNERMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), Modulus: utils.Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -54,7 +54,7 @@ var testPayload = &observability.CreateScrapeConfigPayload{ Scheme: observability.CREATESCRAPECONFIGPAYLOADSCHEME_HTTPS.Ptr(), ScrapeInterval: utils.Ptr("interval"), ScrapeTimeout: utils.Ptr("timeout"), - StaticConfigs: &[]observability.CreateScrapeConfigPayloadStaticConfigsInner{ + StaticConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{ { Labels: &map[string]interface{}{ "label": "value", @@ -63,7 +63,7 @@ var testPayload = &observability.CreateScrapeConfigPayload{ Targets: &[]string{"target"}, }, }, - TlsConfig: &observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig{ + TlsConfig: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ InsecureSkipVerify: utils.Ptr(true), }, } diff --git a/internal/cmd/observability/scrape-config/update/update_test.go b/internal/cmd/observability/scrape-config/update/update_test.go index 595b4f09e..2f7ce1b13 100644 --- a/internal/cmd/observability/scrape-config/update/update_test.go +++ b/internal/cmd/observability/scrape-config/update/update_test.go @@ -24,7 +24,7 @@ var testInstanceId = uuid.NewString() var testJobName = "my-config" var testPayload = observability.UpdateScrapeConfigPayload{ - BasicAuth: &observability.CreateScrapeConfigPayloadBasicAuth{ + BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, @@ -32,9 +32,9 @@ var testPayload = observability.UpdateScrapeConfigPayload{ HonorLabels: utils.Ptr(true), HonorTimeStamps: utils.Ptr(true), MetricsPath: utils.Ptr("/metrics"), - MetricsRelabelConfigs: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ + MetricsRelabelConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ { - Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), + Action: observability.PARTIALUPDATESCRAPECONFIGSREQUESTINNERMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), Modulus: utils.Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), diff --git a/internal/pkg/services/observability/utils/utils.go b/internal/pkg/services/observability/utils/utils.go index 234da09be..da4f099bf 100644 --- a/internal/pkg/services/observability/utils/utils.go +++ b/internal/pkg/services/observability/utils/utils.go @@ -21,7 +21,7 @@ type ObservabilityClient interface { } var ( - defaultStaticConfigs = []observability.CreateScrapeConfigPayloadStaticConfigsInner{ + defaultStaticConfigs = []observability.PartialUpdateScrapeConfigsRequestInnerStaticConfigsInner{ { Targets: utils.Ptr([]string{ "url-target", @@ -120,14 +120,14 @@ func MapToUpdateScrapeConfigPayload(resp *observability.GetScrapeConfigResponse) return &payload, nil } -func mapMetricsRelabelConfig(metricsRelabelConfigs *[]observability.MetricsRelabelConfig) *[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner { +func mapMetricsRelabelConfig(metricsRelabelConfigs *[]observability.MetricsRelabelConfig) *[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner { if metricsRelabelConfigs == nil { return nil } - var mappedConfigs []observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner + var mappedConfigs []observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner for _, config := range *metricsRelabelConfigs { - mappedConfig := observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ - Action: observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInnerGetActionAttributeType(config.Action), + mappedConfig := observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ + Action: observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInnerGetActionAttributeType(config.Action), Modulus: utils.ConvertInt64PToFloat64P(config.Modulus), Regex: config.Regex, Replacement: config.Replacement, @@ -160,23 +160,23 @@ func mapStaticConfig(staticConfigs *[]observability.StaticConfigs) *[]observabil return &mappedConfigs } -func mapBasicAuth(basicAuth *observability.BasicAuth) *observability.CreateScrapeConfigPayloadBasicAuth { +func mapBasicAuth(basicAuth *observability.BasicAuth) *observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth { if basicAuth == nil { return nil } - return &observability.CreateScrapeConfigPayloadBasicAuth{ + return &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ Password: basicAuth.Password, Username: basicAuth.Username, } } -func mapTlsConfig(tlsConfig *observability.TLSConfig) *observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig { +func mapTlsConfig(tlsConfig *observability.TLSConfig) *observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig { if tlsConfig == nil { return nil } - return &observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig{ + return &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ InsecureSkipVerify: tlsConfig.InsecureSkipVerify, } } diff --git a/internal/pkg/services/observability/utils/utils_test.go b/internal/pkg/services/observability/utils/utils_test.go index 0b5083aad..18919db62 100644 --- a/internal/pkg/services/observability/utils/utils_test.go +++ b/internal/pkg/services/observability/utils/utils_test.go @@ -89,7 +89,7 @@ func fixtureGetScrapeConfigResponse(mods ...func(*observability.GetScrapeConfigR func fixtureUpdateScrapeConfigPayload(mods ...func(*observability.UpdateScrapeConfigPayload)) *observability.UpdateScrapeConfigPayload { payload := &observability.UpdateScrapeConfigPayload{ - BasicAuth: &observability.CreateScrapeConfigPayloadBasicAuth{ + BasicAuth: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, @@ -97,9 +97,9 @@ func fixtureUpdateScrapeConfigPayload(mods ...func(*observability.UpdateScrapeCo HonorLabels: utils.Ptr(true), HonorTimeStamps: utils.Ptr(true), MetricsPath: utils.Ptr("/metrics"), - MetricsRelabelConfigs: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ + MetricsRelabelConfigs: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ { - Action: utils.Ptr(observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInnerAction("replace")), + Action: observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInnerGetActionAttributeType(utils.Ptr("replace")), Modulus: utils.Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -125,7 +125,7 @@ func fixtureUpdateScrapeConfigPayload(mods ...func(*observability.UpdateScrapeCo Targets: &[]string{"target"}, }, }, - TlsConfig: &observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig{ + TlsConfig: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ InsecureSkipVerify: utils.Ptr(true), }, } @@ -426,7 +426,7 @@ func TestMapMetricsRelabelConfig(t *testing.T) { tests := []struct { description string config *[]observability.MetricsRelabelConfig - expected *[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner + expected *[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner }{ { description: "base case", @@ -441,9 +441,9 @@ func TestMapMetricsRelabelConfig(t *testing.T) { TargetLabel: utils.Ptr("targetLabel"), }, }, - expected: &[]observability.CreateScrapeConfigPayloadMetricsRelabelConfigsInner{ + expected: &[]observability.PartialUpdateScrapeConfigsRequestInnerMetricsRelabelConfigsInner{ { - Action: observability.CREATESCRAPECONFIGPAYLOADMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), + Action: observability.PARTIALUPDATESCRAPECONFIGSREQUESTINNERMETRICSRELABELCONFIGSINNERACTION_REPLACE.Ptr(), Modulus: utils.Float64Ptr(1.0), Regex: utils.Ptr("regex"), Replacement: utils.Ptr("replacement"), @@ -540,7 +540,7 @@ func TestMapBasicAuth(t *testing.T) { tests := []struct { description string auth *observability.BasicAuth - expected *observability.CreateScrapeConfigPayloadBasicAuth + expected *observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth }{ { description: "base case", @@ -548,7 +548,7 @@ func TestMapBasicAuth(t *testing.T) { Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, - expected: &observability.CreateScrapeConfigPayloadBasicAuth{ + expected: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{ Username: utils.Ptr("username"), Password: utils.Ptr("password"), }, @@ -556,7 +556,7 @@ func TestMapBasicAuth(t *testing.T) { { description: "empty data", auth: &observability.BasicAuth{}, - expected: &observability.CreateScrapeConfigPayloadBasicAuth{}, + expected: &observability.PartialUpdateScrapeConfigsRequestInnerBasicAuth{}, }, { description: "nil", @@ -585,21 +585,21 @@ func TestMapTlsConfig(t *testing.T) { tests := []struct { description string config *observability.TLSConfig - expected *observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig + expected *observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig }{ { description: "base case", config: &observability.TLSConfig{ InsecureSkipVerify: utils.Ptr(true), }, - expected: &observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig{ + expected: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{ InsecureSkipVerify: utils.Ptr(true), }, }, { description: "empty data", config: &observability.TLSConfig{}, - expected: &observability.CreateScrapeConfigPayloadHttpSdConfigsInnerOauth2TlsConfig{}, + expected: &observability.PartialUpdateScrapeConfigsRequestInnerHttpSdConfigsInnerOauth2TlsConfig{}, }, { description: "nil", From 9e242dcc8774768dc22786f45e62c9d72d600fb3 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Thu, 26 Feb 2026 11:35:54 +0100 Subject: [PATCH 386/422] fix(config) export profile: write default cfg to exportPath when cfg does not exist (#1316) https://github.com/stackitcloud/stackit-cli/pull/214 removed writing the default config to file on start. So no config file exists for the default profile if user did never set a value. This lead to an error when exporting the non-existent config of the default profile. This fix writes the default config to exportPath in this case. --- internal/pkg/config/profiles.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/pkg/config/profiles.go b/internal/pkg/config/profiles.go index 17d2fd352..cf96d222e 100644 --- a/internal/pkg/config/profiles.go +++ b/internal/pkg/config/profiles.go @@ -7,6 +7,7 @@ import ( "path/filepath" "regexp" + "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -434,7 +435,13 @@ func ExportProfile(p *print.Printer, profile, exportPath string) error { return &errors.FileAlreadyExistsError{Filename: exportPath} } - err = fileutils.CopyFile(configFile, exportPath) + _, err = os.Stat(configFile) + if os.IsNotExist(err) { + // viper.SafeWriteConfigAs would not overwrite the target, so we use WriteConfigAs for the same behavior as CopyFile + err = viper.WriteConfigAs(exportPath) + } else { + err = fileutils.CopyFile(configFile, exportPath) + } if err != nil { return fmt.Errorf("export config file to %q: %w", exportPath, err) } From 2ef1ff36fad6cff24ee9cc3f3c66f6e061b6c0d2 Mon Sep 17 00:00:00 2001 From: Manuel Vaas <34416897+Manuelvaas@users.noreply.github.com> Date: Thu, 26 Feb 2026 18:30:48 +0100 Subject: [PATCH 387/422] feat(iaas): show image status on image describe (#1317) relates to STACKITCLI-231 and #908 --- internal/cmd/image/describe/describe.go | 7 +++-- internal/cmd/image/describe/describe_test.go | 28 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index 09f9f86dc..a1801be49 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -96,13 +96,16 @@ func outputResult(p *print.Printer, outputFormat string, resp *iaas.Image) error table := tables.NewTable() if id := resp.Id; id != nil { table.AddRow("ID", *id) + table.AddSeparator() } - table.AddSeparator() - if name := resp.Name; name != nil { table.AddRow("NAME", *name) table.AddSeparator() } + if status := resp.Status; status != nil { + table.AddRow("STATUS", *status) + table.AddSeparator() + } if format := resp.DiskFormat; format != nil { table.AddRow("FORMAT", *format) table.AddSeparator() diff --git a/internal/cmd/image/describe/describe_test.go b/internal/cmd/image/describe/describe_test.go index 256ef1c2a..2d9bd7fb8 100644 --- a/internal/cmd/image/describe/describe_test.go +++ b/internal/cmd/image/describe/describe_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -225,6 +226,33 @@ func TestOutputResult(t *testing.T) { args: args{}, wantErr: true, }, + { + name: "valid value", + args: args{ + resp: &iaas.Image{ + Id: utils.Ptr(uuid.NewString()), + Name: utils.Ptr("Image"), + Status: utils.Ptr("STATUS"), + DiskFormat: utils.Ptr("format"), + MinDiskSize: utils.Ptr(int64(0)), + MinRam: utils.Ptr(int64(0)), + Config: &iaas.ImageConfig{ + Architecture: utils.Ptr("architecture"), + OperatingSystem: utils.Ptr("os"), + OperatingSystemDistro: iaas.NewNullableString(utils.Ptr("os distro")), + OperatingSystemVersion: iaas.NewNullableString(utils.Ptr("0.00.0")), + Uefi: utils.Ptr(true), + }, + Labels: utils.Ptr(map[string]any{ + "label1": true, + "label2": false, + "label3": 42, + "foo": "bar", + }), + }, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(&types.CmdParams{Printer: p}) From 29ed5b27e36cfd74c0ed5537da2380b8f4fae4a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:17:25 +0100 Subject: [PATCH 388/422] chore(deps): bump k8s.io/apimachinery from 0.35.1 to 0.35.2 (#1319) Bumps [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) from 0.35.1 to 0.35.2. - [Commits](https://github.com/kubernetes/apimachinery/compare/v0.35.1...v0.35.2) --- updated-dependencies: - dependency-name: k8s.io/apimachinery dependency-version: 0.35.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fc3821c81..1f378e921 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( golang.org/x/oauth2 v0.35.0 golang.org/x/term v0.40.0 golang.org/x/text v0.34.0 - k8s.io/apimachinery v0.35.1 + k8s.io/apimachinery v0.35.2 k8s.io/client-go v0.35.1 ) diff --git a/go.sum b/go.sum index 1d3d73795..e7660fb52 100644 --- a/go.sum +++ b/go.sum @@ -1110,8 +1110,8 @@ honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q= k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM= -k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU= -k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/apimachinery v0.35.2 h1:NqsM/mmZA7sHW02JZ9RTtk3wInRgbVxL8MPfzSANAK8= +k8s.io/apimachinery v0.35.2/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= k8s.io/client-go v0.35.1 h1:+eSfZHwuo/I19PaSxqumjqZ9l5XiTEKbIaJ+j1wLcLM= k8s.io/client-go v0.35.1/go.mod h1:1p1KxDt3a0ruRfc/pG4qT/3oHmUj1AhSHEcxNSGg+OA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= From 1657b7195f6f4ae80bed3ebf1d1155623acdc36c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 17:49:45 +0100 Subject: [PATCH 389/422] chore(deps): bump github.com/stackitcloud/stackit-sdk-go/core (#1318) Bumps [github.com/stackitcloud/stackit-sdk-go/core](https://github.com/stackitcloud/stackit-sdk-go) from 0.21.1 to 0.22.0. - [Release notes](https://github.com/stackitcloud/stackit-sdk-go/releases) - [Changelog](https://github.com/stackitcloud/stackit-sdk-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/stackitcloud/stackit-sdk-go/compare/core/v0.21.1...core/v0.22.0) --- updated-dependencies: - dependency-name: github.com/stackitcloud/stackit-sdk-go/core dependency-version: 0.22.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1f378e921..9948b8bcd 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.21.1 + github.com/stackitcloud/stackit-sdk-go/core v0.22.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0 diff --git a/go.sum b/go.sum index e7660fb52..c6d5e71ed 100644 --- a/go.sum +++ b/go.sum @@ -596,8 +596,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.21.1 h1:Y/PcAgM7DPYMNqum0MLv4n1mF9ieuevzcCIZYQfm3Ts= -github.com/stackitcloud/stackit-sdk-go/core v0.21.1/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= +github.com/stackitcloud/stackit-sdk-go/core v0.22.0 h1:6rViz7GnNwXSh51Lur5xuDzO8EWSZfN9J0HvEkBKq6c= +github.com/stackitcloud/stackit-sdk-go/core v0.22.0/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0 h1:V9+885qkSv621rZZatg1YE5ENM1ElALxQDJsh+hDIUg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 h1:HxPgBu04j5tj6nfZ2r0l6v4VXC0/tYOGe4sA5Addra8= From 92c48cbeb188b18ec9e2ee6a75d0b842e7c703b9 Mon Sep 17 00:00:00 2001 From: Manuel Vaas <34416897+Manuelvaas@users.noreply.github.com> Date: Fri, 27 Feb 2026 18:39:52 +0100 Subject: [PATCH 390/422] feat(ske): split options to own subcommands (#1313) also add filter to show only supported k8s versions relates to STACKITCLI-312 --- docs/stackit_ske_options.md | 26 +- .../stackit_ske_options_availability-zones.md | 40 +++ ...stackit_ske_options_kubernetes-versions.md | 44 ++++ docs/stackit_ske_options_machine-images.md | 40 +++ docs/stackit_ske_options_machine-types.md | 40 +++ docs/stackit_ske_options_volume-types.md | 40 +++ .../availability_zones/availability_zones.go | 103 ++++++++ .../availability_zones_test.go | 203 +++++++++++++++ .../kubernetes_versions.go | 135 ++++++++++ .../kubernetes_versions_test.go | 231 ++++++++++++++++++ .../options/machine_images/machine_images.go | 127 ++++++++++ .../machine_images/machine_images_test.go | 216 ++++++++++++++++ .../options/machine_types/machine_types.go | 107 ++++++++ .../machine_types/machine_types_test.go | 211 ++++++++++++++++ internal/cmd/ske/options/options.go | 43 ++-- internal/cmd/ske/options/options_test.go | 12 +- .../ske/options/volume_types/volume_types.go | 103 ++++++++ .../options/volume_types/volume_types_test.go | 203 +++++++++++++++ 18 files changed, 1883 insertions(+), 41 deletions(-) create mode 100644 docs/stackit_ske_options_availability-zones.md create mode 100644 docs/stackit_ske_options_kubernetes-versions.md create mode 100644 docs/stackit_ske_options_machine-images.md create mode 100644 docs/stackit_ske_options_machine-types.md create mode 100644 docs/stackit_ske_options_volume-types.md create mode 100644 internal/cmd/ske/options/availability_zones/availability_zones.go create mode 100644 internal/cmd/ske/options/availability_zones/availability_zones_test.go create mode 100644 internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go create mode 100644 internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go create mode 100644 internal/cmd/ske/options/machine_images/machine_images.go create mode 100644 internal/cmd/ske/options/machine_images/machine_images_test.go create mode 100644 internal/cmd/ske/options/machine_types/machine_types.go create mode 100644 internal/cmd/ske/options/machine_types/machine_types_test.go create mode 100644 internal/cmd/ske/options/volume_types/volume_types.go create mode 100644 internal/cmd/ske/options/volume_types/volume_types_test.go diff --git a/docs/stackit_ske_options.md b/docs/stackit_ske_options.md index 76afbe93c..2590f989c 100644 --- a/docs/stackit_ske_options.md +++ b/docs/stackit_ske_options.md @@ -4,6 +4,7 @@ Lists SKE provider options ### Synopsis +Command "options" is deprecated, use the subcommands instead. Lists STACKIT Kubernetes Engine (SKE) provider options (availability zones, Kubernetes versions, machine images and types, volume types). Pass one or more flags to filter what categories are shown. @@ -11,28 +12,10 @@ Pass one or more flags to filter what categories are shown. stackit ske options [flags] ``` -### Examples - -``` - List SKE options for all categories - $ stackit ske options - - List SKE options regarding Kubernetes versions only - $ stackit ske options --kubernetes-versions - - List SKE options regarding Kubernetes versions and machine images - $ stackit ske options --kubernetes-versions --machine-images -``` - ### Options ``` - --availability-zones Lists availability zones - -h, --help Help for "stackit ske options" - --kubernetes-versions Lists supported kubernetes versions - --machine-images Lists supported machine images - --machine-types Lists supported machine types - --volume-types Lists supported volume types + -h, --help Help for "stackit ske options" ``` ### Options inherited from parent commands @@ -49,4 +32,9 @@ stackit ske options [flags] ### SEE ALSO * [stackit ske](./stackit_ske.md) - Provides functionality for SKE +* [stackit ske options availability-zones](./stackit_ske_options_availability-zones.md) - Lists SKE provider options for availability-zones +* [stackit ske options kubernetes-versions](./stackit_ske_options_kubernetes-versions.md) - Lists SKE provider options for kubernetes-versions +* [stackit ske options machine-images](./stackit_ske_options_machine-images.md) - Lists SKE provider options for machine-images +* [stackit ske options machine-types](./stackit_ske_options_machine-types.md) - Lists SKE provider options for machine-types +* [stackit ske options volume-types](./stackit_ske_options_volume-types.md) - Lists SKE provider options for volume-types diff --git a/docs/stackit_ske_options_availability-zones.md b/docs/stackit_ske_options_availability-zones.md new file mode 100644 index 000000000..4bf77c67f --- /dev/null +++ b/docs/stackit_ske_options_availability-zones.md @@ -0,0 +1,40 @@ +## stackit ske options availability-zones + +Lists SKE provider options for availability-zones + +### Synopsis + +Lists STACKIT Kubernetes Engine (SKE) provider options for availability-zones. + +``` +stackit ske options availability-zones [flags] +``` + +### Examples + +``` + List SKE options for availability-zones + $ stackit ske options availability-zones +``` + +### Options + +``` + -h, --help Help for "stackit ske options availability-zones" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske options](./stackit_ske_options.md) - Lists SKE provider options + diff --git a/docs/stackit_ske_options_kubernetes-versions.md b/docs/stackit_ske_options_kubernetes-versions.md new file mode 100644 index 000000000..a2dd50edd --- /dev/null +++ b/docs/stackit_ske_options_kubernetes-versions.md @@ -0,0 +1,44 @@ +## stackit ske options kubernetes-versions + +Lists SKE provider options for kubernetes-versions + +### Synopsis + +Lists STACKIT Kubernetes Engine (SKE) provider options for kubernetes-versions. + +``` +stackit ske options kubernetes-versions [flags] +``` + +### Examples + +``` + List SKE options for kubernetes-versions + $ stackit ske options kubernetes-versions + + List SKE options for supported kubernetes-versions + $ stackit ske options kubernetes-versions --supported +``` + +### Options + +``` + -h, --help Help for "stackit ske options kubernetes-versions" + --supported List supported versions only +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske options](./stackit_ske_options.md) - Lists SKE provider options + diff --git a/docs/stackit_ske_options_machine-images.md b/docs/stackit_ske_options_machine-images.md new file mode 100644 index 000000000..f6deb67db --- /dev/null +++ b/docs/stackit_ske_options_machine-images.md @@ -0,0 +1,40 @@ +## stackit ske options machine-images + +Lists SKE provider options for machine-images + +### Synopsis + +Lists STACKIT Kubernetes Engine (SKE) provider options for machine-images. + +``` +stackit ske options machine-images [flags] +``` + +### Examples + +``` + List SKE options for machine-images + $ stackit ske options machine-images +``` + +### Options + +``` + -h, --help Help for "stackit ske options machine-images" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske options](./stackit_ske_options.md) - Lists SKE provider options + diff --git a/docs/stackit_ske_options_machine-types.md b/docs/stackit_ske_options_machine-types.md new file mode 100644 index 000000000..333384fc3 --- /dev/null +++ b/docs/stackit_ske_options_machine-types.md @@ -0,0 +1,40 @@ +## stackit ske options machine-types + +Lists SKE provider options for machine-types + +### Synopsis + +Lists STACKIT Kubernetes Engine (SKE) provider options for machine-types. + +``` +stackit ske options machine-types [flags] +``` + +### Examples + +``` + List SKE options for machine-types + $ stackit ske options machine-types +``` + +### Options + +``` + -h, --help Help for "stackit ske options machine-types" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske options](./stackit_ske_options.md) - Lists SKE provider options + diff --git a/docs/stackit_ske_options_volume-types.md b/docs/stackit_ske_options_volume-types.md new file mode 100644 index 000000000..aeea921dc --- /dev/null +++ b/docs/stackit_ske_options_volume-types.md @@ -0,0 +1,40 @@ +## stackit ske options volume-types + +Lists SKE provider options for volume-types + +### Synopsis + +Lists STACKIT Kubernetes Engine (SKE) provider options for volume-types. + +``` +stackit ske options volume-types [flags] +``` + +### Examples + +``` + List SKE options for volume-types + $ stackit ske options volume-types +``` + +### Options + +``` + -h, --help Help for "stackit ske options volume-types" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit ske options](./stackit_ske_options.md) - Lists SKE provider options + diff --git a/internal/cmd/ske/options/availability_zones/availability_zones.go b/internal/cmd/ske/options/availability_zones/availability_zones.go new file mode 100644 index 000000000..bef599ad4 --- /dev/null +++ b/internal/cmd/ske/options/availability_zones/availability_zones.go @@ -0,0 +1,103 @@ +package availability_zones + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type inputModel struct { + globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "availability-zones", + Short: "Lists SKE provider options for availability-zones", + Long: "Lists STACKIT Kubernetes Engine (SKE) provider options for availability-zones.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List SKE options for availability-zones`, + "$ stackit ske options availability-zones"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, apiClient, model) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get SKE provider options: %w", err) + } + + return outputResult(params.Printer, model, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: utils.PtrValue(globalFlags), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { + req := apiClient.ListProviderOptions(ctx, model.Region) + return req +} + +func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOptions) error { + if options == nil { + return fmt.Errorf("options is nil") + } + + options.KubernetesVersions = nil + options.MachineImages = nil + options.MachineTypes = nil + options.VolumeTypes = nil + + return p.OutputResult(model.OutputFormat, options, func() error { + zones := utils.PtrValue(options.AvailabilityZones) + + table := tables.NewTable() + table.SetHeader("ZONE") + for i := range zones { + z := zones[i] + table.AddRow(utils.PtrValue(z.Name)) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display output: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/ske/options/availability_zones/availability_zones_test.go b/internal/cmd/ske/options/availability_zones/availability_zones_test.go new file mode 100644 index 000000000..e66bca441 --- /dev/null +++ b/internal/cmd/ske/options/availability_zones/availability_zones_test.go @@ -0,0 +1,203 @@ +package availability_zones + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Region = "" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + inputModel *inputModel + expectedRequest ske.ApiListProviderOptionsRequest + }{ + { + description: "base", + inputModel: fixtureInputModel(), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient, tt.inputModel) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + options *ske.ProviderOptions + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + }, + wantErr: true, + }, + { + name: "empty input model", + args: args{ + model: &inputModel{}, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "set model and options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "empty values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + AvailabilityZones: &[]ske.AvailabilityZone{}, + }, + }, + wantErr: false, + }, + { + name: "empty value in values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + AvailabilityZones: &[]ske.AvailabilityZone{{}}, + }, + }, + wantErr: false, + }, + { + name: "valid values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + AvailabilityZones: &[]ske.AvailabilityZone{ + { + Name: utils.Ptr("zone1"), + }, + { + Name: utils.Ptr("zone2"), + }, + }, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go new file mode 100644 index 000000000..f7e0b8ab2 --- /dev/null +++ b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go @@ -0,0 +1,135 @@ +package kubernetes_versions + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +const ( + supportedFlag = "supported" +) + +type inputModel struct { + globalflags.GlobalFlagModel + Supported bool +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "kubernetes-versions", + Short: "Lists SKE provider options for kubernetes-versions", + Long: "Lists STACKIT Kubernetes Engine (SKE) provider options for kubernetes-versions.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List SKE options for kubernetes-versions`, + "$ stackit ske options kubernetes-versions"), + examples.NewExample( + `List SKE options for supported kubernetes-versions`, + "$ stackit ske options kubernetes-versions --supported"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, apiClient, model) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get SKE provider options: %w", err) + } + + return outputResult(params.Printer, model, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Bool(supportedFlag, false, "List supported versions only") +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: utils.PtrValue(globalFlags), + Supported: flags.FlagToBoolValue(p, cmd, supportedFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { + req := apiClient.ListProviderOptions(ctx, model.Region) + if model.Supported { + req = req.VersionState("SUPPORTED") + } + return req +} + +func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOptions) error { + if options == nil { + return fmt.Errorf("options is nil") + } + + options.AvailabilityZones = nil + options.MachineImages = nil + options.MachineTypes = nil + options.VolumeTypes = nil + + return p.OutputResult(model.OutputFormat, options, func() error { + versions := utils.PtrValue(options.KubernetesVersions) + + table := tables.NewTable() + table.SetHeader("VERSION", "STATE", "EXPIRATION DATE", "FEATURE GATES") + for i := range versions { + v := versions[i] + featureGate, err := json.Marshal(utils.PtrValue(v.FeatureGates)) + if err != nil { + return fmt.Errorf("marshal featureGates of Kubernetes version %q: %w", utils.PtrValue(v.Version), err) + } + expirationDate := "" + if v.ExpirationDate != nil { + expirationDate = v.ExpirationDate.Format(time.RFC3339) + } + table.AddRow( + utils.PtrString(v.Version), + utils.PtrString(v.State), + expirationDate, + string(featureGate)) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display output: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go new file mode 100644 index 000000000..f8c7bd3c4 --- /dev/null +++ b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go @@ -0,0 +1,231 @@ +package kubernetes_versions + +import ( + "context" + "testing" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + supportedFlag: "false", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + Supported: false, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Region = "" + }), + }, + { + description: "supported only", + flagValues: map[string]string{ + supportedFlag: "true", + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Supported = true + model.Region = "" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + inputModel *inputModel + expectedRequest ske.ApiListProviderOptionsRequest + }{ + { + description: "base", + inputModel: fixtureInputModel(), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + }, + { + description: "base", + inputModel: fixtureInputModel(func(model *inputModel) { + model.Supported = true + }), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion).VersionState("SUPPORTED"), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient, tt.inputModel) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + options *ske.ProviderOptions + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + }, + wantErr: true, + }, + { + name: "empty input model", + args: args{ + model: &inputModel{}, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "set model and options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "empty values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + KubernetesVersions: &[]ske.KubernetesVersion{}, + }, + }, + wantErr: false, + }, + { + name: "empty value in values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + KubernetesVersions: &[]ske.KubernetesVersion{{}}, + }, + }, + wantErr: false, + }, + { + name: "valid values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + KubernetesVersions: &[]ske.KubernetesVersion{ + { + FeatureGates: &map[string]string{ + "featureGate1": "foo", + "featureGate2": "bar", + }, + State: utils.Ptr("supported"), + Version: utils.Ptr("0.00.0"), + }, + { + ExpirationDate: utils.Ptr(time.Now()), + State: utils.Ptr("deprecated"), + Version: utils.Ptr("0.00.0"), + }, + }, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/ske/options/machine_images/machine_images.go b/internal/cmd/ske/options/machine_images/machine_images.go new file mode 100644 index 000000000..19eae47d5 --- /dev/null +++ b/internal/cmd/ske/options/machine_images/machine_images.go @@ -0,0 +1,127 @@ +package machine_images + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type inputModel struct { + globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "machine-images", + Short: "Lists SKE provider options for machine-images", + Long: "Lists STACKIT Kubernetes Engine (SKE) provider options for machine-images.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List SKE options for machine-images`, + "$ stackit ske options machine-images"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, apiClient, model) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get SKE provider options: %w", err) + } + + return outputResult(params.Printer, model, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: utils.PtrValue(globalFlags), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { + req := apiClient.ListProviderOptions(ctx, model.Region) + return req +} + +func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOptions) error { + if options == nil { + return fmt.Errorf("options is nil") + } + + options.AvailabilityZones = nil + options.KubernetesVersions = nil + options.MachineTypes = nil + options.VolumeTypes = nil + + return p.OutputResult(model.OutputFormat, options, func() error { + images := utils.PtrValue(options.MachineImages) + + table := tables.NewTable() + table.SetHeader("NAME", "VERSION", "STATE", "EXPIRATION DATE", "SUPPORTED CRI") + for i := range images { + image := images[i] + versions := utils.PtrValue(image.Versions) + for j := range versions { + version := versions[j] + criNames := make([]string, 0) + for i := range utils.PtrValue(version.Cri) { + cri := utils.PtrValue(version.Cri)[i] + criNames = append(criNames, utils.PtrString(cri.Name)) + } + criNamesString := strings.Join(criNames, ", ") + + expirationDate := "-" + if version.ExpirationDate != nil { + expirationDate = version.ExpirationDate.Format(time.RFC3339) + } + table.AddRow( + utils.PtrString(image.Name), + utils.PtrString(version.Version), + utils.PtrString(version.State), + expirationDate, + criNamesString, + ) + } + } + table.EnableAutoMergeOnColumns(1) + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display output: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/ske/options/machine_images/machine_images_test.go b/internal/cmd/ske/options/machine_images/machine_images_test.go new file mode 100644 index 000000000..e1f073b26 --- /dev/null +++ b/internal/cmd/ske/options/machine_images/machine_images_test.go @@ -0,0 +1,216 @@ +package machine_images + +import ( + "context" + "testing" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Region = "" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + inputModel *inputModel + expectedRequest ske.ApiListProviderOptionsRequest + }{ + { + description: "base", + inputModel: fixtureInputModel(), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient, tt.inputModel) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + options *ske.ProviderOptions + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + }, + wantErr: true, + }, + { + name: "empty input model", + args: args{ + model: &inputModel{}, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "set model and options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "empty values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + MachineImages: &[]ske.MachineImage{}, + }, + }, + wantErr: false, + }, + { + name: "empty value in values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + MachineImages: &[]ske.MachineImage{{}}, + }, + }, + wantErr: false, + }, + { + name: "valid values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + MachineImages: &[]ske.MachineImage{ + { + Name: utils.Ptr("image1"), + Versions: &[]ske.MachineImageVersion{ + { + Cri: &[]ske.CRI{ + { + Name: ske.CRINAME_CONTAINERD.Ptr(), + }, + }, + ExpirationDate: utils.Ptr(time.Now()), + State: utils.Ptr("supported"), + Version: utils.Ptr("0.00.0"), + }, + }, + }, + { + Name: utils.Ptr("zone2"), + }, + }, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/ske/options/machine_types/machine_types.go b/internal/cmd/ske/options/machine_types/machine_types.go new file mode 100644 index 000000000..26014dc59 --- /dev/null +++ b/internal/cmd/ske/options/machine_types/machine_types.go @@ -0,0 +1,107 @@ +package machine_types + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type inputModel struct { + globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "machine-types", + Short: "Lists SKE provider options for machine-types", + Long: "Lists STACKIT Kubernetes Engine (SKE) provider options for machine-types.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List SKE options for machine-types`, + "$ stackit ske options machine-types"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, apiClient, model) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get SKE provider options: %w", err) + } + + return outputResult(params.Printer, model, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: utils.PtrValue(globalFlags), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { + req := apiClient.ListProviderOptions(ctx, model.Region) + return req +} + +func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOptions) error { + if options == nil { + return fmt.Errorf("options is nil") + } + + options.AvailabilityZones = nil + options.KubernetesVersions = nil + options.MachineImages = nil + options.VolumeTypes = nil + + return p.OutputResult(model.OutputFormat, options, func() error { + machineTypes := utils.PtrValue(options.MachineTypes) + + table := tables.NewTable() + table.SetHeader("TYPE", "CPU", "MEMORY") + for i := range machineTypes { + t := machineTypes[i] + table.AddRow( + utils.PtrString(t.Name), + utils.PtrString(t.Cpu), + utils.PtrString(t.Memory), + ) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display output: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/ske/options/machine_types/machine_types_test.go b/internal/cmd/ske/options/machine_types/machine_types_test.go new file mode 100644 index 000000000..7db75d847 --- /dev/null +++ b/internal/cmd/ske/options/machine_types/machine_types_test.go @@ -0,0 +1,211 @@ +package machine_types + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Region = "" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + inputModel *inputModel + expectedRequest ske.ApiListProviderOptionsRequest + }{ + { + description: "base", + inputModel: fixtureInputModel(), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient, tt.inputModel) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + options *ske.ProviderOptions + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + }, + wantErr: true, + }, + { + name: "empty input model", + args: args{ + model: &inputModel{}, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "set model and options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "empty values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + MachineTypes: &[]ske.MachineType{}, + }, + }, + wantErr: false, + }, + { + name: "empty value in values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + MachineTypes: &[]ske.MachineType{{}}, + }, + }, + wantErr: false, + }, + { + name: "valid values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + MachineTypes: &[]ske.MachineType{ + { + Architecture: utils.Ptr("amd64"), + Cpu: utils.Ptr(int64(2)), + Gpu: utils.Ptr(int64(0)), + Memory: utils.Ptr(int64(16)), + Name: utils.Ptr("type1"), + }, + { + Architecture: utils.Ptr("amd64"), + Cpu: utils.Ptr(int64(2)), + Gpu: utils.Ptr(int64(0)), + Memory: utils.Ptr(int64(16)), + Name: utils.Ptr("type2"), + }, + }, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 21f04d028..7038cee7f 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -7,11 +7,15 @@ import ( "strings" "time" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options/availability_zones" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options/kubernetes_versions" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options/machine_images" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options/machine_types" + "github.com/stackitcloud/stackit-cli/internal/cmd/ske/options/volume_types" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" - "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -30,7 +34,7 @@ const ( ) type inputModel struct { - *globalflags.GlobalFlagModel + globalflags.GlobalFlagModel AvailabilityZones bool KubernetesVersions bool MachineImages bool @@ -42,23 +46,15 @@ func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "options", Short: "Lists SKE provider options", - Long: fmt.Sprintf("%s\n%s", + Long: fmt.Sprintf("%s\n%s\n%s", + "Command \"options\" is deprecated, use the subcommands instead.", "Lists STACKIT Kubernetes Engine (SKE) provider options (availability zones, Kubernetes versions, machine images and types, volume types).", "Pass one or more flags to filter what categories are shown.", ), Args: args.NoArgs, - Example: examples.Build( - examples.NewExample( - `List SKE options for all categories`, - "$ stackit ske options"), - examples.NewExample( - `List SKE options regarding Kubernetes versions only`, - "$ stackit ske options --kubernetes-versions"), - examples.NewExample( - `List SKE options regarding Kubernetes versions and machine images`, - "$ stackit ske options --kubernetes-versions --machine-images"), - ), RunE: func(cmd *cobra.Command, args []string) error { + params.Printer.Info("Command \"options\" is deprecated, use the subcommands instead.\n") + ctx := context.Background() model, err := parseInput(params.Printer, cmd, args) if err != nil { @@ -82,15 +78,30 @@ func NewCmd(params *types.CmdParams) *cobra.Command { }, } configureFlags(cmd) + addSubcommands(cmd, params) return cmd } +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(availability_zones.NewCmd(params)) + cmd.AddCommand(kubernetes_versions.NewCmd(params)) + cmd.AddCommand(machine_images.NewCmd(params)) + cmd.AddCommand(machine_types.NewCmd(params)) + cmd.AddCommand(volume_types.NewCmd(params)) +} + func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(availabilityZonesFlag, false, "Lists availability zones") cmd.Flags().Bool(kubernetesVersionsFlag, false, "Lists supported kubernetes versions") cmd.Flags().Bool(machineImagesFlag, false, "Lists supported machine images") cmd.Flags().Bool(machineTypesFlag, false, "Lists supported machine types") cmd.Flags().Bool(volumeTypesFlag, false, "Lists supported volume types") + + cobra.CheckErr(cmd.Flags().MarkDeprecated(availabilityZonesFlag, "This flag is deprecated and will be removed on 2026-09-26. Use the availability-zone subcommand instead.")) + cobra.CheckErr(cmd.Flags().MarkDeprecated(kubernetesVersionsFlag, "This flag is deprecated and will be removed on 2026-09-26. Use the kubernetes-versions subcommand instead.")) + cobra.CheckErr(cmd.Flags().MarkDeprecated(machineImagesFlag, "This flag is deprecated and will be removed on 2026-09-26. Use the machine-images subcommand instead.")) + cobra.CheckErr(cmd.Flags().MarkDeprecated(machineTypesFlag, "This flag is deprecated and will be removed on 2026-09-26. Use the machine-types subcommand instead.")) + cobra.CheckErr(cmd.Flags().MarkDeprecated(volumeTypesFlag, "This flag is deprecated and will be removed on 2026-09-26. Use the volume-types subcommand instead.")) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { @@ -111,7 +122,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } model := inputModel{ - GlobalFlagModel: globalFlags, + GlobalFlagModel: utils.PtrValue(globalFlags), AvailabilityZones: availabilityZones, KubernetesVersions: kubernetesVersions, MachineImages: machineImages, @@ -129,7 +140,7 @@ func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputMod } func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOptions) error { - if model == nil || model.GlobalFlagModel == nil { + if model == nil { return fmt.Errorf("model is nil") } else if options == nil { return fmt.Errorf("options is nil") diff --git a/internal/cmd/ske/options/options_test.go b/internal/cmd/ske/options/options_test.go index 43f58c5b4..2fe568f2a 100644 --- a/internal/cmd/ske/options/options_test.go +++ b/internal/cmd/ske/options/options_test.go @@ -39,7 +39,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st func fixtureInputModelAllFalse(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{Region: testRegion, Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: globalflags.GlobalFlagModel{Region: testRegion, Verbosity: globalflags.VerbosityDefault}, AvailabilityZones: false, KubernetesVersions: false, MachineImages: false, @@ -54,7 +54,7 @@ func fixtureInputModelAllFalse(mods ...func(model *inputModel)) *inputModel { func fixtureInputModelAllTrue(mods ...func(model *inputModel)) *inputModel { model := &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{Region: testRegion, Verbosity: globalflags.VerbosityDefault}, + GlobalFlagModel: globalflags.GlobalFlagModel{Region: testRegion, Verbosity: globalflags.VerbosityDefault}, AvailabilityZones: true, KubernetesVersions: true, MachineImages: true, @@ -187,24 +187,24 @@ func TestOutputResult(t *testing.T) { name: "missing options", args: args{ model: &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{}, + GlobalFlagModel: globalflags.GlobalFlagModel{}, }, }, wantErr: true, }, { - name: "missing global flags in model", + name: "empty input model", args: args{ model: &inputModel{}, options: &ske.ProviderOptions{}, }, - wantErr: true, + wantErr: false, }, { name: "set model and options", args: args{ model: &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{}, + GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{}, }, diff --git a/internal/cmd/ske/options/volume_types/volume_types.go b/internal/cmd/ske/options/volume_types/volume_types.go new file mode 100644 index 000000000..8d3983487 --- /dev/null +++ b/internal/cmd/ske/options/volume_types/volume_types.go @@ -0,0 +1,103 @@ +package volume_types + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type inputModel struct { + globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "volume-types", + Short: "Lists SKE provider options for volume-types", + Long: "Lists STACKIT Kubernetes Engine (SKE) provider options for volume-types.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List SKE options for volume-types`, + "$ stackit ske options volume-types"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, apiClient, model) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get SKE provider options: %w", err) + } + + return outputResult(params.Printer, model, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := inputModel{ + GlobalFlagModel: utils.PtrValue(globalFlags), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { + req := apiClient.ListProviderOptions(ctx, model.Region) + return req +} + +func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOptions) error { + if options == nil { + return fmt.Errorf("options is nil") + } + + options.AvailabilityZones = nil + options.KubernetesVersions = nil + options.MachineImages = nil + options.MachineTypes = nil + + return p.OutputResult(model.OutputFormat, options, func() error { + volumeTypes := utils.PtrValue(options.VolumeTypes) + + table := tables.NewTable() + table.SetHeader("TYPE") + for i := range volumeTypes { + z := volumeTypes[i] + table.AddRow(utils.PtrString(z.Name)) + } + + err := table.Display(p) + if err != nil { + return fmt.Errorf("display output: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/ske/options/volume_types/volume_types_test.go b/internal/cmd/ske/options/volume_types/volume_types_test.go new file mode 100644 index 000000000..ce37ce498 --- /dev/null +++ b/internal/cmd/ske/options/volume_types/volume_types_test.go @@ -0,0 +1,203 @@ +package volume_types + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-sdk-go/services/ske" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &ske.APIClient{} + +const testRegion = "eu01" + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{ + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Region = "" + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + inputModel *inputModel + expectedRequest ske.ApiListProviderOptionsRequest + }{ + { + description: "base", + inputModel: fixtureInputModel(), + expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, testClient, tt.inputModel) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + options *ske.ProviderOptions + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{}, + wantErr: true, + }, + { + name: "missing options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + }, + wantErr: true, + }, + { + name: "empty input model", + args: args{ + model: &inputModel{}, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "set model and options", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{}, + }, + wantErr: false, + }, + { + name: "empty values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + VolumeTypes: &[]ske.VolumeType{}, + }, + }, + wantErr: false, + }, + { + name: "empty value in values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + VolumeTypes: &[]ske.VolumeType{{}}, + }, + }, + wantErr: false, + }, + { + name: "valid values", + args: args{ + model: &inputModel{ + GlobalFlagModel: globalflags.GlobalFlagModel{}, + }, + options: &ske.ProviderOptions{ + VolumeTypes: &[]ske.VolumeType{ + { + Name: utils.Ptr("type1"), + }, + { + Name: utils.Ptr("type2"), + }, + }, + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.options); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} From b7bad4888afe074248aedb10e6436a7062a8dbe0 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:43:22 +0100 Subject: [PATCH 391/422] chore: enable snapcraft release (#1320) relates to STACKITCLI-330 --- .goreleaser.yaml | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 4e1d779d2..7fb43c81d 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -137,25 +137,24 @@ homebrew_casks: bash: ./completions/stackit.bash fish: ./completions/stackit.fish -# Temporary disable snap release, see https://jira.schwarz/browse/STACKITCLI-330 -# snapcrafts: -# # IDs of the builds for which to create packages for -# - ids: -# - linux-builds -# # The name of the snap -# name: stackit -# # The canonical title of the application, displayed in the software -# # centre graphical frontends -# title: STACKIT CLI -# summary: A command-line interface to manage STACKIT resources. -# description: "A command-line interface to manage STACKIT resources." -# license: Apache-2.0 -# confinement: classic -# # Grade "devel" will only release to `edge` and `beta` channels -# # Grade "stable" will also release to the `candidate` and `stable` channels -# grade: stable -# # Whether to publish the Snap to the store -# publish: true +snapcrafts: + # IDs of the builds for which to create packages for + - ids: + - linux-builds + # The name of the snap + name: stackit + # The canonical title of the application, displayed in the software + # centre graphical frontends + title: STACKIT CLI + summary: A command-line interface to manage STACKIT resources. + description: "A command-line interface to manage STACKIT resources." + license: Apache-2.0 + confinement: classic + # Grade "devel" will only release to `edge` and `beta` channels + # Grade "stable" will also release to the `candidate` and `stable` channels + grade: stable + # Whether to publish the Snap to the store + publish: true winget: - name: stackit From 3b70f97c799f966b2fe14b4321125a4696bfec5f Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Tue, 3 Mar 2026 17:21:07 +0100 Subject: [PATCH 392/422] feat(config) allow setting assume-yes in config (#1324) * feat(config) allow setting assume-yes in config fixes https://github.com/stackitcloud/stackit-cli/issues/1212 related: STACKITCLI-327 kubectl calls stackit-cli for auth. To enable e2e tests for this ske feature, it would be nice to save assume-yes to the config. * fix(config) use `_` for unused params * fix(config) add assume-yes to unset_test --- docs/stackit_config_unset.md | 7 +------ internal/cmd/config/unset/unset.go | 7 +++++++ internal/cmd/config/unset/unset_test.go | 3 +++ internal/pkg/config/config.go | 3 +++ internal/pkg/globalflags/global_flags.go | 8 ++++++-- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/docs/stackit_config_unset.md b/docs/stackit_config_unset.md index 4f0f7f229..d76f3068c 100644 --- a/docs/stackit_config_unset.md +++ b/docs/stackit_config_unset.md @@ -27,6 +27,7 @@ stackit config unset [flags] ``` --allowed-url-domain Domain name, used for the verification of the URLs that are given in the IDP endpoint and curl commands. If unset, defaults to stackit.cloud + --assume-yes If set, skips all confirmation prompts --async Configuration option to run commands asynchronously --authorization-custom-endpoint Authorization API base URL. If unset, uses the default base URL --cdn-custom-endpoint Custom CDN endpoint URL. If unset, uses the default base URL @@ -67,12 +68,6 @@ stackit config unset [flags] --verbosity Verbosity of the CLI ``` -### Options inherited from parent commands - -``` - -y, --assume-yes If set, skips all confirmation prompts -``` - ### SEE ALSO * [stackit config](./stackit_config.md) - Provides functionality for CLI configuration options diff --git a/internal/cmd/config/unset/unset.go b/internal/cmd/config/unset/unset.go index bf63e4474..ad57f8113 100644 --- a/internal/cmd/config/unset/unset.go +++ b/internal/cmd/config/unset/unset.go @@ -22,6 +22,7 @@ const ( projectIdFlag = globalflags.ProjectIdFlag regionFlag = globalflags.RegionFlag verbosityFlag = globalflags.VerbosityFlag + assumeYesFlag = globalflags.AssumeYesFlag sessionTimeLimitFlag = "session-time-limit" identityProviderCustomWellKnownConfigurationFlag = "identity-provider-custom-well-known-configuration" @@ -65,6 +66,7 @@ type inputModel struct { ProjectId bool Region bool Verbosity bool + AssumeYes bool SessionTimeLimit bool IdentityProviderCustomEndpoint bool @@ -137,6 +139,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.Verbosity { viper.Set(config.VerbosityKey, globalflags.VerbosityDefault) } + if model.AssumeYes { + viper.Set(config.AssumeYesKey, config.AssumeYesDefault) + } if model.SessionTimeLimit { viper.Set(config.SessionTimeLimitKey, config.SessionTimeLimitDefault) @@ -256,6 +261,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(regionFlag, false, "Region") cmd.Flags().Bool(outputFormatFlag, false, "Output format") cmd.Flags().Bool(verbosityFlag, false, "Verbosity of the CLI") + cmd.Flags().Bool(assumeYesFlag, false, "If set, skips all confirmation prompts") cmd.Flags().Bool(sessionTimeLimitFlag, false, fmt.Sprintf("Maximum time before authentication is required again. If unset, defaults to %s", config.SessionTimeLimitDefault)) cmd.Flags().Bool(identityProviderCustomWellKnownConfigurationFlag, false, "Identity Provider well-known OpenID configuration URL. If unset, uses the default identity provider") @@ -300,6 +306,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command) *inputModel { ProjectId: flags.FlagToBoolValue(p, cmd, projectIdFlag), Region: flags.FlagToBoolValue(p, cmd, regionFlag), Verbosity: flags.FlagToBoolValue(p, cmd, verbosityFlag), + AssumeYes: flags.FlagToBoolValue(p, cmd, assumeYesFlag), SessionTimeLimit: flags.FlagToBoolValue(p, cmd, sessionTimeLimitFlag), IdentityProviderCustomEndpoint: flags.FlagToBoolValue(p, cmd, identityProviderCustomWellKnownConfigurationFlag), diff --git a/internal/cmd/config/unset/unset_test.go b/internal/cmd/config/unset/unset_test.go index dda5dcaee..49b6160f8 100644 --- a/internal/cmd/config/unset/unset_test.go +++ b/internal/cmd/config/unset/unset_test.go @@ -17,6 +17,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]bool)) map[string]bool outputFormatFlag: true, projectIdFlag: true, verbosityFlag: true, + assumeYesFlag: true, sessionTimeLimitFlag: true, identityProviderCustomWellKnownConfigurationFlag: true, @@ -62,6 +63,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { OutputFormat: true, ProjectId: true, Verbosity: true, + AssumeYes: true, SessionTimeLimit: true, IdentityProviderCustomEndpoint: true, @@ -123,6 +125,7 @@ func TestParseInput(t *testing.T) { model.OutputFormat = false model.ProjectId = false model.Verbosity = false + model.AssumeYes = false model.SessionTimeLimit = false model.IdentityProviderCustomEndpoint = false diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index e8532775f..638207898 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -17,6 +17,7 @@ const ( RegionKey = "region" SessionTimeLimitKey = "session_time_limit" VerbosityKey = "verbosity" + AssumeYesKey = "assume_yes" IdentityProviderCustomWellKnownConfigurationKey = "identity_provider_custom_well_known_configuration" IdentityProviderCustomClientIdKey = "identity_provider_custom_client_id" @@ -58,6 +59,7 @@ const ( DefaultProfileName = "default" AsyncDefault = false + AssumeYesDefault = false RegionDefault = "eu01" SessionTimeLimitDefault = "12h" @@ -82,6 +84,7 @@ var ConfigKeys = []string{ RegionKey, SessionTimeLimitKey, VerbosityKey, + AssumeYesKey, IdentityProviderCustomWellKnownConfigurationKey, IdentityProviderCustomClientIdKey, diff --git a/internal/pkg/globalflags/global_flags.go b/internal/pkg/globalflags/global_flags.go index 9f53ec4f7..63b51c6c8 100644 --- a/internal/pkg/globalflags/global_flags.go +++ b/internal/pkg/globalflags/global_flags.go @@ -60,6 +60,10 @@ func Configure(flagSet *pflag.FlagSet) error { } flagSet.BoolP(AssumeYesFlag, "y", false, "If set, skips all confirmation prompts") + err = viper.BindPFlag(config.AssumeYesKey, flagSet.Lookup(AssumeYesFlag)) + if err != nil { + return fmt.Errorf("bind --%s flag to config: %w", AssumeYesFlag, err) + } flagSet.Var(flags.EnumFlag(true, VerbosityDefault, verbosityFlagOptions...), VerbosityFlag, fmt.Sprintf("Verbosity of the CLI, one of %q", verbosityFlagOptions)) err = viper.BindPFlag(config.VerbosityKey, flagSet.Lookup(VerbosityFlag)) @@ -76,10 +80,10 @@ func Configure(flagSet *pflag.FlagSet) error { return nil } -func Parse(p *print.Printer, cmd *cobra.Command) *GlobalFlagModel { +func Parse(_ *print.Printer, _ *cobra.Command) *GlobalFlagModel { return &GlobalFlagModel{ Async: viper.GetBool(config.AsyncKey), - AssumeYes: flags.FlagToBoolValue(p, cmd, AssumeYesFlag), + AssumeYes: viper.GetBool(config.AssumeYesKey), OutputFormat: viper.GetString(config.OutputFormatKey), ProjectId: viper.GetString(config.ProjectIdKey), Region: viper.GetString(config.RegionKey), From e4f9591906f258842adb2cff6e87b7f0ff5dfa1d Mon Sep 17 00:00:00 2001 From: Michael Eischer <9106997+MichaelEischer@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:35:55 +0100 Subject: [PATCH 393/422] feat(ske): implement idp flow for kubeconfig login (#1322) * extract kubeconfig certificate validation * simplify kubeconfig retrieval * extract kubeconfig retrieval * reorder imports * Split kubeconfig retrieval and output * replace hardcoded timeout with constant * implement kubeconfig login --idp flow * Add tests * fix test failure if KUBECONFIG environment variable is set * make retrieval of idp well known config reusable * optionally initialize IDP_TOKEN_ENDPOINT auth field for service accounts When activating a service account, clear a possibly stale old value. Add a separate method to allow commands to request the initialization of the IDP_TOKEN_ENDPOINT auth field. * refactor token exchange into auth package --- docs/stackit_ske_kubeconfig_login.md | 10 +- internal/cmd/ske/kubeconfig/login/login.go | 314 +++++++++++++----- .../cmd/ske/kubeconfig/login/login_test.go | 75 ++++- internal/pkg/auth/auth.go | 15 + internal/pkg/auth/exchange.go | 90 +++++ internal/pkg/auth/exchange_test.go | 187 +++++++++++ internal/pkg/auth/service_account.go | 2 + internal/pkg/auth/user_login.go | 63 +--- internal/pkg/auth/user_login_test.go | 84 ----- internal/pkg/auth/user_token_flow.go | 24 +- internal/pkg/auth/utils.go | 71 ++++ internal/pkg/auth/utils_test.go | 82 +++++ internal/pkg/services/ske/utils/utils_test.go | 2 + 13 files changed, 772 insertions(+), 247 deletions(-) create mode 100644 internal/pkg/auth/exchange.go create mode 100644 internal/pkg/auth/exchange_test.go diff --git a/docs/stackit_ske_kubeconfig_login.md b/docs/stackit_ske_kubeconfig_login.md index 0b5441533..2b9956717 100644 --- a/docs/stackit_ske_kubeconfig_login.md +++ b/docs/stackit_ske_kubeconfig_login.md @@ -5,8 +5,8 @@ Login plugin for kubernetes clients ### Synopsis Login plugin for kubernetes clients, that creates short-lived credentials to authenticate against a STACKIT Kubernetes Engine (SKE) cluster. -First you need to obtain a kubeconfig for use with the login command (first example). -Secondly you use the kubeconfig with your chosen Kubernetes client (second example), the client will automatically retrieve the credentials via the STACKIT CLI. +First you need to obtain a kubeconfig for use with the login command (first or second example). +Secondly you use the kubeconfig with your chosen Kubernetes client (third example), the client will automatically retrieve the credentials via the STACKIT CLI. ``` stackit ske kubeconfig login [flags] @@ -15,9 +15,12 @@ stackit ske kubeconfig login [flags] ### Examples ``` - Get a login kubeconfig for the SKE cluster with name "my-cluster". This kubeconfig does not contain any credentials and instead obtains valid credentials via the `stackit ske kubeconfig login` command. + Get an admin, login kubeconfig for the SKE cluster with name "my-cluster". This kubeconfig does not contain any credentials and instead obtains valid admin credentials via the `stackit ske kubeconfig login` command. $ stackit ske kubeconfig create my-cluster --login + Get an IDP kubeconfig for the SKE cluster with name "my-cluster". This kubeconfig does not contain any credentials and instead obtains valid credentials via the `stackit ske kubeconfig login` command. + $ stackit ske kubeconfig create my-cluster --idp + Use the previously saved kubeconfig to authenticate to the SKE cluster, in this case with kubectl. $ kubectl cluster-info $ kubectl get pods @@ -27,6 +30,7 @@ stackit ske kubeconfig login [flags] ``` -h, --help Help for "stackit ske kubeconfig login" + --idp Use the STACKIT IdP for authentication to the cluster. ``` ### Options inherited from parent commands diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index 711ad56bd..fcd121bc9 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -8,34 +8,38 @@ import ( "encoding/pem" "errors" "fmt" + "net/http" "os" "strconv" "time" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" - - "github.com/stackitcloud/stackit-cli/internal/pkg/cache" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/spf13/cobra" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes/scheme" + clientauthenticationv1 "k8s.io/client-go/pkg/apis/clientauthentication/v1" "k8s.io/client-go/rest" + "k8s.io/client-go/tools/auth/exec" + "k8s.io/client-go/tools/clientcmd" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" + "github.com/stackitcloud/stackit-cli/internal/pkg/cache" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" - - "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-sdk-go/services/ske" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/scheme" - clientauthenticationv1 "k8s.io/client-go/pkg/apis/clientauthentication/v1" - "k8s.io/client-go/tools/auth/exec" - "k8s.io/client-go/tools/clientcmd" ) const ( - expirationSeconds = 30 * 60 // 30 min - refreshBeforeDuration = 15 * time.Minute // 15 min + expirationSeconds = 30 * 60 // 30 min + refreshBeforeDuration = 15 * time.Minute // 15 min + refreshTokenBeforeDuration = 5 * time.Minute // 5 min + + idpFlag = "idp" ) func NewCmd(params *types.CmdParams) *cobra.Command { @@ -44,15 +48,19 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Short: "Login plugin for kubernetes clients", Long: fmt.Sprintf("%s\n%s\n%s", "Login plugin for kubernetes clients, that creates short-lived credentials to authenticate against a STACKIT Kubernetes Engine (SKE) cluster.", - "First you need to obtain a kubeconfig for use with the login command (first example).", - "Secondly you use the kubeconfig with your chosen Kubernetes client (second example), the client will automatically retrieve the credentials via the STACKIT CLI.", + "First you need to obtain a kubeconfig for use with the login command (first or second example).", + "Secondly you use the kubeconfig with your chosen Kubernetes client (third example), the client will automatically retrieve the credentials via the STACKIT CLI.", ), Args: args.NoArgs, Example: examples.Build( examples.NewExample( - `Get a login kubeconfig for the SKE cluster with name "my-cluster". `+ - "This kubeconfig does not contain any credentials and instead obtains valid credentials via the `stackit ske kubeconfig login` command.", + `Get an admin, login kubeconfig for the SKE cluster with name "my-cluster". `+ + "This kubeconfig does not contain any credentials and instead obtains valid admin credentials via the `stackit ske kubeconfig login` command.", "$ stackit ske kubeconfig create my-cluster --login"), + examples.NewExample( + `Get an IDP kubeconfig for the SKE cluster with name "my-cluster". `+ + "This kubeconfig does not contain any credentials and instead obtains valid credentials via the `stackit ske kubeconfig login` command.", + "$ stackit ske kubeconfig create my-cluster --idp"), examples.NewExample( "Use the previously saved kubeconfig to authenticate to the SKE cluster, in this case with kubectl.", "$ kubectl cluster-info", @@ -72,64 +80,55 @@ func NewCmd(params *types.CmdParams) *cobra.Command { "See `stackit ske kubeconfig login --help` for detailed usage instructions.") } - clusterConfig, err := parseClusterConfig(params.Printer, cmd) + idpMode := flags.FlagToBoolValue(params.Printer, cmd, idpFlag) + clusterConfig, err := parseClusterConfig(params.Printer, cmd, idpMode) if err != nil { return fmt.Errorf("parseClusterConfig: %w", err) } + if idpMode { + accessToken, err := getAccessToken(params) + if err != nil { + return err + } + idpClient := &http.Client{} + token, err := retrieveTokenFromIDP(ctx, idpClient, accessToken, clusterConfig) + if err != nil { + return err + } + return outputTokenKubeconfig(params.Printer, clusterConfig.cacheKey, token) + } + // Configure API client apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) if err != nil { return err } - - cachedKubeconfig := getCachedKubeConfig(clusterConfig.cacheKey) - - if cachedKubeconfig == nil { - return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) - } - - certPem, _ := pem.Decode(cachedKubeconfig.CertData) - if certPem == nil { - _ = cache.DeleteObject(clusterConfig.cacheKey) - return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) - } - - certificate, err := x509.ParseCertificate(certPem.Bytes) + kubeconfig, err := retrieveLoginKubeconfig(ctx, apiClient, clusterConfig) if err != nil { - _ = cache.DeleteObject(clusterConfig.cacheKey) - return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) - } - - // cert is expired, request new - if time.Now().After(certificate.NotAfter.UTC()) { - _ = cache.DeleteObject(clusterConfig.cacheKey) - return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, false, nil) - } - // cert expires within the next 15min, refresh (try to get a new, use cache on failure) - if time.Now().Add(refreshBeforeDuration).After(certificate.NotAfter.UTC()) { - return GetAndOutputKubeconfig(ctx, params.Printer, apiClient, clusterConfig, true, cachedKubeconfig) - } - - // cert not expired, nor will it expire in the next 15min; therefore, use the cached kubeconfig - if err := output(params.Printer, clusterConfig.cacheKey, cachedKubeconfig); err != nil { return err } - return nil + return outputLoginKubeconfig(params.Printer, clusterConfig.cacheKey, kubeconfig) }, } + configureFlags(cmd) return cmd } +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Bool(idpFlag, false, "Use the STACKIT IdP for authentication to the cluster.") +} + type clusterConfig struct { STACKITProjectID string `json:"stackitProjectID"` ClusterName string `json:"clusterName"` Region string `json:"region"` + OrganizationID string `json:"organizationID"` cacheKey string } -func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, error) { +func parseClusterConfig(p *print.Printer, cmd *cobra.Command, idpMode bool) (*clusterConfig, error) { obj, _, err := exec.LoadExecCredentialFromEnv() if err != nil { return nil, fmt.Errorf("LoadExecCredentialFromEnv: %w", err) @@ -161,8 +160,11 @@ func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, e if err != nil { return nil, fmt.Errorf("error getting auth email: %w", err) } - - clusterConfig.cacheKey = fmt.Sprintf("ske-login-%x", sha256.Sum256([]byte(execCredential.Spec.Cluster.Server+"\x00"+authEmail))) + idpSuffix := "" + if idpMode { + idpSuffix = "\x00idp" + } + clusterConfig.cacheKey = fmt.Sprintf("ske-login-%x", sha256.Sum256([]byte(execCredential.Spec.Cluster.Server+"\x00"+authEmail+idpSuffix))) // NOTE: Fallback if region is not set in the kubeconfig (this was the case in the past) if clusterConfig.Region == "" { @@ -172,6 +174,30 @@ func parseClusterConfig(p *print.Printer, cmd *cobra.Command) (*clusterConfig, e return clusterConfig, nil } +func retrieveLoginKubeconfig(ctx context.Context, apiClient *ske.APIClient, clusterConfig *clusterConfig) (*rest.Config, error) { + cachedKubeconfig := getCachedKubeConfig(clusterConfig.cacheKey) + if cachedKubeconfig == nil { + return requestNewLoginKubeconfig(ctx, apiClient, clusterConfig) + } + + isValid, notAfter := checkKubeconfigExpiry(cachedKubeconfig.CertData) + if !isValid { + // cert is expired or invalid, request new + _ = cache.DeleteObject(clusterConfig.cacheKey) + return requestNewLoginKubeconfig(ctx, apiClient, clusterConfig) + } else if time.Now().Add(refreshBeforeDuration).After(notAfter.UTC()) { + // cert expires within the next 15min -> refresh + kubeconfig, err := requestNewLoginKubeconfig(ctx, apiClient, clusterConfig) + // try to get a new one but use cache on failure + if err != nil { + return cachedKubeconfig, nil + } + return kubeconfig, nil + } + // cert not expired, nor will it expire in the next 15min; therefore, use the cached kubeconfig + return cachedKubeconfig, nil +} + func getCachedKubeConfig(key string) *rest.Config { cachedKubeconfig, err := cache.GetObject(key) if err != nil { @@ -186,63 +212,64 @@ func getCachedKubeConfig(key string) *rest.Config { return restConfig } -func GetAndOutputKubeconfig(ctx context.Context, p *print.Printer, apiClient *ske.APIClient, clusterConfig *clusterConfig, fallbackToCache bool, cachedKubeconfig *rest.Config) error { - req := buildRequest(ctx, apiClient, clusterConfig) - kubeconfigResponse, err := req.Execute() +func checkKubeconfigExpiry(certData []byte) (bool, time.Time) { + certPem, _ := pem.Decode(certData) + if certPem == nil { + return false, time.Time{} + } + + certificate, err := x509.ParseCertificate(certPem.Bytes) if err != nil { - if fallbackToCache { - return output(p, clusterConfig.cacheKey, cachedKubeconfig) - } - return fmt.Errorf("request kubeconfig: %w", err) + return false, time.Time{} + } + + // cert is expired + if time.Now().After(certificate.NotAfter.UTC()) { + return false, time.Time{} } + return true, certificate.NotAfter.UTC() +} +func requestNewLoginKubeconfig(ctx context.Context, apiClient *ske.APIClient, clusterConfig *clusterConfig) (*rest.Config, error) { + req := buildLoginKubeconfigRequest(ctx, apiClient, clusterConfig) + kubeconfigResponse, err := req.Execute() + if err != nil { + return nil, fmt.Errorf("request kubeconfig: %w", err) + } kubeconfig, err := clientcmd.RESTConfigFromKubeConfig([]byte(*kubeconfigResponse.Kubeconfig)) if err != nil { - if fallbackToCache { - return output(p, clusterConfig.cacheKey, cachedKubeconfig) - } - return fmt.Errorf("parse kubeconfig: %w", err) + return nil, fmt.Errorf("parse kubeconfig: %w", err) } if err = cache.PutObject(clusterConfig.cacheKey, []byte(*kubeconfigResponse.Kubeconfig)); err != nil { - if fallbackToCache { - return output(p, clusterConfig.cacheKey, cachedKubeconfig) - } - return fmt.Errorf("cache kubeconfig: %w", err) + return nil, fmt.Errorf("cache kubeconfig: %w", err) } - return output(p, clusterConfig.cacheKey, kubeconfig) + return kubeconfig, nil } -func buildRequest(ctx context.Context, apiClient *ske.APIClient, clusterConfig *clusterConfig) ske.ApiCreateKubeconfigRequest { +func buildLoginKubeconfigRequest(ctx context.Context, apiClient *ske.APIClient, clusterConfig *clusterConfig) ske.ApiCreateKubeconfigRequest { req := apiClient.CreateKubeconfig(ctx, clusterConfig.STACKITProjectID, clusterConfig.Region, clusterConfig.ClusterName) expirationSeconds := strconv.Itoa(expirationSeconds) return req.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{ExpirationSeconds: &expirationSeconds}) } -func output(p *print.Printer, cacheKey string, kubeconfig *rest.Config) error { - if kubeconfig == nil { - _ = cache.DeleteObject(cacheKey) - return errors.New("kubeconfig is nil") - } - - outputExecCredential, err := parseKubeConfigToExecCredential(kubeconfig) +func outputLoginKubeconfig(p *print.Printer, cacheKey string, kubeconfig *rest.Config) error { + output, err := parseLoginKubeConfigToExecCredential(kubeconfig) if err != nil { _ = cache.DeleteObject(cacheKey) return fmt.Errorf("convert to ExecCredential: %w", err) } - output, err := json.Marshal(outputExecCredential) - if err != nil { - _ = cache.DeleteObject(cacheKey) - return fmt.Errorf("marshal ExecCredential: %w", err) - } - p.Outputf("%s", string(output)) return nil } -func parseKubeConfigToExecCredential(kubeconfig *rest.Config) (*clientauthenticationv1.ExecCredential, error) { +func parseLoginKubeConfigToExecCredential(kubeconfig *rest.Config) ([]byte, error) { + if kubeconfig == nil { + return nil, errors.New("kubeconfig is nil") + } + certPem, _ := pem.Decode(kubeconfig.CertData) if certPem == nil { return nil, fmt.Errorf("decoded pem is nil") @@ -259,10 +286,127 @@ func parseKubeConfigToExecCredential(kubeconfig *rest.Config) (*clientauthentica Kind: "ExecCredential", }, Status: &clientauthenticationv1.ExecCredentialStatus{ - ExpirationTimestamp: &v1.Time{Time: certificate.NotAfter.Add(-time.Minute * 15)}, + ExpirationTimestamp: &v1.Time{Time: certificate.NotAfter.Add(-refreshBeforeDuration)}, ClientCertificateData: string(kubeconfig.CertData), ClientKeyData: string(kubeconfig.KeyData), }, } - return &outputExecCredential, nil + + output, err := json.Marshal(outputExecCredential) + if err != nil { + return nil, fmt.Errorf("marshal: %w", err) + } + return output, nil +} + +func getAccessToken(params *types.CmdParams) (string, error) { + userSessionExpired, err := auth.UserSessionExpired() + if err != nil { + return "", err + } + if userSessionExpired { + return "", &cliErr.SessionExpiredError{} + } + + accessToken, err := auth.GetValidAccessToken(params.Printer) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get valid access token: %v", err) + return "", &cliErr.SessionExpiredError{} + } + + err = auth.EnsureIDPTokenEndpoint(params.Printer) + if err != nil { + return "", err + } + + return accessToken, nil +} + +func retrieveTokenFromIDP(ctx context.Context, idpClient *http.Client, accessToken string, clusterConfig *clusterConfig) (string, error) { + resource := resourceForCluster(clusterConfig) + + cachedToken := getCachedToken(clusterConfig.cacheKey) + if cachedToken == "" { + return exchangeAndCacheToken(ctx, idpClient, accessToken, resource, clusterConfig.cacheKey) + } + + expiry, err := auth.TokenExpirationTime(cachedToken) + if err != nil { + // token is expired or invalid, request new + _ = cache.DeleteObject(clusterConfig.cacheKey) + return exchangeAndCacheToken(ctx, idpClient, accessToken, resource, clusterConfig.cacheKey) + } else if time.Now().Add(refreshTokenBeforeDuration).After(expiry) { + // token expires soon -> refresh + token, err := exchangeAndCacheToken(ctx, idpClient, accessToken, resource, clusterConfig.cacheKey) + // try to get a new one but use cache on failure + if err != nil { + return cachedToken, nil + } + return token, nil + } + // cached token is valid and won't expire soon + return cachedToken, nil +} + +func resourceForCluster(config *clusterConfig) string { + return fmt.Sprintf( + "resource://organizations/%s/projects/%s/regions/%s/ske/%s", + config.OrganizationID, + config.STACKITProjectID, + config.Region, + config.ClusterName, + ) +} + +func getCachedToken(key string) string { + token, err := cache.GetObject(key) + if err != nil { + return "" + } + return string(token) +} + +func exchangeAndCacheToken(ctx context.Context, idpClient *http.Client, accessToken, resource, cacheKey string) (string, error) { + clusterToken, err := auth.ExchangeToken(ctx, idpClient, accessToken, resource) + if err != nil { + return "", err + } + if err = cache.PutObject(cacheKey, []byte(clusterToken)); err != nil { + return "", fmt.Errorf("cache token: %w", err) + } + return clusterToken, err +} + +func outputTokenKubeconfig(p *print.Printer, cacheKey, token string) error { + output, err := parseTokenToExecCredential(token) + if err != nil { + _ = cache.DeleteObject(cacheKey) + return fmt.Errorf("convert to ExecCredential: %w", err) + } + + p.Outputf("%s", string(output)) + return nil +} + +func parseTokenToExecCredential(clusterToken string) ([]byte, error) { + expiry, err := auth.TokenExpirationTime(clusterToken) + if err != nil { + return nil, fmt.Errorf("parse auth token for cluster: %w", err) + } + + outputExecCredential := clientauthenticationv1.ExecCredential{ + TypeMeta: v1.TypeMeta{ + APIVersion: clientauthenticationv1.SchemeGroupVersion.String(), + Kind: "ExecCredential", + }, + Status: &clientauthenticationv1.ExecCredentialStatus{ + ExpirationTimestamp: &v1.Time{Time: expiry.Add(-refreshTokenBeforeDuration)}, + Token: clusterToken, + }, + } + output, err := json.Marshal(&outputExecCredential) + if err != nil { + return nil, fmt.Errorf("marshal: %w", err) + } + return output, nil } diff --git a/internal/cmd/ske/kubeconfig/login/login_test.go b/internal/cmd/ske/kubeconfig/login/login_test.go index ce22fbc1f..4f2fc4a3a 100644 --- a/internal/cmd/ske/kubeconfig/login/login_test.go +++ b/internal/cmd/ske/kubeconfig/login/login_test.go @@ -2,9 +2,11 @@ package login import ( "context" + "encoding/json" "testing" "time" + "github.com/golang-jwt/jwt/v5" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -21,6 +23,7 @@ var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") var testClient = &ske.APIClient{} var testProjectId = uuid.NewString() var testClusterName = "cluster" +var testOrganization = uuid.NewString() const testRegion = "eu01" @@ -30,6 +33,7 @@ func fixtureClusterConfig(mods ...func(clusterConfig *clusterConfig)) *clusterCo ClusterName: testClusterName, cacheKey: "", Region: testRegion, + OrganizationID: testOrganization, } for _, mod := range mods { mod(clusterConfig) @@ -37,7 +41,7 @@ func fixtureClusterConfig(mods ...func(clusterConfig *clusterConfig)) *clusterCo return clusterConfig } -func fixtureRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.ApiCreateKubeconfigRequest { +func fixtureLoginRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.ApiCreateKubeconfigRequest { request := testClient.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) request = request.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{}) for _, mod := range mods { @@ -55,14 +59,14 @@ func TestBuildRequest(t *testing.T) { { description: "expiration time", clusterConfig: fixtureClusterConfig(), - expectedRequest: fixtureRequest().CreateKubeconfigPayload(ske.CreateKubeconfigPayload{ + expectedRequest: fixtureLoginRequest().CreateKubeconfigPayload(ske.CreateKubeconfigPayload{ ExpirationSeconds: utils.Ptr("1800")}), }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, testClient, tt.clusterConfig) + request := buildLoginKubeconfigRequest(testCtx, testClient, tt.clusterConfig) diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), @@ -127,17 +131,78 @@ zbRjZmli7cnenEnfnNoFIGbgkbjGXRUCIC5zFtWXFK7kA+B2vDxD0DlLcQodNwi4 for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - execCredential, err := parseKubeConfigToExecCredential(tt.kubeconfig) + execCredential, err := parseLoginKubeConfigToExecCredential(tt.kubeconfig) if err != nil { t.Fatalf("func returned error: %s", err) } if execCredential == nil { t.Fatal("execCredential is nil") } - diff := cmp.Diff(execCredential, tt.expectedExecCredentialRequest) + expected, _ := json.Marshal(tt.expectedExecCredentialRequest) + diff := cmp.Diff(execCredential, expected) if diff != "" { t.Fatalf("Data does not match: %s", diff) } }) } } + +func TestParseTokenToExecCredential(t *testing.T) { + expirationTime := time.Now().Add(30 * time.Minute) + expectedTime := expirationTime.Add(-5 * time.Minute) + token, err := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.RegisteredClaims{ + ExpiresAt: jwt.NewNumericDate(expirationTime), + }).SigningString() + if err != nil { + t.Fatalf("token generation failed: %v", err) + } + token += ".signatureAAA" + + tests := []struct { + description string + token string + expectedExecCredentialRequest *clientauthenticationv1.ExecCredential + }{ + { + description: "expiration time", + token: token, + expectedExecCredentialRequest: &clientauthenticationv1.ExecCredential{ + TypeMeta: v1.TypeMeta{ + APIVersion: clientauthenticationv1.SchemeGroupVersion.String(), + Kind: "ExecCredential", + }, + Status: &clientauthenticationv1.ExecCredentialStatus{ + ExpirationTimestamp: &v1.Time{Time: expectedTime}, + Token: token, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + execCredential, err := parseTokenToExecCredential(tt.token) + if err != nil { + t.Fatalf("func returned error: %s", err) + } + if execCredential == nil { + t.Fatal("execCredential is nil") + } + expected, _ := json.Marshal(tt.expectedExecCredentialRequest) + diff := cmp.Diff(execCredential, expected) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestResourceForCluster(t *testing.T) { + cc := fixtureClusterConfig() + resource := resourceForCluster(cc) + // somewhat redundant, but the resource string must not change unexpectedly + expectedResource := "resource://organizations/" + testOrganization + "/projects/" + testProjectId + "/regions/" + testRegion + "/ske/" + testClusterName + if resource != expectedResource { + t.Fatalf("unexpected resource, got %v expected %v", resource, expectedResource) + } +} diff --git a/internal/pkg/auth/auth.go b/internal/pkg/auth/auth.go index dd56536d3..07716478d 100644 --- a/internal/pkg/auth/auth.go +++ b/internal/pkg/auth/auth.go @@ -216,3 +216,18 @@ func GetValidAccessToken(p *print.Printer) (string, error) { // Return the new access token return utf.accessToken, nil } + +// EnsureIDPTokenEndpoint ensures that the `IDP_TOKEN_ENDPOINT` auth field is set. +// This field is by default only initialized for user accounts. Call this method to also +// initialize it for service accounts. +func EnsureIDPTokenEndpoint(p *print.Printer) error { + idpTokenEndpoint, err := GetAuthField(IDP_TOKEN_ENDPOINT) + if err != nil { + return fmt.Errorf("failed to check idp token endpoint configuration value: %w", err) + } + if idpTokenEndpoint == "" { + _, err := retrieveIDPWellKnownConfig(p) + return err + } + return nil +} diff --git a/internal/pkg/auth/exchange.go b/internal/pkg/auth/exchange.go new file mode 100644 index 000000000..0c005d237 --- /dev/null +++ b/internal/pkg/auth/exchange.go @@ -0,0 +1,90 @@ +package auth + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "strings" +) + +func ExchangeToken(ctx context.Context, idpClient *http.Client, accessToken, resource string) (string, error) { + tokenEndpoint, err := GetAuthField(IDP_TOKEN_ENDPOINT) + if err != nil { + return "", fmt.Errorf("get idp token endpoint: %w", err) + } + + req, err := buildRequestToExchangeTokens(ctx, tokenEndpoint, accessToken, resource) + if err != nil { + return "", fmt.Errorf("build request: %w", err) + } + resp, err := idpClient.Do(req) + if err != nil { + return "", fmt.Errorf("call API: %w", err) + } + defer func() { + tempErr := resp.Body.Close() + if tempErr != nil { + err = fmt.Errorf("close response body: %w", tempErr) + } + }() + + clusterToken, err := parseTokenExchangeResponse(resp) + if err != nil { + return "", fmt.Errorf("parse API response: %w", err) + } + return clusterToken, nil +} + +func buildRequestToExchangeTokens(ctx context.Context, tokenEndpoint, accessToken, resource string) (*http.Request, error) { + idpClientID, err := getIDPClientID() + if err != nil { + return nil, err + } + + form := url.Values{} + form.Set("grant_type", "urn:ietf:params:oauth:grant-type:token-exchange") + form.Set("client_id", idpClientID) + form.Set("subject_token_type", "urn:ietf:params:oauth:token-type:access_token") + form.Set("requested_token_type", "urn:ietf:params:oauth:token-type:id_token") + form.Set("scope", "openid profile email groups") + form.Set("subject_token", accessToken) + form.Set("resource", resource) + + req, err := http.NewRequestWithContext( + ctx, + http.MethodPost, + tokenEndpoint, + strings.NewReader(form.Encode()), + ) + if err != nil { + return nil, fmt.Errorf("build exchange request: %w", err) + } + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + return req, nil +} + +func parseTokenExchangeResponse(resp *http.Response) (accessToken string, err error) { + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return "", fmt.Errorf("read body: %w", err) + } + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("non-OK %d status: %s", resp.StatusCode, string(respBody)) + } + + respContent := struct { + AccessToken string `json:"access_token"` + }{} + err = json.Unmarshal(respBody, &respContent) + if err != nil { + return "", fmt.Errorf("unmarshal body: %w", err) + } + if respContent.AccessToken == "" { + return "", fmt.Errorf("no access token found") + } + return respContent.AccessToken, nil +} diff --git a/internal/pkg/auth/exchange_test.go b/internal/pkg/auth/exchange_test.go new file mode 100644 index 000000000..77d49ac3b --- /dev/null +++ b/internal/pkg/auth/exchange_test.go @@ -0,0 +1,187 @@ +package auth + +import ( + "context" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "net/http/httputil" + "net/url" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/uuid" + "github.com/zalando/go-keyring" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + +var testAccessToken = "access-token-test-" + uuid.NewString() +var testExchangedToken = "access-token-exchanged-" + uuid.NewString() +var testExchangeResource = "resource://for/token/exchange" + +func fixtureTokenExchangeRequest(tokenEndpoint string) *http.Request { + form := url.Values{} + form.Set("grant_type", "urn:ietf:params:oauth:grant-type:token-exchange") + form.Set("client_id", "stackit-cli-0000-0000-000000000001") + form.Set("subject_token_type", "urn:ietf:params:oauth:token-type:access_token") + form.Set("requested_token_type", "urn:ietf:params:oauth:token-type:id_token") + form.Set("scope", "openid profile email groups") + form.Set("subject_token", testAccessToken) + form.Set("resource", testExchangeResource) + + req, _ := http.NewRequestWithContext( + testCtx, + http.MethodPost, + tokenEndpoint, + strings.NewReader(form.Encode()), + ) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + return req +} + +func fixtureTokenExchangeResponse() string { + type exchangeReponse struct { + AccessToken string `json:"access_token"` + IssuedTokeType string `json:"issued_token_type"` + TokenType string `json:"token_type"` + } + response, _ := json.Marshal(exchangeReponse{ + AccessToken: testExchangedToken, + IssuedTokeType: "urn:ietf:params:oauth:token-type:id_token", + TokenType: "Bearer", + }) + return string(response) +} + +func TestBuildTokenExchangeRequest(t *testing.T) { + expectedRequest := fixtureTokenExchangeRequest(testTokenEndpoint) + req, err := buildRequestToExchangeTokens(testCtx, testTokenEndpoint, testAccessToken, testExchangeResource) + if err != nil { + t.Fatalf("func returned error: %s", err) + } + // directly using cmp.Diff is not possible, so dump the requests first + expected, err := httputil.DumpRequest(expectedRequest, true) + if err != nil { + t.Fatalf("fail to dump expected: %s", err) + } + actual, err := httputil.DumpRequest(req, true) + if err != nil { + t.Fatalf("fail to dump actual: %s", err) + } + diff := cmp.Diff(actual, expected) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } +} + +func TestParseTokenExchangeResponse(t *testing.T) { + response := fixtureTokenExchangeResponse() + + tests := []struct { + description string + response string + status int + expectError bool + }{ + { + description: "valid response", + response: response, + status: http.StatusOK, + }, + { + description: "error status", + response: response, // valid response to make sure the status code is checked + status: http.StatusForbidden, + expectError: true, + }, + { + description: "error content", + response: "{}", + status: http.StatusOK, + expectError: true, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + w := httptest.NewRecorder() + w.WriteHeader(tt.status) + _, _ = w.WriteString(tt.response) + resp := w.Result() + + defer func() { + tempErr := resp.Body.Close() + if tempErr != nil { + t.Fatalf("failed to close response body: %v", tempErr) + } + }() + accessToken, err := parseTokenExchangeResponse(resp) + if tt.expectError { + if err == nil { + t.Fatal("expected error got nil") + } + } else { + if err != nil { + t.Fatalf("func returned error: %s", err) + } + diff := cmp.Diff(accessToken, testExchangedToken) + if diff != "" { + t.Fatalf("Token does not match: %s", diff) + } + } + }) + } +} + +func TestExchangeToken(t *testing.T) { + var request *http.Request + response := fixtureTokenExchangeResponse() + + handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + // only compare body as the headers will differ + expected, err := io.ReadAll(request.Body) + if err != nil { + t.Errorf("fail to dump expected: %s", err) + } + actual, err := io.ReadAll(req.Body) + if err != nil { + t.Errorf("fail to dump actual: %s", err) + } + diff := cmp.Diff(actual, expected) + if diff != "" { + w.WriteHeader(http.StatusBadRequest) + t.Errorf("request mismatch: %v", diff) + return + } + + w.Header().Set("Content-Type", "application/json") + _, err = w.Write([]byte(response)) + if err != nil { + t.Errorf("Failed to write response: %v", err) + } + }) + server := httptest.NewServer(handler) + defer server.Close() + + request = fixtureTokenExchangeRequest(server.URL) + // use mock keyring to inject the token endpoint URL + keyring.MockInit() + err := SetAuthField(IDP_TOKEN_ENDPOINT, server.URL) + if err != nil { + t.Errorf("failed to inject idp token endpoint: %s", err) + } + + idToken, err := ExchangeToken(testCtx, server.Client(), testAccessToken, testExchangeResource) + if err != nil { + t.Fatalf("func returned error: %s", err) + } + diff := cmp.Diff(idToken, testExchangedToken) + if diff != "" { + t.Fatalf("Exchanged token does not match: %s", diff) + } +} diff --git a/internal/pkg/auth/service_account.go b/internal/pkg/auth/service_account.go index 02449e2cc..8aecaf0b4 100644 --- a/internal/pkg/auth/service_account.go +++ b/internal/pkg/auth/service_account.go @@ -80,6 +80,8 @@ func AuthenticateServiceAccount(p *print.Printer, rt http.RoundTripper, disableW return "", "", fmt.Errorf("compute session expiration timestamp: %w", err) } authFields[SESSION_EXPIRES_AT_UNIX] = sessionExpiresAtUnix + // clear idp token endpoint as it is not set by default for service accounts + authFields[IDP_TOKEN_ENDPOINT] = "" if !disableWriting { err = SetAuthFlow(authFlowType) diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index 054c74c89..e0b35cd49 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -51,23 +51,9 @@ type apiClient interface { // AuthorizeUser implements the PKCE OAuth2 flow. func AuthorizeUser(p *print.Printer, isReauthentication bool) error { - idpWellKnownConfigURL, err := getIDPWellKnownConfigURL() + idpWellKnownConfig, err := retrieveIDPWellKnownConfig(p) if err != nil { - return fmt.Errorf("get IDP well-known configuration: %w", err) - } - if idpWellKnownConfigURL != defaultWellKnownConfig { - p.Warn("You are using a custom identity provider well-known configuration (%s) for authentication.\n", idpWellKnownConfigURL) - err := p.PromptForEnter("Press Enter to proceed with the login...") - if err != nil { - return err - } - } - - p.Debug(print.DebugLevel, "get IDP well-known configuration from %s", idpWellKnownConfigURL) - httpClient := &http.Client{} - idpWellKnownConfig, err := parseWellKnownConfiguration(httpClient, idpWellKnownConfigURL) - if err != nil { - return fmt.Errorf("parse IDP well-known configuration: %w", err) + return err } idpClientID, err := getIDPClientID() @@ -352,48 +338,3 @@ func openBrowser(pageUrl string) error { } return nil } - -// parseWellKnownConfiguration gets the well-known OpenID configuration from the provided URL and returns it as a JSON -// the method also stores the IDP token endpoint in the authentication storage -func parseWellKnownConfiguration(httpClient apiClient, wellKnownConfigURL string) (wellKnownConfig *wellKnownConfig, err error) { - req, _ := http.NewRequest("GET", wellKnownConfigURL, http.NoBody) - res, err := httpClient.Do(req) - if err != nil { - return nil, fmt.Errorf("make the request: %w", err) - } - - // Process the response - defer func() { - closeErr := res.Body.Close() - if closeErr != nil { - err = fmt.Errorf("close response body: %w", closeErr) - } - }() - body, err := io.ReadAll(res.Body) - if err != nil { - return nil, fmt.Errorf("read response body: %w", err) - } - - err = json.Unmarshal(body, &wellKnownConfig) - if err != nil { - return nil, fmt.Errorf("unmarshal response: %w", err) - } - if wellKnownConfig == nil { - return nil, fmt.Errorf("nil well-known configuration response") - } - if wellKnownConfig.Issuer == "" { - return nil, fmt.Errorf("found no issuer") - } - if wellKnownConfig.AuthorizationEndpoint == "" { - return nil, fmt.Errorf("found no authorization endpoint") - } - if wellKnownConfig.TokenEndpoint == "" { - return nil, fmt.Errorf("found no token endpoint") - } - - err = SetAuthField(IDP_TOKEN_ENDPOINT, wellKnownConfig.TokenEndpoint) - if err != nil { - return nil, fmt.Errorf("set token endpoint in the authentication storage: %w", err) - } - return wellKnownConfig, err -} diff --git a/internal/pkg/auth/user_login_test.go b/internal/pkg/auth/user_login_test.go index 7b61a4af5..e6f4bf040 100644 --- a/internal/pkg/auth/user_login_test.go +++ b/internal/pkg/auth/user_login_test.go @@ -5,10 +5,6 @@ import ( "io" "net/http" "strings" - "testing" - - "github.com/google/go-cmp/cmp" - "github.com/zalando/go-keyring" ) type apiClientMocked struct { @@ -28,83 +24,3 @@ func (a *apiClientMocked) Do(_ *http.Request) (*http.Response, error) { Body: io.NopCloser(strings.NewReader(a.getResponse)), }, nil } - -func TestParseWellKnownConfig(t *testing.T) { - tests := []struct { - name string - getFails bool - getResponse string - isValid bool - expected *wellKnownConfig - }{ - { - name: "success", - getFails: false, - getResponse: `{"issuer":"issuer","authorization_endpoint":"auth","token_endpoint":"token"}`, - isValid: true, - expected: &wellKnownConfig{ - Issuer: "issuer", - AuthorizationEndpoint: "auth", - TokenEndpoint: "token", - }, - }, - { - name: "get_fails", - getFails: true, - getResponse: "", - isValid: false, - expected: nil, - }, - { - name: "empty_response", - getFails: true, - getResponse: "", - isValid: false, - expected: nil, - }, - { - name: "missing_issuer", - getFails: true, - getResponse: `{"authorization_endpoint":"auth","token_endpoint":"token"}`, - isValid: false, - expected: nil, - }, - { - name: "missing_authorization", - getFails: true, - getResponse: `{"issuer":"issuer","token_endpoint":"token"}`, - isValid: false, - expected: nil, - }, - { - name: "missing_token", - getFails: true, - getResponse: `{"issuer":"issuer","authorization_endpoint":"auth"}`, - isValid: false, - expected: nil, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - keyring.MockInit() - - testClient := apiClientMocked{ - tt.getFails, - tt.getResponse, - } - - got, err := parseWellKnownConfiguration(&testClient, "") - - if tt.isValid && err != nil { - t.Fatalf("expected no error, got %v", err) - } - if !tt.isValid && err == nil { - t.Fatalf("expected error, got none") - } - - if tt.isValid && !cmp.Equal(*got, *tt.expected) { - t.Fatalf("expected %v, got %v", tt.expected, got) - } - }) - } -} diff --git a/internal/pkg/auth/user_token_flow.go b/internal/pkg/auth/user_token_flow.go index cdb852f77..6fde4706c 100644 --- a/internal/pkg/auth/user_token_flow.go +++ b/internal/pkg/auth/user_token_flow.go @@ -109,22 +109,28 @@ func reauthenticateUser(utf *userTokenFlow) error { return nil } -func TokenExpired(token string) (bool, error) { +func TokenExpirationTime(token string) (time.Time, error) { // We can safely use ParseUnverified because we are not authenticating the user at this point. // We're just checking the expiration time tokenParsed, _, err := jwt.NewParser().ParseUnverified(token, &jwt.RegisteredClaims{}) if err != nil { - return false, fmt.Errorf("parse access token: %w", err) + return time.Time{}, fmt.Errorf("parse access token: %w", err) } expirationTimestampNumeric, err := tokenParsed.Claims.GetExpirationTime() if err != nil { - return false, fmt.Errorf("get expiration timestamp from access token: %w", err) + return time.Time{}, fmt.Errorf("get expiration timestamp from access token: %w", err) } else if expirationTimestampNumeric == nil { - return false, nil + return time.Time{}, nil + } + return expirationTimestampNumeric.Time, nil +} + +func TokenExpired(token string) (bool, error) { + expirationTimestamp, err := TokenExpirationTime(token) + if err != nil || expirationTimestamp.Equal(time.Time{}) { + return false, err } - expirationTimestamp := expirationTimestampNumeric.Time - now := time.Now() - return now.After(expirationTimestamp), nil + return time.Now().After(expirationTimestamp), nil } // Refresh access and refresh tokens using a valid refresh token @@ -177,11 +183,11 @@ func buildRequestToRefreshTokens(utf *userTokenFlow) (*http.Request, error) { utf.tokenEndpoint, strings.NewReader(form.Encode()), ) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - if err != nil { return nil, err } + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + return req, nil } diff --git a/internal/pkg/auth/utils.go b/internal/pkg/auth/utils.go index 4fa431262..a1be5a546 100644 --- a/internal/pkg/auth/utils.go +++ b/internal/pkg/auth/utils.go @@ -1,10 +1,14 @@ package auth import ( + "encoding/json" "fmt" + "io" + "net/http" "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) @@ -39,3 +43,70 @@ func getIDPClientID() (string, error) { return idpClientID, nil } + +func retrieveIDPWellKnownConfig(p *print.Printer) (*wellKnownConfig, error) { + idpWellKnownConfigURL, err := getIDPWellKnownConfigURL() + if err != nil { + return nil, fmt.Errorf("get IDP well-known configuration: %w", err) + } + if idpWellKnownConfigURL != defaultWellKnownConfig { + p.Warn("You are using a custom identity provider well-known configuration (%s) for authentication.\n", idpWellKnownConfigURL) + err := p.PromptForEnter("Press Enter to proceed with the login...") + if err != nil { + return nil, err + } + } + + p.Debug(print.DebugLevel, "get IDP well-known configuration from %s", idpWellKnownConfigURL) + httpClient := &http.Client{} + idpWellKnownConfig, err := parseWellKnownConfiguration(httpClient, idpWellKnownConfigURL) + if err != nil { + return nil, fmt.Errorf("parse IDP well-known configuration: %w", err) + } + return idpWellKnownConfig, nil +} + +// parseWellKnownConfiguration gets the well-known OpenID configuration from the provided URL and returns it as a JSON +// the method also stores the IDP token endpoint in the authentication storage +func parseWellKnownConfiguration(httpClient apiClient, wellKnownConfigURL string) (wellKnownConfig *wellKnownConfig, err error) { + req, _ := http.NewRequest("GET", wellKnownConfigURL, http.NoBody) + res, err := httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("make the request: %w", err) + } + + // Process the response + defer func() { + closeErr := res.Body.Close() + if closeErr != nil { + err = fmt.Errorf("close response body: %w", closeErr) + } + }() + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, fmt.Errorf("read response body: %w", err) + } + + err = json.Unmarshal(body, &wellKnownConfig) + if err != nil { + return nil, fmt.Errorf("unmarshal response: %w", err) + } + if wellKnownConfig == nil { + return nil, fmt.Errorf("nil well-known configuration response") + } + if wellKnownConfig.Issuer == "" { + return nil, fmt.Errorf("found no issuer") + } + if wellKnownConfig.AuthorizationEndpoint == "" { + return nil, fmt.Errorf("found no authorization endpoint") + } + if wellKnownConfig.TokenEndpoint == "" { + return nil, fmt.Errorf("found no token endpoint") + } + + err = SetAuthField(IDP_TOKEN_ENDPOINT, wellKnownConfig.TokenEndpoint) + if err != nil { + return nil, fmt.Errorf("set token endpoint in the authentication storage: %w", err) + } + return wellKnownConfig, err +} diff --git a/internal/pkg/auth/utils_test.go b/internal/pkg/auth/utils_test.go index 8112257d6..0f3cd1c78 100644 --- a/internal/pkg/auth/utils_test.go +++ b/internal/pkg/auth/utils_test.go @@ -3,8 +3,10 @@ package auth import ( "testing" + "github.com/google/go-cmp/cmp" "github.com/spf13/viper" "github.com/stackitcloud/stackit-cli/internal/pkg/config" + "github.com/zalando/go-keyring" ) func TestGetWellKnownConfig(t *testing.T) { @@ -118,3 +120,83 @@ func TestGetIDPClientID(t *testing.T) { }) } } + +func TestParseWellKnownConfig(t *testing.T) { + tests := []struct { + name string + getFails bool + getResponse string + isValid bool + expected *wellKnownConfig + }{ + { + name: "success", + getFails: false, + getResponse: `{"issuer":"issuer","authorization_endpoint":"auth","token_endpoint":"token"}`, + isValid: true, + expected: &wellKnownConfig{ + Issuer: "issuer", + AuthorizationEndpoint: "auth", + TokenEndpoint: "token", + }, + }, + { + name: "get_fails", + getFails: true, + getResponse: "", + isValid: false, + expected: nil, + }, + { + name: "empty_response", + getFails: true, + getResponse: "", + isValid: false, + expected: nil, + }, + { + name: "missing_issuer", + getFails: true, + getResponse: `{"authorization_endpoint":"auth","token_endpoint":"token"}`, + isValid: false, + expected: nil, + }, + { + name: "missing_authorization", + getFails: true, + getResponse: `{"issuer":"issuer","token_endpoint":"token"}`, + isValid: false, + expected: nil, + }, + { + name: "missing_token", + getFails: true, + getResponse: `{"issuer":"issuer","authorization_endpoint":"auth"}`, + isValid: false, + expected: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + keyring.MockInit() + + testClient := apiClientMocked{ + tt.getFails, + tt.getResponse, + } + + got, err := parseWellKnownConfiguration(&testClient, "") + + if tt.isValid && err != nil { + t.Fatalf("expected no error, got %v", err) + } + if !tt.isValid && err == nil { + t.Fatalf("expected error, got none") + } + + if tt.isValid && !cmp.Equal(*got, *tt.expected) { + t.Fatalf("expected %v, got %v", tt.expected, got) + } + }) + } +} diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index b150509ec..a616e2d07 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -724,6 +724,8 @@ func TestGetDefaultKubeconfigPath(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { + // prevent test from failing if user has set the environment variable + t.Setenv("KUBECONFIG", "") output, err := GetDefaultKubeconfigPath() if err != nil { From edfa7a05af6dc9a39c65c3038f51e38650fe4518 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Mar 2026 08:17:00 +0100 Subject: [PATCH 394/422] chore(deps): bump actions/download-artifact from 7 to 8 (#1323) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7 to 8. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexander Dahmen --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index acb2c9bd8..41bdbb1d3 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -110,7 +110,7 @@ jobs: # use the artifacts from the "goreleaser" job - name: Download artifacts from workflow - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: goreleaser-dist-temp path: dist @@ -147,7 +147,7 @@ jobs: uses: actions/checkout@v6 - name: Download artifacts from workflow - uses: actions/download-artifact@v7 + uses: actions/download-artifact@v8 with: name: goreleaser-dist-temp path: dist From c0b4f684dd0faa5f0f73acdc67701626ebc90a88 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Thu, 5 Mar 2026 10:53:36 +0100 Subject: [PATCH 395/422] feat(auth): add flag to choose used port in user auth flow (#1326) relates to STACKITCLI-276 --- docs/stackit_auth_login.md | 4 +- internal/cmd/auth/login/login.go | 48 +++++++++++- internal/cmd/auth/login/login_test.go | 93 +++++++++++++++++++++++ internal/pkg/auth/auth.go | 7 +- internal/pkg/auth/auth_test.go | 2 +- internal/pkg/auth/user_login.go | 23 ++++-- internal/pkg/auth/user_token_flow.go | 9 ++- internal/pkg/auth/user_token_flow_test.go | 2 +- internal/pkg/flags/flag_to_value.go | 14 ++++ 9 files changed, 186 insertions(+), 16 deletions(-) create mode 100644 internal/cmd/auth/login/login_test.go diff --git a/docs/stackit_auth_login.md b/docs/stackit_auth_login.md index 8b08bc947..3cd888bd2 100644 --- a/docs/stackit_auth_login.md +++ b/docs/stackit_auth_login.md @@ -21,7 +21,9 @@ stackit auth login [flags] ### Options ``` - -h, --help Help for "stackit auth login" + -h, --help Help for "stackit auth login" + --port int The port on which the callback server will listen to. By default, it tries to bind a port between 8000 and 8020. + When a value is specified, it will only try to use the specified port. Valid values are within the range of 8000 to 8020. ``` ### Options inherited from parent commands diff --git a/internal/cmd/auth/login/login.go b/internal/cmd/auth/login/login.go index 23efd0a4e..8a03d19af 100644 --- a/internal/cmd/auth/login/login.go +++ b/internal/cmd/auth/login/login.go @@ -3,15 +3,24 @@ package login import ( "fmt" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" ) +const ( + portFlag = "port" +) + +type inputModel struct { + Port *int +} + func NewCmd(params *types.CmdParams) *cobra.Command { cmd := &cobra.Command{ Use: "login", @@ -25,8 +34,16 @@ func NewCmd(params *types.CmdParams) *cobra.Command { `Login to the STACKIT CLI. This command will open a browser window where you can login to your STACKIT account`, "$ stackit auth login"), ), - RunE: func(_ *cobra.Command, _ []string) error { - err := auth.AuthorizeUser(params.Printer, false) + RunE: func(cmd *cobra.Command, args []string) error { + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + err = auth.AuthorizeUser(params.Printer, auth.UserAuthConfig{ + IsReauthentication: false, + Port: model.Port, + }) if err != nil { return fmt.Errorf("authorization failed: %w", err) } @@ -36,5 +53,28 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return nil }, } + configureFlags(cmd) return cmd } + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int(portFlag, 0, + "The port on which the callback server will listen to. By default, it tries to bind a port between 8000 and 8020.\n"+ + "When a value is specified, it will only try to use the specified port. Valid values are within the range of 8000 to 8020.", + ) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + port := flags.FlagToIntPointer(p, cmd, portFlag) + // For the CLI client only callback URLs with localhost:[8000-8020] are valid. Additional callbacks must be enabled in the backend. + if port != nil && (*port < 8000 || 8020 < *port) { + return nil, fmt.Errorf("port must be between 8000 and 8020") + } + + model := inputModel{ + Port: port, + } + + p.DebugInputModel(model) + return &model, nil +} diff --git a/internal/cmd/auth/login/login_test.go b/internal/cmd/auth/login/login_test.go new file mode 100644 index 000000000..823fa863e --- /dev/null +++ b/internal/cmd/auth/login/login_test.go @@ -0,0 +1,93 @@ +package login + +import ( + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + portFlag: "8010", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + Port: utils.Ptr(8010), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + argValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: true, + expectedModel: &inputModel{ + Port: nil, + }, + }, + { + description: "lower limit", + flagValues: map[string]string{ + portFlag: "8000", + }, + isValid: true, + expectedModel: &inputModel{ + Port: utils.Ptr(8000), + }, + }, + { + description: "below lower limit is not valid ", + flagValues: map[string]string{ + portFlag: "7999", + }, + isValid: false, + }, + { + description: "upper limit", + flagValues: map[string]string{ + portFlag: "8020", + }, + isValid: true, + expectedModel: &inputModel{ + Port: utils.Ptr(8020), + }, + }, + { + description: "above upper limit is not valid ", + flagValues: map[string]string{ + portFlag: "8021", + }, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} diff --git a/internal/pkg/auth/auth.go b/internal/pkg/auth/auth.go index 07716478d..685a1737a 100644 --- a/internal/pkg/auth/auth.go +++ b/internal/pkg/auth/auth.go @@ -25,7 +25,7 @@ type tokenClaims struct { // // If the user was logged in and the user session expired, reauthorizeUserRoutine is called to reauthenticate the user again. // If the environment variable STACKIT_ACCESS_TOKEN is set this token is used instead. -func AuthenticationConfig(p *print.Printer, reauthorizeUserRoutine func(p *print.Printer, _ bool) error) (authCfgOption sdkConfig.ConfigurationOption, err error) { +func AuthenticationConfig(p *print.Printer, reauthorizeUserRoutine func(p *print.Printer, _ UserAuthConfig) error) (authCfgOption sdkConfig.ConfigurationOption, err error) { // Get access token from env and use this if present accessToken := os.Getenv(envAccessTokenName) if accessToken != "" { @@ -70,7 +70,10 @@ func AuthenticationConfig(p *print.Printer, reauthorizeUserRoutine func(p *print case AUTH_FLOW_USER_TOKEN: p.Debug(print.DebugLevel, "authenticating using user token") if userSessionExpired { - err = reauthorizeUserRoutine(p, true) + err = reauthorizeUserRoutine(p, UserAuthConfig{ + IsReauthentication: true, + Port: nil, + }) if err != nil { return nil, fmt.Errorf("user login: %w", err) } diff --git a/internal/pkg/auth/auth_test.go b/internal/pkg/auth/auth_test.go index 4a7c87dbc..6ae4fbfc5 100644 --- a/internal/pkg/auth/auth_test.go +++ b/internal/pkg/auth/auth_test.go @@ -191,7 +191,7 @@ func TestAuthenticationConfig(t *testing.T) { } reauthorizeUserCalled := false - reauthenticateUser := func(_ *print.Printer, _ bool) error { + reauthenticateUser := func(_ *print.Printer, _ UserAuthConfig) error { if reauthorizeUserCalled { t.Errorf("user reauthorized more than once") } diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index e0b35cd49..cefde3868 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -45,12 +45,19 @@ type InputValues struct { Logo string } +type UserAuthConfig struct { + // IsReauthentication defines if an expired user session should be renewed + IsReauthentication bool + // Port defines which port should be used for the UserAuthFlow callback + Port *int +} + type apiClient interface { Do(req *http.Request) (*http.Response, error) } // AuthorizeUser implements the PKCE OAuth2 flow. -func AuthorizeUser(p *print.Printer, isReauthentication bool) error { +func AuthorizeUser(p *print.Printer, authConfig UserAuthConfig) error { idpWellKnownConfig, err := retrieveIDPWellKnownConfig(p) if err != nil { return err @@ -68,7 +75,7 @@ func AuthorizeUser(p *print.Printer, isReauthentication bool) error { } } - if isReauthentication { + if authConfig.IsReauthentication { err := p.PromptForEnter("Your session has expired, press Enter to login again...") if err != nil { return err @@ -79,8 +86,14 @@ func AuthorizeUser(p *print.Printer, isReauthentication bool) error { var listener net.Listener var listenerErr error var port int - for i := range configuredPortRange { - port = defaultPort + i + startingPort := defaultPort + portRange := configuredPortRange + if authConfig.Port != nil { + startingPort = *authConfig.Port + portRange = 1 + } + for i := range portRange { + port = startingPort + i portString := fmt.Sprintf(":%s", strconv.Itoa(port)) p.Debug(print.DebugLevel, "trying to bind port %d for login redirect", port) listener, listenerErr = net.Listen("tcp", portString) @@ -92,7 +105,7 @@ func AuthorizeUser(p *print.Printer, isReauthentication bool) error { p.Debug(print.DebugLevel, "unable to bind port %d for login redirect: %s", port, listenerErr) } if listenerErr != nil { - return fmt.Errorf("unable to bind port for login redirect, tried from port %d to %d: %w", defaultPort, port, err) + return fmt.Errorf("unable to bind port for login redirect, tried from port %d to %d: %w", defaultPort, port, listenerErr) } conf := &oauth2.Config{ diff --git a/internal/pkg/auth/user_token_flow.go b/internal/pkg/auth/user_token_flow.go index 6fde4706c..622de04cb 100644 --- a/internal/pkg/auth/user_token_flow.go +++ b/internal/pkg/auth/user_token_flow.go @@ -15,7 +15,7 @@ import ( type userTokenFlow struct { printer *print.Printer - reauthorizeUserRoutine func(p *print.Printer, isReauthentication bool) error // Called if the user needs to login again + reauthorizeUserRoutine func(p *print.Printer, isReauthentication UserAuthConfig) error // Called if the user needs to login again client *http.Client authFlow AuthFlow accessToken string @@ -95,7 +95,12 @@ func loadVarsFromStorage(utf *userTokenFlow) error { } func reauthenticateUser(utf *userTokenFlow) error { - err := utf.reauthorizeUserRoutine(utf.printer, true) + err := utf.reauthorizeUserRoutine( + utf.printer, + UserAuthConfig{ + IsReauthentication: true, + }, + ) if err != nil { return fmt.Errorf("authenticate user: %w", err) } diff --git a/internal/pkg/auth/user_token_flow_test.go b/internal/pkg/auth/user_token_flow_test.go index cd31350ad..51c1570e6 100644 --- a/internal/pkg/auth/user_token_flow_test.go +++ b/internal/pkg/auth/user_token_flow_test.go @@ -278,7 +278,7 @@ func TestRoundTrip(t *testing.T) { authorizeUserCalled: &authorizeUserCalled, tokensRefreshed: &tokensRefreshed, } - authorizeUserRoutine := func(_ *print.Printer, _ bool) error { + authorizeUserRoutine := func(_ *print.Printer, _ UserAuthConfig) error { return reauthorizeUser(authorizeUserContext) } diff --git a/internal/pkg/flags/flag_to_value.go b/internal/pkg/flags/flag_to_value.go index f08904982..f9d8ebebe 100644 --- a/internal/pkg/flags/flag_to_value.go +++ b/internal/pkg/flags/flag_to_value.go @@ -75,6 +75,20 @@ func FlagToStringToStringPointer(p *print.Printer, cmd *cobra.Command, flag stri return nil } +// Returns a pointer to the flag's value. +// Returns nil if the flag is not set, if its value can not be converted to int, or if the flag does not exist. +func FlagToIntPointer(p *print.Printer, cmd *cobra.Command, flag string) *int { + value, err := cmd.Flags().GetInt(flag) + if err != nil { + p.Debug(print.ErrorLevel, "convert flag to Uint64 pointer: %v", err) + return nil + } + if cmd.Flag(flag).Changed { + return &value + } + return nil +} + // Returns a pointer to the flag's value. // Returns nil if the flag is not set, if its value can not be converted to int64, or if the flag does not exist. func FlagToInt64Pointer(p *print.Printer, cmd *cobra.Command, flag string) *int64 { From d187252126526c8984854863475f8b27a42d9bdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Mar 2026 07:30:06 +0100 Subject: [PATCH 396/422] chore(deps): bump actions/upload-artifact from 6 to 7 (#1333) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7e022d958..8d6dcfa44 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -36,7 +36,7 @@ jobs: run: make test - name: Archive code coverage results - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} path: ${{ env.CODE_COVERAGE_FILE_NAME }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 41bdbb1d3..4f9a7fc76 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -90,7 +90,7 @@ jobs: rm -f "$GPG_KEY_PATH" - name: Upload artifacts to workflow - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: goreleaser-dist-temp path: dist From 0f02251c7dbd3b12dc25f04175e348f85184492e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:49:32 +0100 Subject: [PATCH 397/422] chore(deps): bump crazy-max/ghaction-import-gpg from 6 to 7 (#1336) Bumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 6 to 7. - [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases) - [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v6...v7) --- updated-dependencies: - dependency-name: crazy-max/ghaction-import-gpg dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4f9a7fc76..2f24d7955 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -35,7 +35,7 @@ jobs: cache: true - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@v6 + uses: crazy-max/ghaction-import-gpg@v7 id: import_gpg with: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} @@ -119,7 +119,7 @@ jobs: run: brew install aptly - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@v6 + uses: crazy-max/ghaction-import-gpg@v7 id: import_gpg with: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} @@ -158,7 +158,7 @@ jobs: sudo apt-get install -y createrepo-c - name: Import GPG key - uses: crazy-max/ghaction-import-gpg@v6 + uses: crazy-max/ghaction-import-gpg@v7 id: import_gpg with: gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} From d7b130e73b12189146a72b5e0b3cbdede3a5bbfd Mon Sep 17 00:00:00 2001 From: Michael Eischer <9106997+MichaelEischer@users.noreply.github.com> Date: Wed, 11 Mar 2026 16:39:00 +0100 Subject: [PATCH 398/422] feat(ske): port to v2api version of SDK (#1337) --- go.mod | 2 +- go.sum | 4 +- internal/cmd/ske/cluster/create/create.go | 12 +- .../cmd/ske/cluster/create/create_test.go | 59 ++++--- internal/cmd/ske/cluster/delete/delete.go | 8 +- .../cmd/ske/cluster/delete/delete_test.go | 7 +- internal/cmd/ske/cluster/describe/describe.go | 14 +- .../cmd/ske/cluster/describe/describe_test.go | 31 ++-- .../generate-payload/generate_payload.go | 6 +- .../generate-payload/generate_payload_test.go | 7 +- .../cmd/ske/cluster/hibernate/hibernate.go | 8 +- .../ske/cluster/hibernate/hibernate_test.go | 7 +- internal/cmd/ske/cluster/list/list.go | 16 +- internal/cmd/ske/cluster/list/list_test.go | 7 +- .../ske/cluster/maintenance/maintenance.go | 8 +- .../cluster/maintenance/maintenance_test.go | 7 +- .../cmd/ske/cluster/reconcile/reconcile.go | 8 +- .../ske/cluster/reconcile/reconcile_test.go | 11 +- internal/cmd/ske/cluster/update/update.go | 10 +- .../cmd/ske/cluster/update/update_test.go | 59 ++++--- internal/cmd/ske/cluster/wakeup/wakeup.go | 8 +- .../cmd/ske/cluster/wakeup/wakeup_test.go | 9 +- .../complete-rotation/complete_rotation.go | 8 +- .../complete_rotation_test.go | 7 +- .../start-rotation/start_rotation.go | 8 +- .../start-rotation/start_rotation_test.go | 7 +- internal/cmd/ske/kubeconfig/create/create.go | 6 +- .../cmd/ske/kubeconfig/create/create_test.go | 7 +- internal/cmd/ske/kubeconfig/login/login.go | 4 +- .../cmd/ske/kubeconfig/login/login_test.go | 7 +- .../availability_zones/availability_zones.go | 6 +- .../availability_zones_test.go | 13 +- .../kubernetes_versions.go | 6 +- .../kubernetes_versions_test.go | 15 +- .../options/machine_images/machine_images.go | 12 +- .../machine_images/machine_images_test.go | 19 +-- .../options/machine_types/machine_types.go | 6 +- .../machine_types/machine_types_test.go | 25 +-- internal/cmd/ske/options/options.go | 30 ++-- internal/cmd/ske/options/options_test.go | 7 +- .../ske/options/volume_types/volume_types.go | 6 +- .../options/volume_types/volume_types_test.go | 13 +- internal/pkg/services/ske/client/client.go | 2 +- internal/pkg/services/ske/utils/utils.go | 98 ++++++------ internal/pkg/services/ske/utils/utils_test.go | 149 ++++++++---------- 45 files changed, 385 insertions(+), 384 deletions(-) diff --git a/go.mod b/go.mod index 9948b8bcd..3eeeb67c5 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.9.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.33.0 diff --git a/go.sum b/go.sum index c6d5e71ed..9f1896727 100644 --- a/go.sum +++ b/go.sum @@ -654,8 +654,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 h1:M2PY github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7/go.mod h1:jitkQuP2K/SH63Qor0C4pcqz1GDCy/lK2H4t8/VDse4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0 h1:ofdGO2dGH6ywKbIVxaxRVal3jWX9WlcHSm5BTud5bC4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0 h1:l1QjxW7sdE/6B6BZtHxbmus8XJdI9KDuXX3fwUa5fog= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.7.0/go.mod h1:1Jr+ImrmPERxbYnlTy6O2aSZYNnREf2qQyysv6YC1RY= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.9.0 h1:pNEIQdUJMP5oMsBV/U9ENGBbzsFedb/3ZRC+Mw7bcYc= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.9.0/go.mod h1:VW6csYWkytVufoiDMquVEdyF0amYICzOzSe6ynRRDsI= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 h1:AQrcr+qeIuZob+3TT2q1L4WOPtpsu5SEpkTnOUHDqfE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3/go.mod h1:8BBGC69WFXWWmKgzSjgE4HvsI7pEgO0RN2cASwuPJ18= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 1602e3680..faca273bb 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -21,8 +21,8 @@ import ( skeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -106,7 +106,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Check if cluster exists - exists, err := skeUtils.ClusterExists(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName) + exists, err := skeUtils.ClusterExists(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName) if err != nil { return err } @@ -116,7 +116,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Fill in default payload, if needed if model.Payload == nil { - defaultPayload, err := skeUtils.GetDefaultPayload(ctx, apiClient, model.Region) + defaultPayload, err := skeUtils.GetDefaultPayload(ctx, apiClient.DefaultAPI, model.Region) if err != nil { return fmt.Errorf("get default payload: %w", err) } @@ -135,7 +135,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating cluster") - _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, model.Region, name).WaitWithContext(ctx) + _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, name).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster creation: %w", err) } @@ -182,7 +182,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiCreateOrUpdateClusterRequest { - req := apiClient.CreateOrUpdateCluster(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.CreateOrUpdateCluster(ctx, model.ProjectId, model.Region, model.ClusterName) req = req.CreateOrUpdateClusterPayload(*model.Payload) return req diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index 99392a63d..1dd6b233a 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -2,7 +2,6 @@ package create import ( "context" - "fmt" "testing" "time" @@ -17,7 +16,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -25,51 +24,51 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" const testRegion = "eu01" var testPayload = &ske.CreateOrUpdateClusterPayload{ - Kubernetes: &ske.Kubernetes{ - Version: utils.Ptr("1.25.15"), + Kubernetes: ske.Kubernetes{ + Version: "1.25.15", }, - Nodepools: &[]ske.Nodepool{ + Nodepools: []ske.Nodepool{ { - Name: utils.Ptr("np-name"), - Machine: &ske.Machine{ - Image: &ske.Image{ - Name: utils.Ptr("flatcar"), - Version: utils.Ptr("3760.2.1"), + Name: "np-name", + Machine: ske.Machine{ + Image: ske.Image{ + Name: "flatcar", + Version: "3760.2.1", }, - Type: utils.Ptr("b1.2"), + Type: "b1.2", }, - Minimum: utils.Ptr(int64(1)), - Maximum: utils.Ptr(int64(2)), - MaxSurge: utils.Ptr(int64(1)), - Volume: &ske.Volume{ + Minimum: int32(1), + Maximum: int32(2), + MaxSurge: utils.Ptr(int32(1)), + Volume: ske.Volume{ Type: utils.Ptr("storage_premium_perf0"), - Size: utils.Ptr(int64(40)), + Size: int32(40), }, - AvailabilityZones: &[]string{"eu01-3"}, - Cri: &ske.CRI{Name: ske.CRINAME_DOCKER.Ptr()}, + AvailabilityZones: []string{"eu01-3"}, + Cri: &ske.CRI{Name: utils.Ptr("containerd")}, }, }, Extensions: &ske.Extension{ Acl: &ske.ACL{ - Enabled: utils.Ptr(true), - AllowedCidrs: &[]string{"0.0.0.0/0"}, + Enabled: true, + AllowedCidrs: []string{"0.0.0.0/0"}, }, }, Maintenance: &ske.Maintenance{ - AutoUpdate: &ske.MaintenanceAutoUpdate{ + AutoUpdate: ske.MaintenanceAutoUpdate{ KubernetesVersion: utils.Ptr(true), MachineImageVersion: utils.Ptr(true), }, - TimeWindow: &ske.TimeWindow{ - End: utils.Ptr(time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60))), - Start: utils.Ptr(time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60))), + TimeWindow: ske.TimeWindow{ + End: time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + Start: time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), }, }, } @@ -88,8 +87,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, - payloadFlag: fmt.Sprintf(`{ - "name": "cli-jp", + payloadFlag: `{ "kubernetes": { "version": "1.25.15" }, @@ -107,7 +105,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "maximum": 2, "maxSurge": 1, "volume": { "type": "storage_premium_perf0", "size": 40 }, - "cri": { "name": "%s" }, + "cri": { "name": "containerd" }, "availabilityZones": ["eu01-3"] } ], @@ -122,7 +120,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "start": "0000-01-01T03:00:00+02:00" } } - }`, ske.CRINAME_DOCKER), + }`, } for _, mod := range mods { mod(flagValues) @@ -147,7 +145,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCreateOrUpdateClusterRequest)) ske.ApiCreateOrUpdateClusterRequest { - request := testClient.CreateOrUpdateCluster(testCtx, testProjectId, testRegion, fixtureInputModel().ClusterName) + request := testClient.DefaultAPI.CreateOrUpdateCluster(testCtx, testProjectId, testRegion, fixtureInputModel().ClusterName) request = request.CreateOrUpdateClusterPayload(*testPayload) for _, mod := range mods { mod(&request) @@ -262,6 +260,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index 34de6f2c7..f172b495b 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -15,8 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -69,7 +69,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting cluster") - _, err = wait.DeleteClusterWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.DeleteClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster deletion: %w", err) } @@ -105,6 +105,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiDeleteClusterRequest { - req := apiClient.DeleteCluster(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.DeleteCluster(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/delete/delete_test.go b/internal/cmd/ske/cluster/delete/delete_test.go index 86cef5d06..182af1949 100644 --- a/internal/cmd/ske/cluster/delete/delete_test.go +++ b/internal/cmd/ske/cluster/delete/delete_test.go @@ -10,7 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -18,7 +18,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" @@ -61,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiDeleteClusterRequest)) ske.ApiDeleteClusterRequest { - request := testClient.DeleteCluster(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.DeleteCluster(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } @@ -156,6 +156,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 3e94fa9d9..c66afaaa3 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -85,7 +85,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiGetClusterRequest { - req := apiClient.GetCluster(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.GetCluster(ctx, model.ProjectId, model.Region, model.ClusterName) return req } @@ -97,11 +97,11 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e return p.OutputResult(outputFormat, cluster, func() error { acl := []string{} if cluster.Extensions != nil && cluster.Extensions.Acl != nil { - acl = *cluster.Extensions.Acl.AllowedCidrs + acl = cluster.Extensions.Acl.AllowedCidrs } table := tables.NewTable() - table.AddRow("NAME", utils.PtrString(cluster.Name)) + table.AddRow("NAME", cluster.Name) table.AddSeparator() if cluster.HasStatus() { table.AddRow("STATE", utils.PtrString(cluster.Status.Aggregated)) @@ -110,8 +110,8 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e handleClusterErrors(clusterErrs, &table) } } - if cluster.Kubernetes != nil { - table.AddRow("VERSION", utils.PtrString(cluster.Kubernetes.Version)) + if cluster.Kubernetes.Version != "" { + table.AddRow("VERSION", cluster.Kubernetes.Version) table.AddSeparator() } @@ -131,7 +131,7 @@ func handleClusterErrors(clusterErrs []ske.ClusterError, table *tables.Table) { b := new(strings.Builder) fmt.Fprint(b, e.GetCode()) if msg, ok := e.GetMessageOk(); ok { - fmt.Fprintf(b, ": %s", msg) + fmt.Fprintf(b, ": %s", *msg) } errs = append(errs, b.String()) } diff --git a/internal/cmd/ske/cluster/describe/describe_test.go b/internal/cmd/ske/cluster/describe/describe_test.go index 3049998fe..026a1405e 100644 --- a/internal/cmd/ske/cluster/describe/describe_test.go +++ b/internal/cmd/ske/cluster/describe/describe_test.go @@ -14,7 +14,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -22,7 +22,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" @@ -65,7 +65,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiGetClusterRequest)) ske.ApiGetClusterRequest { - request := testClient.GetCluster(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.GetCluster(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } @@ -160,6 +160,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -197,7 +198,7 @@ func TestOutputResult(t *testing.T) { cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), Message: utils.Ptr("Network configuration not found"), @@ -215,7 +216,7 @@ func TestOutputResult(t *testing.T) { cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), Message: utils.Ptr("Network configuration not found"), @@ -241,7 +242,7 @@ func TestOutputResult(t *testing.T) { cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_FETCHING_ERRORS_NOT_POSSIBLE"), }, @@ -271,7 +272,7 @@ func TestOutputResult(t *testing.T) { cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{}, + Errors: []ske.ClusterError{}, }, }, }, @@ -294,7 +295,7 @@ func TestOutputResult(t *testing.T) { cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), Message: utils.Ptr("Network configuration not found"), @@ -312,7 +313,7 @@ func TestOutputResult(t *testing.T) { cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), Message: utils.Ptr("Network configuration not found"), @@ -329,11 +330,11 @@ func TestOutputResult(t *testing.T) { outputFormat: "", cluster: &ske.Cluster{ Name: utils.Ptr("test-cluster"), - Kubernetes: &ske.Kubernetes{ - Version: utils.Ptr("1.28.0"), + Kubernetes: ske.Kubernetes{ + Version: "1.28.0", }, Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), Message: utils.Ptr("Network configuration not found"), @@ -352,12 +353,12 @@ func TestOutputResult(t *testing.T) { Name: utils.Ptr("test-cluster"), Extensions: &ske.Extension{ Acl: &ske.ACL{ - AllowedCidrs: &[]string{"10.0.0.0/8"}, - Enabled: utils.Ptr(true), + AllowedCidrs: []string{"10.0.0.0/8"}, + Enabled: true, }, }, Status: &ske.ClusterStatus{ - Errors: &[]ske.ClusterError{ + Errors: []ske.ClusterError{ { Code: utils.Ptr("SKE_INFRA_SNA_NETWORK_NOT_FOUND"), Message: utils.Ptr("Network configuration not found"), diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 5afa14cf8..80f36394a 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -18,7 +18,7 @@ import ( skeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -71,7 +71,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { var payload *ske.CreateOrUpdateClusterPayload if model.ClusterName == nil { - payload, err = skeUtils.GetDefaultPayload(ctx, apiClient, model.Region) + payload, err = skeUtils.GetDefaultPayload(ctx, apiClient.DefaultAPI, model.Region) if err != nil { return err } @@ -123,7 +123,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiGetClusterRequest { - req := apiClient.GetCluster(ctx, model.ProjectId, model.Region, *model.ClusterName) + req := apiClient.DefaultAPI.GetCluster(ctx, model.ProjectId, model.Region, *model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go index 97f0aa013..16c1ad392 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload_test.go @@ -14,7 +14,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -22,7 +22,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() const ( @@ -62,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiGetClusterRequest)) ske.ApiGetClusterRequest { - request := testClient.GetCluster(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.GetCluster(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } @@ -162,6 +162,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go index 5e679e38b..259ae868f 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -15,8 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -74,7 +74,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Hibernating cluster") - _, err = wait.TriggerClusterHibernationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.TriggerClusterHibernationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster hibernation: %w", err) } @@ -110,6 +110,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerHibernateRequest { - req := apiClient.TriggerHibernate(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.TriggerHibernate(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/hibernate/hibernate_test.go b/internal/cmd/ske/cluster/hibernate/hibernate_test.go index d9d531ef1..dfdeb5c10 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate_test.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate_test.go @@ -11,7 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} @@ -22,7 +22,7 @@ const ( ) var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() func fixtureArgValues(mods ...func(argValues []string)) []string { @@ -62,7 +62,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiTriggerHibernateRequest)) ske.ApiTriggerHibernateRequest { - request := testClient.TriggerHibernate(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.TriggerHibernate(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } @@ -177,6 +177,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmpopts.EquateComparable(testCtx), cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("request mismatch:\n%s", diff) diff --git a/internal/cmd/ske/cluster/list/list.go b/internal/cmd/ske/cluster/list/list.go index b1fa9f024..054c4f508 100644 --- a/internal/cmd/ske/cluster/list/list.go +++ b/internal/cmd/ske/cluster/list/list.go @@ -20,7 +20,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -83,7 +83,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("get SKE clusters: %w", err) } - clusters := *resp.Items + clusters := resp.Items // Truncate output if model.Limit != nil && len(clusters) > int(*model.Limit) { @@ -134,7 +134,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiListClustersRequest { - req := apiClient.ListClusters(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.ListClusters(ctx, model.ProjectId, model.Region) return req } @@ -150,19 +150,17 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, clusters for i := range clusters { c := clusters[i] monitoring := "Disabled" - if c.Extensions != nil && c.Extensions.Observability != nil && *c.Extensions.Observability.Enabled { + if c.Extensions != nil && c.Extensions.Observability != nil && c.Extensions.Observability.Enabled { monitoring = "Enabled" } - statusAggregated, kubernetesVersion := "", "" + statusAggregated := "" if c.HasStatus() { statusAggregated = utils.PtrString(c.Status.Aggregated) } - if c.Kubernetes != nil { - kubernetesVersion = utils.PtrString(c.Kubernetes.Version) - } + kubernetesVersion := c.Kubernetes.Version countNodepools := 0 if c.Nodepools != nil { - countNodepools = len(*c.Nodepools) + countNodepools = len(c.Nodepools) } table.AddRow( utils.PtrString(c.Name), diff --git a/internal/cmd/ske/cluster/list/list_test.go b/internal/cmd/ske/cluster/list/list_test.go index 2b123dba0..a40ad6984 100644 --- a/internal/cmd/ske/cluster/list/list_test.go +++ b/internal/cmd/ske/cluster/list/list_test.go @@ -14,7 +14,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -22,7 +22,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() const testRegion = "eu01" @@ -55,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiListClustersRequest)) ske.ApiListClustersRequest { - request := testClient.ListClusters(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.ListClusters(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -145,6 +145,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go index 0b5f406ca..8fda38bb6 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -15,8 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -74,7 +74,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Performing cluster maintenance") - _, err = wait.TriggerClusterMaintenanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.TriggerClusterMaintenanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster maintenance to complete: %w", err) } @@ -110,6 +110,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerMaintenanceRequest { - req := apiClient.TriggerMaintenance(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.TriggerMaintenance(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/maintenance/maintenance_test.go b/internal/cmd/ske/cluster/maintenance/maintenance_test.go index fe0ab07cb..b174d4c1d 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance_test.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance_test.go @@ -11,7 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} @@ -22,7 +22,7 @@ const ( ) var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() func fixtureArgValues(mods ...func([]string)) []string { @@ -62,7 +62,7 @@ func fixtureInputModel(mods ...func(*inputModel)) *inputModel { } func fixtureRequest(mods ...func(*ske.ApiTriggerMaintenanceRequest)) ske.ApiTriggerMaintenanceRequest { - request := testClient.TriggerMaintenance(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.TriggerMaintenance(testCtx, testProjectId, testRegion, testClusterName) for _, m := range mods { m(&request) } @@ -178,6 +178,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(got, want, cmpopts.EquateComparable(testCtx), cmp.AllowUnexported(want), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("request mismatch:\n%s", diff) diff --git a/internal/cmd/ske/cluster/reconcile/reconcile.go b/internal/cmd/ske/cluster/reconcile/reconcile.go index 0108ae568..faf3e6da5 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile.go @@ -14,8 +14,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -62,7 +62,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Performing cluster reconciliation") - _, err = wait.TriggerClusterReconciliationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.TriggerClusterReconciliationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster reconciliation: %w", err) } @@ -98,6 +98,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerReconcileRequest { - req := apiClient.TriggerReconcile(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.TriggerReconcile(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/reconcile/reconcile_test.go b/internal/cmd/ske/cluster/reconcile/reconcile_test.go index 5c96f295b..500c408e5 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile_test.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile_test.go @@ -11,7 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} @@ -22,7 +22,7 @@ const ( ) var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() func fixtureArgValues(mods ...func([]string)) []string { @@ -61,8 +61,8 @@ func fixtureInputModel(mods ...func(*inputModel)) *inputModel { return model } -func fixtureRequest(mods ...func(request *ske.ApiTriggerReconcileRequest)) ske.ApiTriggerHibernateRequest { - request := testClient.TriggerReconcile(testCtx, testProjectId, testRegion, testClusterName) +func fixtureRequest(mods ...func(request *ske.ApiTriggerReconcileRequest)) ske.ApiTriggerReconcileRequest { + request := testClient.DefaultAPI.TriggerReconcile(testCtx, testProjectId, testRegion, testClusterName) for _, m := range mods { m(&request) } @@ -161,7 +161,7 @@ func TestBuildRequest(t *testing.T) { tests := []struct { description string model *inputModel - expectedRequest ske.ApiTriggerHibernateRequest + expectedRequest ske.ApiTriggerReconcileRequest }{ { description: "base", @@ -178,6 +178,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(got, want, cmpopts.EquateComparable(testCtx), cmp.AllowUnexported(want), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("request mismatch:\n%s", diff) diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 6150a9bda..7abd56eb1 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -18,8 +18,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -77,7 +77,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Check if cluster exists - exists, err := skeUtils.ClusterExists(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName) + exists, err := skeUtils.ClusterExists(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName) if err != nil { return err } @@ -97,7 +97,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Updating cluster") - _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient, model.ProjectId, model.Region, name).WaitWithContext(ctx) + _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, name).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster update: %w", err) } @@ -144,7 +144,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiCreateOrUpdateClusterRequest { - req := apiClient.CreateOrUpdateCluster(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.CreateOrUpdateCluster(ctx, model.ProjectId, model.Region, model.ClusterName) req = req.CreateOrUpdateClusterPayload(model.Payload) return req diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index e4a28fb91..4b06392ff 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -2,7 +2,6 @@ package update import ( "context" - "fmt" "testing" "time" @@ -16,7 +15,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -24,51 +23,51 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" const testRegion = "eu01" var testPayload = ske.CreateOrUpdateClusterPayload{ - Kubernetes: &ske.Kubernetes{ - Version: utils.Ptr("1.25.15"), + Kubernetes: ske.Kubernetes{ + Version: "1.25.15", }, - Nodepools: &[]ske.Nodepool{ + Nodepools: []ske.Nodepool{ { - Name: utils.Ptr("np-name"), - Machine: &ske.Machine{ - Image: &ske.Image{ - Name: utils.Ptr("flatcar"), - Version: utils.Ptr("3760.2.1"), + Name: "np-name", + Machine: ske.Machine{ + Image: ske.Image{ + Name: "flatcar", + Version: "3760.2.1", }, - Type: utils.Ptr("b1.2"), + Type: "b1.2", }, - Minimum: utils.Ptr(int64(1)), - Maximum: utils.Ptr(int64(2)), - MaxSurge: utils.Ptr(int64(1)), - Volume: &ske.Volume{ + Minimum: int32(1), + Maximum: int32(2), + MaxSurge: utils.Ptr(int32(1)), + Volume: ske.Volume{ Type: utils.Ptr("storage_premium_perf0"), - Size: utils.Ptr(int64(40)), + Size: int32(40), }, - AvailabilityZones: &[]string{"eu01-3"}, - Cri: &ske.CRI{Name: ske.CRINAME_DOCKER.Ptr()}, + AvailabilityZones: []string{"eu01-3"}, + Cri: &ske.CRI{Name: utils.Ptr("containerd")}, }, }, Extensions: &ske.Extension{ Acl: &ske.ACL{ - Enabled: utils.Ptr(true), - AllowedCidrs: &[]string{"0.0.0.0/0"}, + Enabled: true, + AllowedCidrs: []string{"0.0.0.0/0"}, }, }, Maintenance: &ske.Maintenance{ - AutoUpdate: &ske.MaintenanceAutoUpdate{ + AutoUpdate: ske.MaintenanceAutoUpdate{ KubernetesVersion: utils.Ptr(true), MachineImageVersion: utils.Ptr(true), }, - TimeWindow: &ske.TimeWindow{ - End: utils.Ptr(time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60))), - Start: utils.Ptr(time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60))), + TimeWindow: ske.TimeWindow{ + End: time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + Start: time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), }, }, } @@ -87,8 +86,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st flagValues := map[string]string{ globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, - payloadFlag: fmt.Sprintf(`{ - "name": "cli-jp", + payloadFlag: `{ "kubernetes": { "version": "1.25.15" }, @@ -106,7 +104,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "maximum": 2, "maxSurge": 1, "volume": { "type": "storage_premium_perf0", "size": 40 }, - "cri": { "name": "%s" }, + "cri": { "name": "containerd" }, "availabilityZones": ["eu01-3"] } ], @@ -121,7 +119,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st "start": "0000-01-01T03:00:00+02:00" } } - }`, ske.CRINAME_DOCKER), + }`, } for _, mod := range mods { mod(flagValues) @@ -146,7 +144,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCreateOrUpdateClusterRequest)) ske.ApiCreateOrUpdateClusterRequest { - request := testClient.CreateOrUpdateCluster(testCtx, testProjectId, testRegion, fixtureInputModel().ClusterName) + request := testClient.DefaultAPI.CreateOrUpdateCluster(testCtx, testProjectId, testRegion, fixtureInputModel().ClusterName) request = request.CreateOrUpdateClusterPayload(testPayload) for _, mod := range mods { mod(&request) @@ -249,6 +247,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/cluster/wakeup/wakeup.go b/internal/cmd/ske/cluster/wakeup/wakeup.go index 64b0e5ccf..44b1d976f 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup.go @@ -14,8 +14,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -62,7 +62,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Performing cluster wakeup") - _, err = wait.TriggerClusterWakeupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.TriggerClusterWakeupWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for SKE cluster wakeup: %w", err) } @@ -98,6 +98,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiTriggerWakeupRequest { - req := apiClient.TriggerWakeup(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.TriggerWakeup(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/cluster/wakeup/wakeup_test.go b/internal/cmd/ske/cluster/wakeup/wakeup_test.go index dd93881c1..0caf850d0 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup_test.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup_test.go @@ -11,7 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} @@ -22,7 +22,7 @@ const ( ) var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() func fixtureArgValues(mods ...func([]string)) []string { @@ -60,7 +60,7 @@ func fixtureInputModel(mods ...func(*inputModel)) *inputModel { } func fixtureRequest(mods ...func(*ske.ApiTriggerWakeupRequest)) ske.ApiTriggerWakeupRequest { - req := testClient.TriggerWakeup(testCtx, testProjectId, testRegion, testClusterName) + req := testClient.DefaultAPI.TriggerWakeup(testCtx, testProjectId, testRegion, testClusterName) for _, m := range mods { m(&req) } @@ -159,7 +159,7 @@ func TestBuildRequest(t *testing.T) { tests := []struct { description string model *inputModel - expectedRequest ske.ApiTriggerHibernateRequest + expectedRequest ske.ApiTriggerWakeupRequest }{ { description: "base", @@ -176,6 +176,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(got, want, cmpopts.EquateComparable(testCtx), cmp.AllowUnexported(want), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("request mismatch:\n%s", diff) diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index 25f2601aa..a4a5d53af 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -15,8 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -86,7 +86,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Completing credentials rotation") - _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for completing SKE credentials rotation %w", err) } @@ -123,6 +123,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiCompleteCredentialsRotationRequest { - req := apiClient.CompleteCredentialsRotation(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.CompleteCredentialsRotation(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go index ee40fc120..9ef9dc2f8 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation_test.go @@ -10,7 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -18,7 +18,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" @@ -61,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCompleteCredentialsRotationRequest)) ske.ApiCompleteCredentialsRotationRequest { - request := testClient.CompleteCredentialsRotation(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.CompleteCredentialsRotation(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } @@ -154,6 +154,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index 3cb3cee55..b2daa7c87 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -15,8 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" - "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -89,7 +89,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Starting credentials rotation") - _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for start SKE credentials rotation %w", err) } @@ -126,6 +126,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *ske.APIClient) ske.ApiStartCredentialsRotationRequest { - req := apiClient.StartCredentialsRotation(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.StartCredentialsRotation(ctx, model.ProjectId, model.Region, model.ClusterName) return req } diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go index 063269174..e3fae33d2 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation_test.go @@ -10,7 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -18,7 +18,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" @@ -61,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiStartCredentialsRotationRequest)) ske.ApiStartCredentialsRotationRequest { - request := testClient.StartCredentialsRotation(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.StartCredentialsRotation(testCtx, testProjectId, testRegion, testClusterName) for _, mod := range mods { mod(&request) } @@ -154,6 +154,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index 355364098..bff2dfa18 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -19,7 +19,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -221,7 +221,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequestCreate(ctx context.Context, model *inputModel, apiClient *ske.APIClient) (ske.ApiCreateKubeconfigRequest, error) { - req := apiClient.CreateKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName) + req := apiClient.DefaultAPI.CreateKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName) payload := ske.CreateKubeconfigPayload{} @@ -233,7 +233,7 @@ func buildRequestCreate(ctx context.Context, model *inputModel, apiClient *ske.A } func buildRequestLogin(ctx context.Context, model *inputModel, apiClient *ske.APIClient) (ske.ApiGetLoginKubeconfigRequest, error) { - return apiClient.GetLoginKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName), nil + return apiClient.DefaultAPI.GetLoginKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName), nil } func outputResult(p *print.Printer, outputFormat, clusterName, kubeconfigPath string, respKubeconfig *ske.Kubeconfig, respLogin *ske.LoginKubeconfig) error { diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index f8e826064..af09214f3 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -13,7 +13,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag @@ -21,7 +21,7 @@ var projectIdFlag = globalflags.ProjectIdFlag type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" @@ -64,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.ApiCreateKubeconfigRequest { - request := testClient.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) request = request.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{}) for _, mod := range mods { mod(&request) @@ -242,6 +242,7 @@ func TestBuildRequestCreate(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index fcd121bc9..2d2c88070 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -31,7 +31,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -248,7 +248,7 @@ func requestNewLoginKubeconfig(ctx context.Context, apiClient *ske.APIClient, cl } func buildLoginKubeconfigRequest(ctx context.Context, apiClient *ske.APIClient, clusterConfig *clusterConfig) ske.ApiCreateKubeconfigRequest { - req := apiClient.CreateKubeconfig(ctx, clusterConfig.STACKITProjectID, clusterConfig.Region, clusterConfig.ClusterName) + req := apiClient.DefaultAPI.CreateKubeconfig(ctx, clusterConfig.STACKITProjectID, clusterConfig.Region, clusterConfig.ClusterName) expirationSeconds := strconv.Itoa(expirationSeconds) return req.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{ExpirationSeconds: &expirationSeconds}) diff --git a/internal/cmd/ske/kubeconfig/login/login_test.go b/internal/cmd/ske/kubeconfig/login/login_test.go index 4f2fc4a3a..cf9c3a756 100644 --- a/internal/cmd/ske/kubeconfig/login/login_test.go +++ b/internal/cmd/ske/kubeconfig/login/login_test.go @@ -11,7 +11,7 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientauthenticationv1 "k8s.io/client-go/pkg/apis/clientauthentication/v1" "k8s.io/client-go/rest" @@ -20,7 +20,7 @@ import ( type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} var testProjectId = uuid.NewString() var testClusterName = "cluster" var testOrganization = uuid.NewString() @@ -42,7 +42,7 @@ func fixtureClusterConfig(mods ...func(clusterConfig *clusterConfig)) *clusterCo } func fixtureLoginRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.ApiCreateKubeconfigRequest { - request := testClient.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) + request := testClient.DefaultAPI.CreateKubeconfig(testCtx, testProjectId, testRegion, testClusterName) request = request.CreateKubeconfigPayload(ske.CreateKubeconfigPayload{}) for _, mod := range mods { mod(&request) @@ -71,6 +71,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/options/availability_zones/availability_zones.go b/internal/cmd/ske/options/availability_zones/availability_zones.go index bef599ad4..0b50574b2 100644 --- a/internal/cmd/ske/options/availability_zones/availability_zones.go +++ b/internal/cmd/ske/options/availability_zones/availability_zones.go @@ -14,7 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { @@ -70,7 +70,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx, model.Region) + req := apiClient.DefaultAPI.ListProviderOptions(ctx, model.Region) return req } @@ -85,7 +85,7 @@ func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOpti options.VolumeTypes = nil return p.OutputResult(model.OutputFormat, options, func() error { - zones := utils.PtrValue(options.AvailabilityZones) + zones := options.AvailabilityZones table := tables.NewTable() table.SetHeader("ZONE") diff --git a/internal/cmd/ske/options/availability_zones/availability_zones_test.go b/internal/cmd/ske/options/availability_zones/availability_zones_test.go index e66bca441..03229b4cf 100644 --- a/internal/cmd/ske/options/availability_zones/availability_zones_test.go +++ b/internal/cmd/ske/options/availability_zones/availability_zones_test.go @@ -13,13 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} const testRegion = "eu01" @@ -86,7 +86,7 @@ func TestBuildRequest(t *testing.T) { { description: "base", inputModel: fixtureInputModel(), - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion), }, } @@ -97,6 +97,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -154,7 +155,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - AvailabilityZones: &[]ske.AvailabilityZone{}, + AvailabilityZones: []ske.AvailabilityZone{}, }, }, wantErr: false, @@ -166,7 +167,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - AvailabilityZones: &[]ske.AvailabilityZone{{}}, + AvailabilityZones: []ske.AvailabilityZone{{}}, }, }, wantErr: false, @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - AvailabilityZones: &[]ske.AvailabilityZone{ + AvailabilityZones: []ske.AvailabilityZone{ { Name: utils.Ptr("zone1"), }, diff --git a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go index f7e0b8ab2..afe03bd2e 100644 --- a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go +++ b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go @@ -17,7 +17,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -87,7 +87,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx, model.Region) + req := apiClient.DefaultAPI.ListProviderOptions(ctx, model.Region) if model.Supported { req = req.VersionState("SUPPORTED") } @@ -105,7 +105,7 @@ func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOpti options.VolumeTypes = nil return p.OutputResult(model.OutputFormat, options, func() error { - versions := utils.PtrValue(options.KubernetesVersions) + versions := options.KubernetesVersions table := tables.NewTable() table.SetHeader("VERSION", "STATE", "EXPIRATION DATE", "FEATURE GATES") diff --git a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go index f8c7bd3c4..54f246933 100644 --- a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go +++ b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions_test.go @@ -14,13 +14,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} const testRegion = "eu01" @@ -100,14 +100,14 @@ func TestBuildRequest(t *testing.T) { { description: "base", inputModel: fixtureInputModel(), - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion), }, { description: "base", inputModel: fixtureInputModel(func(model *inputModel) { model.Supported = true }), - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion).VersionState("SUPPORTED"), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion).VersionState("SUPPORTED"), }, } @@ -118,6 +118,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -175,7 +176,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - KubernetesVersions: &[]ske.KubernetesVersion{}, + KubernetesVersions: []ske.KubernetesVersion{}, }, }, wantErr: false, @@ -187,7 +188,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - KubernetesVersions: &[]ske.KubernetesVersion{{}}, + KubernetesVersions: []ske.KubernetesVersion{{}}, }, }, wantErr: false, @@ -199,7 +200,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - KubernetesVersions: &[]ske.KubernetesVersion{ + KubernetesVersions: []ske.KubernetesVersion{ { FeatureGates: &map[string]string{ "featureGate1": "foo", diff --git a/internal/cmd/ske/options/machine_images/machine_images.go b/internal/cmd/ske/options/machine_images/machine_images.go index 19eae47d5..4c7c9523a 100644 --- a/internal/cmd/ske/options/machine_images/machine_images.go +++ b/internal/cmd/ske/options/machine_images/machine_images.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { @@ -72,7 +72,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx, model.Region) + req := apiClient.DefaultAPI.ListProviderOptions(ctx, model.Region) return req } @@ -87,18 +87,18 @@ func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOpti options.VolumeTypes = nil return p.OutputResult(model.OutputFormat, options, func() error { - images := utils.PtrValue(options.MachineImages) + images := options.MachineImages table := tables.NewTable() table.SetHeader("NAME", "VERSION", "STATE", "EXPIRATION DATE", "SUPPORTED CRI") for i := range images { image := images[i] - versions := utils.PtrValue(image.Versions) + versions := image.Versions for j := range versions { version := versions[j] criNames := make([]string, 0) - for i := range utils.PtrValue(version.Cri) { - cri := utils.PtrValue(version.Cri)[i] + for i := range version.Cri { + cri := version.Cri[i] criNames = append(criNames, utils.PtrString(cri.Name)) } criNamesString := strings.Join(criNames, ", ") diff --git a/internal/cmd/ske/options/machine_images/machine_images_test.go b/internal/cmd/ske/options/machine_images/machine_images_test.go index e1f073b26..ad4658757 100644 --- a/internal/cmd/ske/options/machine_images/machine_images_test.go +++ b/internal/cmd/ske/options/machine_images/machine_images_test.go @@ -14,13 +14,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} const testRegion = "eu01" @@ -87,7 +87,7 @@ func TestBuildRequest(t *testing.T) { { description: "base", inputModel: fixtureInputModel(), - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion), }, } @@ -98,6 +98,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -155,7 +156,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - MachineImages: &[]ske.MachineImage{}, + MachineImages: []ske.MachineImage{}, }, }, wantErr: false, @@ -167,7 +168,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - MachineImages: &[]ske.MachineImage{{}}, + MachineImages: []ske.MachineImage{{}}, }, }, wantErr: false, @@ -179,14 +180,14 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - MachineImages: &[]ske.MachineImage{ + MachineImages: []ske.MachineImage{ { Name: utils.Ptr("image1"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { - Cri: &[]ske.CRI{ + Cri: []ske.CRI{ { - Name: ske.CRINAME_CONTAINERD.Ptr(), + Name: utils.Ptr("containerd"), }, }, ExpirationDate: utils.Ptr(time.Now()), diff --git a/internal/cmd/ske/options/machine_types/machine_types.go b/internal/cmd/ske/options/machine_types/machine_types.go index 26014dc59..5d66cade5 100644 --- a/internal/cmd/ske/options/machine_types/machine_types.go +++ b/internal/cmd/ske/options/machine_types/machine_types.go @@ -14,7 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { @@ -70,7 +70,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx, model.Region) + req := apiClient.DefaultAPI.ListProviderOptions(ctx, model.Region) return req } @@ -85,7 +85,7 @@ func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOpti options.VolumeTypes = nil return p.OutputResult(model.OutputFormat, options, func() error { - machineTypes := utils.PtrValue(options.MachineTypes) + machineTypes := options.MachineTypes table := tables.NewTable() table.SetHeader("TYPE", "CPU", "MEMORY") diff --git a/internal/cmd/ske/options/machine_types/machine_types_test.go b/internal/cmd/ske/options/machine_types/machine_types_test.go index 7db75d847..ef405139f 100644 --- a/internal/cmd/ske/options/machine_types/machine_types_test.go +++ b/internal/cmd/ske/options/machine_types/machine_types_test.go @@ -13,13 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} const testRegion = "eu01" @@ -86,7 +86,7 @@ func TestBuildRequest(t *testing.T) { { description: "base", inputModel: fixtureInputModel(), - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion), }, } @@ -97,6 +97,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -154,7 +155,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - MachineTypes: &[]ske.MachineType{}, + MachineTypes: []ske.MachineType{}, }, }, wantErr: false, @@ -166,7 +167,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - MachineTypes: &[]ske.MachineType{{}}, + MachineTypes: []ske.MachineType{{}}, }, }, wantErr: false, @@ -178,19 +179,19 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - MachineTypes: &[]ske.MachineType{ + MachineTypes: []ske.MachineType{ { Architecture: utils.Ptr("amd64"), - Cpu: utils.Ptr(int64(2)), - Gpu: utils.Ptr(int64(0)), - Memory: utils.Ptr(int64(16)), + Cpu: utils.Ptr(int32(2)), + Gpu: utils.Ptr(int32(0)), + Memory: utils.Ptr(int32(16)), Name: utils.Ptr("type1"), }, { Architecture: utils.Ptr("amd64"), - Cpu: utils.Ptr(int64(2)), - Gpu: utils.Ptr(int64(0)), - Memory: utils.Ptr(int64(16)), + Cpu: utils.Ptr(int32(2)), + Gpu: utils.Ptr(int32(0)), + Memory: utils.Ptr(int32(16)), Name: utils.Ptr("type2"), }, }, diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 7038cee7f..58d7db759 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -22,7 +22,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( @@ -135,7 +135,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx, model.Region) + req := apiClient.DefaultAPI.ListProviderOptions(ctx, model.Region) return req } @@ -178,11 +178,11 @@ func outputResultAsTable(p *print.Printer, options *ske.ProviderOptions) error { } content := []tables.Table{} - if options.AvailabilityZones != nil && len(*options.AvailabilityZones) != 0 { + if len(options.AvailabilityZones) != 0 { content = append(content, buildAvailabilityZonesTable(options)) } - if options.KubernetesVersions != nil && len(*options.KubernetesVersions) != 0 { + if len(options.KubernetesVersions) != 0 { kubernetesVersionsTable, err := buildKubernetesVersionsTable(options) if err != nil { return fmt.Errorf("build Kubernetes versions table: %w", err) @@ -190,15 +190,15 @@ func outputResultAsTable(p *print.Printer, options *ske.ProviderOptions) error { content = append(content, kubernetesVersionsTable) } - if options.MachineImages != nil && len(*options.MachineImages) != 0 { + if len(options.MachineImages) != 0 { content = append(content, buildMachineImagesTable(options)) } - if options.MachineTypes != nil && len(*options.MachineTypes) != 0 { + if len(options.MachineTypes) != 0 { content = append(content, buildMachineTypesTable(options)) } - if options.VolumeTypes != nil && len(*options.VolumeTypes) != 0 { + if len(options.VolumeTypes) != 0 { content = append(content, buildVolumeTypesTable(options)) } @@ -211,7 +211,7 @@ func outputResultAsTable(p *print.Printer, options *ske.ProviderOptions) error { } func buildAvailabilityZonesTable(resp *ske.ProviderOptions) tables.Table { - zones := *resp.AvailabilityZones + zones := resp.AvailabilityZones table := tables.NewTable() table.SetTitle("Availability Zones") @@ -224,7 +224,7 @@ func buildAvailabilityZonesTable(resp *ske.ProviderOptions) tables.Table { } func buildKubernetesVersionsTable(resp *ske.ProviderOptions) (tables.Table, error) { - versions := *resp.KubernetesVersions + versions := resp.KubernetesVersions table := tables.NewTable() table.SetTitle("Kubernetes Versions") @@ -249,19 +249,19 @@ func buildKubernetesVersionsTable(resp *ske.ProviderOptions) (tables.Table, erro } func buildMachineImagesTable(resp *ske.ProviderOptions) tables.Table { - images := *resp.MachineImages + images := resp.MachineImages table := tables.NewTable() table.SetTitle("Machine Images") table.SetHeader("NAME", "VERSION", "STATE", "EXPIRATION DATE", "SUPPORTED CRI") for i := range images { image := images[i] - versions := *image.Versions + versions := image.Versions for j := range versions { version := versions[j] criNames := make([]string, 0) - for i := range *version.Cri { - cri := (*version.Cri)[i] + for i := range version.Cri { + cri := version.Cri[i] criNames = append(criNames, string(*cri.Name)) } criNamesString := strings.Join(criNames, ", ") @@ -284,7 +284,7 @@ func buildMachineImagesTable(resp *ske.ProviderOptions) tables.Table { } func buildMachineTypesTable(resp *ske.ProviderOptions) tables.Table { - machineTypes := *resp.MachineTypes + machineTypes := resp.MachineTypes table := tables.NewTable() table.SetTitle("Machine Types") @@ -301,7 +301,7 @@ func buildMachineTypesTable(resp *ske.ProviderOptions) tables.Table { } func buildVolumeTypesTable(resp *ske.ProviderOptions) tables.Table { - volumeTypes := *resp.VolumeTypes + volumeTypes := resp.VolumeTypes table := tables.NewTable() table.SetTitle("Volume Types") diff --git a/internal/cmd/ske/options/options_test.go b/internal/cmd/ske/options/options_test.go index 2fe568f2a..52ebe0a26 100644 --- a/internal/cmd/ske/options/options_test.go +++ b/internal/cmd/ske/options/options_test.go @@ -12,13 +12,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} const testRegion = "eu01" @@ -142,7 +142,7 @@ func TestBuildRequest(t *testing.T) { }{ { description: "base", - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion), }, } @@ -153,6 +153,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) diff --git a/internal/cmd/ske/options/volume_types/volume_types.go b/internal/cmd/ske/options/volume_types/volume_types.go index 8d3983487..35aa8dbb9 100644 --- a/internal/cmd/ske/options/volume_types/volume_types.go +++ b/internal/cmd/ske/options/volume_types/volume_types.go @@ -14,7 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { @@ -70,7 +70,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, apiClient *ske.APIClient, model *inputModel) ske.ApiListProviderOptionsRequest { - req := apiClient.ListProviderOptions(ctx, model.Region) + req := apiClient.DefaultAPI.ListProviderOptions(ctx, model.Region) return req } @@ -85,7 +85,7 @@ func outputResult(p *print.Printer, model *inputModel, options *ske.ProviderOpti options.MachineTypes = nil return p.OutputResult(model.OutputFormat, options, func() error { - volumeTypes := utils.PtrValue(options.VolumeTypes) + volumeTypes := options.VolumeTypes table := tables.NewTable() table.SetHeader("TYPE") diff --git a/internal/cmd/ske/options/volume_types/volume_types_test.go b/internal/cmd/ske/options/volume_types/volume_types_test.go index ce37ce498..ea926f3f0 100644 --- a/internal/cmd/ske/options/volume_types/volume_types_test.go +++ b/internal/cmd/ske/options/volume_types/volume_types_test.go @@ -13,13 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &ske.APIClient{} +var testClient = &ske.APIClient{DefaultAPI: &ske.DefaultAPIService{}} const testRegion = "eu01" @@ -86,7 +86,7 @@ func TestBuildRequest(t *testing.T) { { description: "base", inputModel: fixtureInputModel(), - expectedRequest: testClient.ListProviderOptions(testCtx, testRegion), + expectedRequest: testClient.DefaultAPI.ListProviderOptions(testCtx, testRegion), }, } @@ -97,6 +97,7 @@ func TestBuildRequest(t *testing.T) { diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), ) if diff != "" { t.Fatalf("Data does not match: %s", diff) @@ -154,7 +155,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - VolumeTypes: &[]ske.VolumeType{}, + VolumeTypes: []ske.VolumeType{}, }, }, wantErr: false, @@ -166,7 +167,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - VolumeTypes: &[]ske.VolumeType{{}}, + VolumeTypes: []ske.VolumeType{{}}, }, }, wantErr: false, @@ -178,7 +179,7 @@ func TestOutputResult(t *testing.T) { GlobalFlagModel: globalflags.GlobalFlagModel{}, }, options: &ske.ProviderOptions{ - VolumeTypes: &[]ske.VolumeType{ + VolumeTypes: []ske.VolumeType{ { Name: utils.Ptr("type1"), }, diff --git a/internal/pkg/services/ske/client/client.go b/internal/pkg/services/ske/client/client.go index 5b4b69f38..dd3af9872 100644 --- a/internal/pkg/services/ske/client/client.go +++ b/internal/pkg/services/ske/client/client.go @@ -6,7 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/viper" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) func ConfigureClient(p *print.Printer, cliVersion string) (*ske.APIClient, error) { diff --git a/internal/pkg/services/ske/utils/utils.go b/internal/pkg/services/ske/utils/utils.go index 904ff97a1..5b4f46561 100644 --- a/internal/pkg/services/ske/utils/utils.go +++ b/internal/pkg/services/ske/utils/utils.go @@ -12,12 +12,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "k8s.io/client-go/tools/clientcmd" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" "golang.org/x/mod/semver" ) const ( - defaultNodepoolCRI = ske.CRINAME_CONTAINERD + defaultNodepoolCRI = "containerd" defaultNodepoolMachineImageName = "flatcar" defaultNodepoolMaxUnavailable = 0 defaultNodepoolMinimum = 1 @@ -28,17 +28,12 @@ const ( supportedState = "supported" ) -type SKEClient interface { - ListClustersExecute(ctx context.Context, projectId, region string) (*ske.ListClustersResponse, error) - ListProviderOptionsExecute(ctx context.Context, region string) (*ske.ProviderOptions, error) -} - -func ClusterExists(ctx context.Context, apiClient SKEClient, projectId, region, clusterName string) (bool, error) { - clusters, err := apiClient.ListClustersExecute(ctx, projectId, region) +func ClusterExists(ctx context.Context, apiClient ske.DefaultAPI, projectId, region, clusterName string) (bool, error) { + clusters, err := apiClient.ListClusters(ctx, projectId, region).Execute() if err != nil { return false, fmt.Errorf("list SKE clusters: %w", err) } - for _, cl := range *clusters.Items { + for _, cl := range clusters.Items { if cl.Name != nil && *cl.Name == clusterName { return true, nil } @@ -46,8 +41,8 @@ func ClusterExists(ctx context.Context, apiClient SKEClient, projectId, region, return false, nil } -func GetDefaultPayload(ctx context.Context, apiClient SKEClient, region string) (*ske.CreateOrUpdateClusterPayload, error) { - resp, err := apiClient.ListProviderOptionsExecute(ctx, region) +func GetDefaultPayload(ctx context.Context, apiClient ske.DefaultAPI, region string) (*ske.CreateOrUpdateClusterPayload, error) { + resp, err := apiClient.ListProviderOptions(ctx, region).Execute() if err != nil { return nil, fmt.Errorf("get SKE provider options: %w", err) } @@ -64,86 +59,91 @@ func GetDefaultPayload(ctx context.Context, apiClient SKEClient, region string) payload := &ske.CreateOrUpdateClusterPayload{ Extensions: &ske.Extension{ Acl: &ske.ACL{ - AllowedCidrs: &[]string{}, - Enabled: utils.Ptr(false), + AllowedCidrs: []string{}, + Enabled: false, }, }, Kubernetes: payloadKubernetes, - Nodepools: &[]ske.Nodepool{ + Nodepools: []ske.Nodepool{ *payloadNodepool, }, } return payload, nil } -func getDefaultPayloadKubernetes(resp *ske.ProviderOptions) (*ske.Kubernetes, error) { - output := &ske.Kubernetes{} +func getDefaultPayloadKubernetes(resp *ske.ProviderOptions) (ske.Kubernetes, error) { + output := ske.Kubernetes{} if resp.KubernetesVersions == nil { - return nil, fmt.Errorf("no supported Kubernetes version found") + return ske.Kubernetes{}, fmt.Errorf("no supported Kubernetes version found") } foundKubernetesVersion := false - versions := *resp.KubernetesVersions + versions := resp.KubernetesVersions for i := range versions { version := versions[i] if *version.State != supportedState { continue } - if output.Version != nil { - oldSemVer := fmt.Sprintf("v%s", *output.Version) - newSemVer := fmt.Sprintf("v%s", *version.Version) + if output.Version != "" { + oldSemVer := fmt.Sprintf("v%s", output.Version) + newSemVer := fmt.Sprintf("v%s", version.GetVersion()) if semver.Compare(newSemVer, oldSemVer) != 1 { continue } } foundKubernetesVersion = true - output.Version = version.Version + output.Version = version.GetVersion() } if !foundKubernetesVersion { - return nil, fmt.Errorf("no supported Kubernetes version found") + return ske.Kubernetes{}, fmt.Errorf("no supported Kubernetes version found") } return output, nil } func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) { - if resp.AvailabilityZones == nil || len(*resp.AvailabilityZones) == 0 { + if len(resp.AvailabilityZones) == 0 { return nil, fmt.Errorf("no availability zones found") } var availabilityZones []string - for i := range *resp.AvailabilityZones { - azName := (*resp.AvailabilityZones)[i].GetName() + for i := range resp.AvailabilityZones { + azName := resp.AvailabilityZones[i].GetName() // don't include availability zones like eu01-m, eu02-m, not all flavors are available there if !regexp.MustCompile(`\w{2}\d{2}-m`).MatchString(azName) { availabilityZones = append(availabilityZones, azName) } } - if resp.MachineTypes == nil || len(*resp.MachineTypes) == 0 { + if len(resp.MachineTypes) == 0 { return nil, fmt.Errorf("no machine types found") } - machineType := (*resp.MachineTypes)[0].GetName() + azLen := len(availabilityZones) + if azLen > 1000 { + // check against a very large number to avoid gosec warning + return nil, fmt.Errorf("invalid number of availability zones") + } + machineType := resp.MachineTypes[0].GetName() output := &ske.Nodepool{ - AvailabilityZones: &availabilityZones, + AvailabilityZones: availabilityZones, Cri: &ske.CRI{ Name: utils.Ptr(defaultNodepoolCRI), }, - Machine: &ske.Machine{ - Type: &machineType, - Image: &ske.Image{ - Name: utils.Ptr(defaultNodepoolMachineImageName), + Machine: ske.Machine{ + Type: machineType, + Image: ske.Image{ + Name: defaultNodepoolMachineImageName, }, }, // there must be as many nodes as availability zones are given - MaxSurge: utils.Ptr(int64(len(availabilityZones))), - MaxUnavailable: utils.Ptr(int64(defaultNodepoolMaxUnavailable)), - Maximum: utils.Ptr(int64(len(availabilityZones))), - Minimum: utils.Ptr(int64(defaultNodepoolMinimum)), - Name: utils.Ptr(defaultNodepoolName), - Volume: &ske.Volume{ + MaxSurge: utils.Ptr(int32(azLen)), + MaxUnavailable: utils.Ptr(int32(defaultNodepoolMaxUnavailable)), + Maximum: int32(azLen), + Minimum: int32(defaultNodepoolMinimum), + Name: defaultNodepoolName, + Volume: ske.Volume{ Type: utils.Ptr(defaultNodepoolVolumeType), - Size: utils.Ptr(int64(defaultNodepoolVolumeSize)), + Size: int32(defaultNodepoolVolumeSize), }, } @@ -152,7 +152,7 @@ func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) return nil, fmt.Errorf("no supported image versions found") } foundImageVersion := false - images := *resp.MachineImages + images := resp.MachineImages for i := range images { image := images[i] if *image.Name != defaultNodepoolMachineImageName { @@ -161,7 +161,7 @@ func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) if image.Versions == nil { continue } - versions := *image.Versions + versions := image.Versions for j := range versions { version := versions[j] if *version.State != supportedState { @@ -169,12 +169,12 @@ func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) } // Check if default CRI is supported - if version.Cri == nil || len(*version.Cri) == 0 { + if len(version.Cri) == 0 { continue } criSupported := false - for k := range *version.Cri { - cri := (*version.Cri)[k] + for k := range version.Cri { + cri := version.Cri[k] if *cri.Name == defaultNodepoolCRI { criSupported = true break @@ -184,8 +184,8 @@ func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) continue } - if output.Machine.Image.Version != nil { - oldSemVer := fmt.Sprintf("v%s", *output.Machine.Image.Version) + if output.Machine.Image.Version != "" { + oldSemVer := fmt.Sprintf("v%s", output.Machine.Image.Version) newSemVer := fmt.Sprintf("v%s", *version.Version) if semver.Compare(newSemVer, oldSemVer) != 1 { continue @@ -193,7 +193,7 @@ func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) } foundImageVersion = true - output.Machine.Image.Version = version.Version + output.Machine.Image.Version = version.GetVersion() } } if !foundImageVersion { diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index a616e2d07..e6ade49fa 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -12,7 +12,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/ske" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var ( @@ -63,29 +63,8 @@ users: ` ) -type skeClientMocked struct { - listClustersFails bool - listClustersResp *ske.ListClustersResponse - listProviderOptionsFails bool - listProviderOptionsResp *ske.ProviderOptions -} - const testRegion = "eu01" -func (m *skeClientMocked) ListClustersExecute(_ context.Context, _, _ string) (*ske.ListClustersResponse, error) { - if m.listClustersFails { - return nil, fmt.Errorf("could not list clusters") - } - return m.listClustersResp, nil -} - -func (m *skeClientMocked) ListProviderOptionsExecute(_ context.Context, _ string) (*ske.ProviderOptions, error) { - if m.listProviderOptionsFails { - return nil, fmt.Errorf("could not list provider options") - } - return m.listProviderOptionsResp, nil -} - func TestClusterExists(t *testing.T) { tests := []struct { description string @@ -96,19 +75,19 @@ func TestClusterExists(t *testing.T) { }{ { description: "cluster exists", - getClustersResp: &ske.ListClustersResponse{Items: &[]ske.Cluster{{Name: utils.Ptr(testClusterName)}}}, + getClustersResp: &ske.ListClustersResponse{Items: []ske.Cluster{{Name: utils.Ptr(testClusterName)}}}, isValid: true, expectedExists: true, }, { description: "cluster exists 2", - getClustersResp: &ske.ListClustersResponse{Items: &[]ske.Cluster{{Name: utils.Ptr("some-cluster")}, {Name: utils.Ptr("some-other-cluster")}, {Name: utils.Ptr(testClusterName)}}}, + getClustersResp: &ske.ListClustersResponse{Items: []ske.Cluster{{Name: utils.Ptr("some-cluster")}, {Name: utils.Ptr("some-other-cluster")}, {Name: utils.Ptr(testClusterName)}}}, isValid: true, expectedExists: true, }, { description: "cluster does not exist", - getClustersResp: &ske.ListClustersResponse{Items: &[]ske.Cluster{{Name: utils.Ptr("some-cluster")}, {Name: utils.Ptr("some-other-cluster")}}}, + getClustersResp: &ske.ListClustersResponse{Items: []ske.Cluster{{Name: utils.Ptr("some-cluster")}, {Name: utils.Ptr("some-other-cluster")}}}, isValid: true, expectedExists: false, }, @@ -121,9 +100,13 @@ func TestClusterExists(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &skeClientMocked{ - listClustersFails: tt.getClustersFails, - listClustersResp: tt.getClustersResp, + client := &ske.DefaultAPIServiceMock{ + ListClustersExecuteMock: utils.Ptr(func(_ ske.ApiListClustersRequest) (*ske.ListClustersResponse, error) { + if tt.getClustersFails { + return nil, fmt.Errorf("could not list clusters") + } + return tt.getClustersResp, nil + }), } exists, err := ClusterExists(context.Background(), client, testProjectId, testRegion, testClusterName) @@ -146,18 +129,18 @@ func TestClusterExists(t *testing.T) { func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOptions { providerOptions := &ske.ProviderOptions{ - AvailabilityZones: &[]ske.AvailabilityZone{ + AvailabilityZones: []ske.AvailabilityZone{ {Name: utils.Ptr("eu01-m")}, {Name: utils.Ptr("eu01-1")}, {Name: utils.Ptr("eu01-2")}, {Name: utils.Ptr("eu01-3")}, }, - MachineTypes: &[]ske.MachineType{ + MachineTypes: []ske.MachineType{ { Name: utils.Ptr("b1.2"), }, }, - KubernetesVersions: &[]ske.KubernetesVersion{ + KubernetesVersions: []ske.KubernetesVersion{ { State: utils.Ptr("supported"), Version: utils.Ptr("1.2.3"), @@ -171,31 +154,31 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt Version: utils.Ptr("4.4.4"), }, }, - MachineImages: &[]ske.MachineImage{ + MachineImages: []ske.MachineImage{ { Name: utils.Ptr("flatcar"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { State: utils.Ptr("supported"), Version: utils.Ptr("1.2.3"), - Cri: &[]ske.CRI{ + Cri: []ske.CRI{ { - Name: ske.CRINAME_DOCKER.Ptr(), + Name: utils.Ptr("docker"), }, { - Name: ske.CRINAME_CONTAINERD.Ptr(), + Name: utils.Ptr("containerd"), }, }, }, { State: utils.Ptr("supported"), Version: utils.Ptr("3.2.1"), - Cri: &[]ske.CRI{ + Cri: []ske.CRI{ { - Name: ske.CRINAME_DOCKER.Ptr(), + Name: utils.Ptr("docker"), }, { - Name: ske.CRINAME_CONTAINERD.Ptr(), + Name: utils.Ptr("containerd"), }, }, }, @@ -203,13 +186,13 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt }, { Name: utils.Ptr("not-flatcar"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { State: utils.Ptr("supported"), Version: utils.Ptr("4.4.4"), - Cri: &[]ske.CRI{ + Cri: []ske.CRI{ { - Name: ske.CRINAME_CONTAINERD.Ptr(), + Name: utils.Ptr("containerd"), }, }, }, @@ -217,7 +200,7 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt }, { Name: utils.Ptr("flatcar"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { State: utils.Ptr("supported"), Version: utils.Ptr("4.4.4"), @@ -226,13 +209,13 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt }, { Name: utils.Ptr("flatcar"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { State: utils.Ptr("not-supported"), Version: utils.Ptr("4.4.4"), - Cri: &[]ske.CRI{ + Cri: []ske.CRI{ { - Name: ske.CRINAME_CONTAINERD.Ptr(), + Name: utils.Ptr("containerd"), }, }, }, @@ -240,13 +223,13 @@ func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOpt }, { Name: utils.Ptr("flatcar"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { State: utils.Ptr("supported"), Version: utils.Ptr("4.4.4"), - Cri: &[]ske.CRI{ + Cri: []ske.CRI{ { - Name: ske.CRINAME_DOCKER.Ptr(), + Name: utils.Ptr("docker"), }, }, }, @@ -264,38 +247,38 @@ func fixtureGetDefaultPayload(mods ...func(*ske.CreateOrUpdateClusterPayload)) * payload := &ske.CreateOrUpdateClusterPayload{ Extensions: &ske.Extension{ Acl: &ske.ACL{ - AllowedCidrs: &[]string{}, - Enabled: utils.Ptr(false), + AllowedCidrs: []string{}, + Enabled: false, }, }, - Kubernetes: &ske.Kubernetes{ - Version: utils.Ptr("3.2.1"), + Kubernetes: ske.Kubernetes{ + Version: "3.2.1", }, - Nodepools: &[]ske.Nodepool{ + Nodepools: []ske.Nodepool{ { - AvailabilityZones: &[]string{ + AvailabilityZones: []string{ "eu01-1", "eu01-2", "eu01-3", }, Cri: &ske.CRI{ - Name: ske.CRINAME_CONTAINERD.Ptr(), + Name: utils.Ptr("containerd"), }, - Machine: &ske.Machine{ - Type: utils.Ptr("b1.2"), - Image: &ske.Image{ - Version: utils.Ptr("3.2.1"), - Name: utils.Ptr("flatcar"), + Machine: ske.Machine{ + Type: "b1.2", + Image: ske.Image{ + Version: "3.2.1", + Name: "flatcar", }, }, - MaxSurge: utils.Ptr(int64(3)), - MaxUnavailable: utils.Ptr(int64(0)), - Maximum: utils.Ptr(int64(3)), - Minimum: utils.Ptr(int64(1)), - Name: utils.Ptr("pool-default"), - Volume: &ske.Volume{ + MaxSurge: utils.Ptr(int32(3)), + MaxUnavailable: utils.Ptr(int32(0)), + Maximum: int32(3), + Minimum: int32(1), + Name: "pool-default", + Volume: ske.Volume{ Type: utils.Ptr("storage_premium_perf2"), - Size: utils.Ptr(int64(50)), + Size: int32(50), }, }, }, @@ -335,7 +318,7 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no availability zones", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.AvailabilityZones = &[]ske.AvailabilityZone{} + po.AvailabilityZones = []ske.AvailabilityZone{} }), isValid: false, }, @@ -349,7 +332,7 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no machine types", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.MachineTypes = &[]ske.MachineType{} + po.MachineTypes = []ske.MachineType{} }), isValid: false, }, @@ -363,14 +346,14 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no Kubernetes versions 2", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.KubernetesVersions = &[]ske.KubernetesVersion{} + po.KubernetesVersions = []ske.KubernetesVersion{} }), isValid: false, }, { description: "no supported Kubernetes versions", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.KubernetesVersions = &[]ske.KubernetesVersion{ + po.KubernetesVersions = []ske.KubernetesVersion{ { State: utils.Ptr("not-supported"), Version: utils.Ptr("1.2.3"), @@ -382,7 +365,7 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no machine images 1", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.MachineImages = &[]ske.MachineImage{} + po.MachineImages = []ske.MachineImage{} }), isValid: false, }, @@ -396,7 +379,7 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no machine image versions 1", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.MachineImages = &[]ske.MachineImage{ + po.MachineImages = []ske.MachineImage{ { Name: utils.Ptr("image-1"), Versions: nil, @@ -408,10 +391,10 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no machine image versions 2", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.MachineImages = &[]ske.MachineImage{ + po.MachineImages = []ske.MachineImage{ { Name: utils.Ptr("image-1"), - Versions: &[]ske.MachineImageVersion{}, + Versions: []ske.MachineImageVersion{}, }, } }), @@ -420,10 +403,10 @@ func TestGetDefaultPayload(t *testing.T) { { description: "no supported machine image versions", listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) { - po.MachineImages = &[]ske.MachineImage{ + po.MachineImages = []ske.MachineImage{ { Name: utils.Ptr("image-1"), - Versions: &[]ske.MachineImageVersion{ + Versions: []ske.MachineImageVersion{ { State: utils.Ptr("not-supported"), Version: utils.Ptr("1.2.3"), @@ -438,9 +421,13 @@ func TestGetDefaultPayload(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &skeClientMocked{ - listProviderOptionsFails: tt.listProviderOptionsFails, - listProviderOptionsResp: tt.listProviderOptionsResp, + client := &ske.DefaultAPIServiceMock{ + ListProviderOptionsExecuteMock: utils.Ptr(func(_ ske.ApiListProviderOptionsRequest) (*ske.ProviderOptions, error) { + if tt.listProviderOptionsFails { + return nil, fmt.Errorf("could not list provider options") + } + return tt.listProviderOptionsResp, nil + }), } output, err := GetDefaultPayload(context.Background(), client, testRegion) From 2df8c00728d20eb83ed6645f34cfd7114eceae1f Mon Sep 17 00:00:00 2001 From: Mauritz Uphoff <39736813+h3adex@users.noreply.github.com> Date: Fri, 13 Mar 2026 10:43:51 +0100 Subject: [PATCH 399/422] feat(iaas): implement machine-type filter (#1321) Co-authored-by: cgoetz-inovex --- docs/stackit_server_machine-type_list.md | 11 ++++- internal/cmd/server/machine-type/list/list.go | 47 ++++++++++++++++--- .../cmd/server/machine-type/list/list_test.go | 46 ++++++++++++++++++ 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/docs/stackit_server_machine-type_list.md b/docs/stackit_server_machine-type_list.md index fd2ed7afe..127563908 100644 --- a/docs/stackit_server_machine-type_list.md +++ b/docs/stackit_server_machine-type_list.md @@ -21,13 +21,20 @@ stackit server machine-type list [flags] List the first 10 machine types $ stackit server machine-type list --limit=10 + + List machine types with exactly 2 vCPUs + $ stackit server machine-type list --filter="vcpus==2" + + List machine types with at least 2 vCPUs and 2048 MB RAM + $ stackit server machine-type list --filter="vcpus >= 2 && ram >= 2048" ``` ### Options ``` - -h, --help Help for "stackit server machine-type list" - --limit int Limit the output to the first n elements + --filter string Filter resources by fields. A subset of expr-lang is supported. See https://expr-lang.org/docs/language-definition for usage details + -h, --help Help for "stackit server machine-type list" + --limit int Limit the output to the first n elements ``` ### Options inherited from parent commands diff --git a/internal/cmd/server/machine-type/list/list.go b/internal/cmd/server/machine-type/list/list.go index 9dc3aad50..c134edd55 100644 --- a/internal/cmd/server/machine-type/list/list.go +++ b/internal/cmd/server/machine-type/list/list.go @@ -23,11 +23,13 @@ import ( type inputModel struct { *globalflags.GlobalFlagModel - Limit *int64 + Limit *int64 + Filter *string } const ( - limitFlag = "limit" + limitFlag = "limit" + filterFlag = "filter" ) func NewCmd(params *types.CmdParams) *cobra.Command { @@ -49,6 +51,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { `List the first 10 machine types`, `$ stackit server machine-type list --limit=10`, ), + examples.NewExample( + `List machine types with exactly 2 vCPUs`, + `$ stackit server machine-type list --filter="vcpus==2"`, + ), + examples.NewExample( + `List machine types with at least 2 vCPUs and 2048 MB RAM`, + `$ stackit server machine-type list --filter="vcpus >= 2 && ram >= 2048"`, + ), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -95,6 +105,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") + cmd.Flags().String(filterFlag, "", "Filter resources by fields. A subset of expr-lang is supported. See https://expr-lang.org/docs/language-definition for usage details") } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { @@ -113,7 +124,8 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, model := inputModel{ GlobalFlagModel: globalFlags, - Limit: flags.FlagToInt64Pointer(p, cmd, limitFlag), + Limit: limit, + Filter: flags.FlagToStringPointer(p, cmd, filterFlag), } p.DebugInputModel(model) @@ -121,18 +133,39 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListMachineTypesRequest { - return apiClient.ListMachineTypes(ctx, model.ProjectId, model.Region) + req := apiClient.ListMachineTypes(ctx, model.ProjectId, model.Region) + if model.Filter != nil { + req = req.Filter(*model.Filter) + } + return req } func outputResult(p *print.Printer, outputFormat string, machineTypes iaas.MachineTypeListResponse) error { return p.OutputResult(outputFormat, machineTypes, func() error { table := tables.NewTable() table.SetTitle("Machine-Types") - - table.SetHeader("NAME", "DESCRIPTION") + table.SetHeader("NAME", "VCPUS", "RAM (GB)", "DESCRIPTION", "EXTRA SPECS") if items := machineTypes.GetItems(); len(items) > 0 { for _, machineType := range items { - table.AddRow(*machineType.Name, utils.PtrString(machineType.Description)) + extraSpecMap := make(map[string]string) + if machineType.ExtraSpecs != nil && len(*machineType.ExtraSpecs) > 0 { + for key, value := range *machineType.ExtraSpecs { + extraSpecMap[key] = fmt.Sprintf("%v", value) + } + } + ramGB := int64(0) + if machineType.Ram != nil { + ramGB = *machineType.Ram / 1024 + } + + table.AddRow( + utils.PtrString(machineType.Name), + utils.PtrValue(machineType.Vcpus), + ramGB, + utils.PtrString(machineType.Description), + utils.JoinStringMap(extraSpecMap, ": ", "\n"), + ) + table.AddSeparator() } } diff --git a/internal/cmd/server/machine-type/list/list_test.go b/internal/cmd/server/machine-type/list/list_test.go index 8b07ca64c..19afe28b8 100644 --- a/internal/cmd/server/machine-type/list/list_test.go +++ b/internal/cmd/server/machine-type/list/list_test.go @@ -77,6 +77,16 @@ func TestParseInput(t *testing.T) { isValid: true, expectedModel: fixtureInputModel(), }, + { + description: "with filter", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[filterFlag] = "vcpus >= 2 && ram >= 2048" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Filter = utils.Ptr("vcpus >= 2 && ram >= 2048") + }), + }, { description: "no values", flagValues: map[string]string{}, @@ -142,6 +152,15 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel(), expectedRequest: fixtureRequest(), }, + { + description: "with filter", + model: fixtureInputModel(func(model *inputModel) { + model.Filter = utils.Ptr("vcpus==2") + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiListMachineTypesRequest) { + *request = (*request).Filter("vcpus==2") + }), + }, } for _, tt := range tests { @@ -174,6 +193,33 @@ func TestOutputResult(t *testing.T) { args: args{}, wantErr: false, }, + { + name: "with populated data", + args: args{ + outputFormat: "table", + machineTypes: iaas.MachineTypeListResponse{ + Items: &[]iaas.MachineType{ + { + Name: utils.Ptr("c1.2"), + Vcpus: utils.Ptr(int64(2)), + Ram: utils.Ptr(int64(2048)), // Should display as 2 GB + Description: utils.Ptr("Compute optimized 2 vCPU"), + ExtraSpecs: &map[string]interface{}{ + "cpu": "intel-icelake-generic", + }, + }, + { + Name: utils.Ptr("m1.2"), + Vcpus: utils.Ptr(int64(2)), + Ram: utils.Ptr(int64(8192)), // Should display as 8 GB + Description: utils.Ptr("Memory optimized 2 vCPU"), + // No ExtraSpecs provided to test nil safety + }, + }, + }, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(&types.CmdParams{Printer: p}) From 26bc5f13da1325fe89e305848c7c39bdcc963c69 Mon Sep 17 00:00:00 2001 From: Andi Keraj <115724636+andikeraj@users.noreply.github.com> Date: Fri, 13 Mar 2026 17:28:39 +0100 Subject: [PATCH 400/422] chore(kms): move kms out of beta (#1315) relates to #934 --- docs/stackit.md | 1 + docs/stackit_beta.md | 1 - docs/stackit_beta_kms_key.md | 40 ------------------- docs/stackit_beta_kms_version.md | 38 ------------------ docs/stackit_beta_kms_wrapping-key.md | 37 ----------------- docs/{stackit_beta_kms.md => stackit_kms.md} | 16 ++++---- docs/stackit_kms_key.md | 40 +++++++++++++++++++ ...ey_create.md => stackit_kms_key_create.md} | 20 +++++----- ...ey_delete.md => stackit_kms_key_delete.md} | 10 ++--- ...escribe.md => stackit_kms_key_describe.md} | 10 ++--- ...ey_import.md => stackit_kms_key_import.md} | 12 +++--- ...ms_key_list.md => stackit_kms_key_list.md} | 12 +++--- ..._restore.md => stackit_kms_key_restore.md} | 10 ++--- ...ey_rotate.md => stackit_kms_key_rotate.md} | 10 ++--- ..._kms_keyring.md => stackit_kms_keyring.md} | 16 ++++---- ...reate.md => stackit_kms_keyring_create.md} | 14 +++---- ...elete.md => stackit_kms_keyring_delete.md} | 10 ++--- ...ibe.md => stackit_kms_keyring_describe.md} | 10 ++--- ...ng_list.md => stackit_kms_keyring_list.md} | 12 +++--- docs/stackit_kms_version.md | 38 ++++++++++++++++++ ...troy.md => stackit_kms_version_destroy.md} | 10 ++--- ...able.md => stackit_kms_version_disable.md} | 10 ++--- ...nable.md => stackit_kms_version_enable.md} | 10 ++--- ...on_list.md => stackit_kms_version_list.md} | 12 +++--- ...tore.md => stackit_kms_version_restore.md} | 10 ++--- docs/stackit_kms_wrapping-key.md | 37 +++++++++++++++++ ....md => stackit_kms_wrapping-key_create.md} | 12 +++--- ....md => stackit_kms_wrapping-key_delete.md} | 10 ++--- ...d => stackit_kms_wrapping-key_describe.md} | 10 ++--- ...st.md => stackit_kms_wrapping-key_list.md} | 12 +++--- internal/cmd/beta/beta.go | 2 - .../cmd/{beta => }/kms/key/create/create.go | 12 +++--- .../{beta => }/kms/key/create/create_test.go | 0 .../cmd/{beta => }/kms/key/delete/delete.go | 2 +- .../{beta => }/kms/key/delete/delete_test.go | 0 .../{beta => }/kms/key/describe/describe.go | 2 +- .../kms/key/describe/describe_test.go | 0 .../{beta => }/kms/key/importKey/importKey.go | 4 +- .../kms/key/importKey/importKey_test.go | 0 internal/cmd/{beta => }/kms/key/key.go | 14 +++---- internal/cmd/{beta => }/kms/key/list/list.go | 4 +- .../cmd/{beta => }/kms/key/list/list_test.go | 0 .../cmd/{beta => }/kms/key/restore/restore.go | 2 +- .../kms/key/restore/restore_test.go | 0 .../cmd/{beta => }/kms/key/rotate/rotate.go | 2 +- .../{beta => }/kms/key/rotate/rotate_test.go | 0 .../{beta => }/kms/keyring/create/create.go | 6 +-- .../kms/keyring/create/create_test.go | 0 .../{beta => }/kms/keyring/delete/delete.go | 2 +- .../kms/keyring/delete/delete_test.go | 0 .../kms/keyring/describe/describe.go | 2 +- .../kms/keyring/describe/describe_test.go | 0 .../cmd/{beta => }/kms/keyring/keyring.go | 8 ++-- .../cmd/{beta => }/kms/keyring/list/list.go | 4 +- .../{beta => }/kms/keyring/list/list_test.go | 0 internal/cmd/{beta => }/kms/kms.go | 8 ++-- .../{beta => }/kms/version/destroy/destroy.go | 2 +- .../kms/version/destroy/destroy_test.go | 0 .../{beta => }/kms/version/disable/disable.go | 2 +- .../kms/version/disable/disable_test.go | 0 .../{beta => }/kms/version/enable/enable.go | 2 +- .../kms/version/enable/enable_test.go | 0 .../cmd/{beta => }/kms/version/list/list.go | 4 +- .../{beta => }/kms/version/list/list_test.go | 0 .../{beta => }/kms/version/restore/restore.go | 2 +- .../kms/version/restore/restore_test.go | 0 .../cmd/{beta => }/kms/version/version.go | 10 ++--- .../kms/wrappingkey/create/create.go | 4 +- .../kms/wrappingkey/create/create_test.go | 0 .../kms/wrappingkey/delete/delete.go | 2 +- .../kms/wrappingkey/delete/delete_test.go | 0 .../kms/wrappingkey/describe/describe.go | 2 +- .../kms/wrappingkey/describe/describe_test.go | 0 .../{beta => }/kms/wrappingkey/list/list.go | 4 +- .../kms/wrappingkey/list/list_test.go | 0 .../{beta => }/kms/wrappingkey/wrappingkey.go | 8 ++-- internal/cmd/root.go | 2 + 77 files changed, 304 insertions(+), 304 deletions(-) delete mode 100644 docs/stackit_beta_kms_key.md delete mode 100644 docs/stackit_beta_kms_version.md delete mode 100644 docs/stackit_beta_kms_wrapping-key.md rename docs/{stackit_beta_kms.md => stackit_kms.md} (55%) create mode 100644 docs/stackit_kms_key.md rename docs/{stackit_beta_kms_key_create.md => stackit_kms_key_create.md} (60%) rename docs/{stackit_beta_kms_key_delete.md => stackit_kms_key_delete.md} (73%) rename docs/{stackit_beta_kms_key_describe.md => stackit_kms_key_describe.md} (72%) rename docs/{stackit_beta_kms_key_import.md => stackit_kms_key_import.md} (69%) rename docs/{stackit_beta_kms_key_list.md => stackit_kms_key_list.md} (70%) rename docs/{stackit_beta_kms_key_restore.md => stackit_kms_key_restore.md} (73%) rename docs/{stackit_beta_kms_key_rotate.md => stackit_kms_key_rotate.md} (73%) rename docs/{stackit_beta_kms_keyring.md => stackit_kms_keyring.md} (52%) rename docs/{stackit_beta_kms_keyring_create.md => stackit_kms_keyring_create.md} (67%) rename docs/{stackit_beta_kms_keyring_delete.md => stackit_kms_keyring_delete.md} (71%) rename docs/{stackit_beta_kms_keyring_describe.md => stackit_kms_keyring_describe.md} (71%) rename docs/{stackit_beta_kms_keyring_list.md => stackit_kms_keyring_list.md} (70%) create mode 100644 docs/stackit_kms_version.md rename docs/{stackit_beta_kms_version_destroy.md => stackit_kms_version_destroy.md} (70%) rename docs/{stackit_beta_kms_version_disable.md => stackit_kms_version_disable.md} (70%) rename docs/{stackit_beta_kms_version_enable.md => stackit_kms_version_enable.md} (70%) rename docs/{stackit_beta_kms_version_list.md => stackit_kms_version_list.md} (68%) rename docs/{stackit_beta_kms_version_restore.md => stackit_kms_version_restore.md} (71%) create mode 100644 docs/stackit_kms_wrapping-key.md rename docs/{stackit_beta_kms_wrapping-key_create.md => stackit_kms_wrapping-key_create.md} (72%) rename docs/{stackit_beta_kms_wrapping-key_delete.md => stackit_kms_wrapping-key_delete.md} (69%) rename docs/{stackit_beta_kms_wrapping-key_describe.md => stackit_kms_wrapping-key_describe.md} (68%) rename docs/{stackit_beta_kms_wrapping-key_list.md => stackit_kms_wrapping-key_list.md} (67%) rename internal/cmd/{beta => }/kms/key/create/create.go (86%) rename internal/cmd/{beta => }/kms/key/create/create_test.go (100%) rename internal/cmd/{beta => }/kms/key/delete/delete.go (98%) rename internal/cmd/{beta => }/kms/key/delete/delete_test.go (100%) rename internal/cmd/{beta => }/kms/key/describe/describe.go (98%) rename internal/cmd/{beta => }/kms/key/describe/describe_test.go (100%) rename internal/cmd/{beta => }/kms/key/importKey/importKey.go (94%) rename internal/cmd/{beta => }/kms/key/importKey/importKey_test.go (100%) rename internal/cmd/{beta => }/kms/key/key.go (62%) rename internal/cmd/{beta => }/kms/key/list/list.go (96%) rename internal/cmd/{beta => }/kms/key/list/list_test.go (100%) rename internal/cmd/{beta => }/kms/key/restore/restore.go (98%) rename internal/cmd/{beta => }/kms/key/restore/restore_test.go (100%) rename internal/cmd/{beta => }/kms/key/rotate/rotate.go (98%) rename internal/cmd/{beta => }/kms/key/rotate/rotate_test.go (100%) rename internal/cmd/{beta => }/kms/keyring/create/create.go (95%) rename internal/cmd/{beta => }/kms/keyring/create/create_test.go (100%) rename internal/cmd/{beta => }/kms/keyring/delete/delete.go (98%) rename internal/cmd/{beta => }/kms/keyring/delete/delete_test.go (100%) rename internal/cmd/{beta => }/kms/keyring/describe/describe.go (98%) rename internal/cmd/{beta => }/kms/keyring/describe/describe_test.go (100%) rename internal/cmd/{beta => }/kms/keyring/keyring.go (71%) rename internal/cmd/{beta => }/kms/keyring/list/list.go (97%) rename internal/cmd/{beta => }/kms/keyring/list/list_test.go (100%) rename internal/cmd/{beta => }/kms/kms.go (72%) rename internal/cmd/{beta => }/kms/version/destroy/destroy.go (97%) rename internal/cmd/{beta => }/kms/version/destroy/destroy_test.go (100%) rename internal/cmd/{beta => }/kms/version/disable/disable.go (98%) rename internal/cmd/{beta => }/kms/version/disable/disable_test.go (100%) rename internal/cmd/{beta => }/kms/version/enable/enable.go (98%) rename internal/cmd/{beta => }/kms/version/enable/enable_test.go (100%) rename internal/cmd/{beta => }/kms/version/list/list.go (95%) rename internal/cmd/{beta => }/kms/version/list/list_test.go (100%) rename internal/cmd/{beta => }/kms/version/restore/restore.go (97%) rename internal/cmd/{beta => }/kms/version/restore/restore_test.go (100%) rename internal/cmd/{beta => }/kms/version/version.go (67%) rename internal/cmd/{beta => }/kms/wrappingkey/create/create.go (94%) rename internal/cmd/{beta => }/kms/wrappingkey/create/create_test.go (100%) rename internal/cmd/{beta => }/kms/wrappingkey/delete/delete.go (97%) rename internal/cmd/{beta => }/kms/wrappingkey/delete/delete_test.go (100%) rename internal/cmd/{beta => }/kms/wrappingkey/describe/describe.go (98%) rename internal/cmd/{beta => }/kms/wrappingkey/describe/describe_test.go (100%) rename internal/cmd/{beta => }/kms/wrappingkey/list/list.go (96%) rename internal/cmd/{beta => }/kms/wrappingkey/list/list_test.go (100%) rename internal/cmd/{beta => }/kms/wrappingkey/wrappingkey.go (70%) diff --git a/docs/stackit.md b/docs/stackit.md index fe3f26296..88f1a5707 100644 --- a/docs/stackit.md +++ b/docs/stackit.md @@ -35,6 +35,7 @@ stackit [flags] * [stackit git](./stackit_git.md) - Provides functionality for STACKIT Git * [stackit image](./stackit_image.md) - Manage server images * [stackit key-pair](./stackit_key-pair.md) - Provides functionality for SSH key pairs +* [stackit kms](./stackit_kms.md) - Provides functionality for KMS * [stackit load-balancer](./stackit_load-balancer.md) - Provides functionality for Load Balancer * [stackit logme](./stackit_logme.md) - Provides functionality for LogMe * [stackit logs](./stackit_logs.md) - Provides functionality for Logs diff --git a/docs/stackit_beta.md b/docs/stackit_beta.md index 77c078fa6..9d62cd913 100644 --- a/docs/stackit_beta.md +++ b/docs/stackit_beta.md @@ -45,7 +45,6 @@ stackit beta [flags] * [stackit beta cdn](./stackit_beta_cdn.md) - Manage CDN resources * [stackit beta edge-cloud](./stackit_beta_edge-cloud.md) - Provides functionality for edge services. * [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake -* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS * [stackit beta sfs](./stackit_beta_sfs.md) - Provides functionality for SFS (stackit file storage) * [stackit beta sqlserverflex](./stackit_beta_sqlserverflex.md) - Provides functionality for SQLServer Flex diff --git a/docs/stackit_beta_kms_key.md b/docs/stackit_beta_kms_key.md deleted file mode 100644 index a22f3d97b..000000000 --- a/docs/stackit_beta_kms_key.md +++ /dev/null @@ -1,40 +0,0 @@ -## stackit beta kms key - -Manage KMS keys - -### Synopsis - -Provides functionality for key operations inside the KMS - -``` -stackit beta kms key [flags] -``` - -### Options - -``` - -h, --help Help for "stackit beta kms key" -``` - -### Options inherited from parent commands - -``` - -y, --assume-yes If set, skips all confirmation prompts - --async If set, runs the command asynchronously - -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] - -p, --project-id string Project ID - --region string Target region for region-specific requests - --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") -``` - -### SEE ALSO - -* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS -* [stackit beta kms key create](./stackit_beta_kms_key_create.md) - Creates a KMS key -* [stackit beta kms key delete](./stackit_beta_kms_key_delete.md) - Deletes a KMS key -* [stackit beta kms key describe](./stackit_beta_kms_key_describe.md) - Describe a KMS key -* [stackit beta kms key import](./stackit_beta_kms_key_import.md) - Import a KMS key -* [stackit beta kms key list](./stackit_beta_kms_key_list.md) - List all KMS keys -* [stackit beta kms key restore](./stackit_beta_kms_key_restore.md) - Restore a key -* [stackit beta kms key rotate](./stackit_beta_kms_key_rotate.md) - Rotate a key - diff --git a/docs/stackit_beta_kms_version.md b/docs/stackit_beta_kms_version.md deleted file mode 100644 index baf9c5ecb..000000000 --- a/docs/stackit_beta_kms_version.md +++ /dev/null @@ -1,38 +0,0 @@ -## stackit beta kms version - -Manage KMS key versions - -### Synopsis - -Provides functionality for key version operations inside the KMS - -``` -stackit beta kms version [flags] -``` - -### Options - -``` - -h, --help Help for "stackit beta kms version" -``` - -### Options inherited from parent commands - -``` - -y, --assume-yes If set, skips all confirmation prompts - --async If set, runs the command asynchronously - -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] - -p, --project-id string Project ID - --region string Target region for region-specific requests - --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") -``` - -### SEE ALSO - -* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS -* [stackit beta kms version destroy](./stackit_beta_kms_version_destroy.md) - Destroy a key version -* [stackit beta kms version disable](./stackit_beta_kms_version_disable.md) - Disable a key version -* [stackit beta kms version enable](./stackit_beta_kms_version_enable.md) - Enable a key version -* [stackit beta kms version list](./stackit_beta_kms_version_list.md) - List all key versions -* [stackit beta kms version restore](./stackit_beta_kms_version_restore.md) - Restore a key version - diff --git a/docs/stackit_beta_kms_wrapping-key.md b/docs/stackit_beta_kms_wrapping-key.md deleted file mode 100644 index 2cef6b863..000000000 --- a/docs/stackit_beta_kms_wrapping-key.md +++ /dev/null @@ -1,37 +0,0 @@ -## stackit beta kms wrapping-key - -Manage KMS wrapping keys - -### Synopsis - -Provides functionality for wrapping key operations inside the KMS - -``` -stackit beta kms wrapping-key [flags] -``` - -### Options - -``` - -h, --help Help for "stackit beta kms wrapping-key" -``` - -### Options inherited from parent commands - -``` - -y, --assume-yes If set, skips all confirmation prompts - --async If set, runs the command asynchronously - -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] - -p, --project-id string Project ID - --region string Target region for region-specific requests - --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") -``` - -### SEE ALSO - -* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS -* [stackit beta kms wrapping-key create](./stackit_beta_kms_wrapping-key_create.md) - Creates a KMS wrapping key -* [stackit beta kms wrapping-key delete](./stackit_beta_kms_wrapping-key_delete.md) - Deletes a KMS wrapping key -* [stackit beta kms wrapping-key describe](./stackit_beta_kms_wrapping-key_describe.md) - Describe a KMS wrapping key -* [stackit beta kms wrapping-key list](./stackit_beta_kms_wrapping-key_list.md) - Lists all KMS wrapping keys - diff --git a/docs/stackit_beta_kms.md b/docs/stackit_kms.md similarity index 55% rename from docs/stackit_beta_kms.md rename to docs/stackit_kms.md index e50cfd05a..d1adc5024 100644 --- a/docs/stackit_beta_kms.md +++ b/docs/stackit_kms.md @@ -1,4 +1,4 @@ -## stackit beta kms +## stackit kms Provides functionality for KMS @@ -7,13 +7,13 @@ Provides functionality for KMS Provides functionality for KMS. ``` -stackit beta kms [flags] +stackit kms [flags] ``` ### Options ``` - -h, --help Help for "stackit beta kms" + -h, --help Help for "stackit kms" ``` ### Options inherited from parent commands @@ -29,9 +29,9 @@ stackit beta kms [flags] ### SEE ALSO -* [stackit beta](./stackit_beta.md) - Contains beta STACKIT CLI commands -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys -* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings -* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions -* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys +* [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys +* [stackit kms keyring](./stackit_kms_keyring.md) - Manage KMS key rings +* [stackit kms version](./stackit_kms_version.md) - Manage KMS key versions +* [stackit kms wrapping-key](./stackit_kms_wrapping-key.md) - Manage KMS wrapping keys diff --git a/docs/stackit_kms_key.md b/docs/stackit_kms_key.md new file mode 100644 index 000000000..3cdfbdf00 --- /dev/null +++ b/docs/stackit_kms_key.md @@ -0,0 +1,40 @@ +## stackit kms key + +Manage KMS keys + +### Synopsis + +Provides functionality for key operations inside the KMS + +``` +stackit kms key [flags] +``` + +### Options + +``` + -h, --help Help for "stackit kms key" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit kms](./stackit_kms.md) - Provides functionality for KMS +* [stackit kms key create](./stackit_kms_key_create.md) - Creates a KMS key +* [stackit kms key delete](./stackit_kms_key_delete.md) - Deletes a KMS key +* [stackit kms key describe](./stackit_kms_key_describe.md) - Describe a KMS key +* [stackit kms key import](./stackit_kms_key_import.md) - Import a KMS key +* [stackit kms key list](./stackit_kms_key_list.md) - List all KMS keys +* [stackit kms key restore](./stackit_kms_key_restore.md) - Restore a key +* [stackit kms key rotate](./stackit_kms_key_rotate.md) - Rotate a key + diff --git a/docs/stackit_beta_kms_key_create.md b/docs/stackit_kms_key_create.md similarity index 60% rename from docs/stackit_beta_kms_key_create.md rename to docs/stackit_kms_key_create.md index 0c3114a69..dcf9716f3 100644 --- a/docs/stackit_beta_kms_key_create.md +++ b/docs/stackit_kms_key_create.md @@ -1,4 +1,4 @@ -## stackit beta kms key create +## stackit kms key create Creates a KMS key @@ -7,29 +7,29 @@ Creates a KMS key Creates a KMS key. ``` -stackit beta kms key create [flags] +stackit kms key create [flags] ``` ### Examples ``` Create a symmetric AES key (AES-256) with the name "symm-aes-gcm" under the key ring "my-keyring-id" - $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "aes_256_gcm" --name "symm-aes-gcm" --purpose "symmetric_encrypt_decrypt" --protection "software" + $ stackit kms key create --keyring-id "my-keyring-id" --algorithm "aes_256_gcm" --name "symm-aes-gcm" --purpose "symmetric_encrypt_decrypt" --protection "software" Create an asymmetric RSA encryption key (RSA-2048) - $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "prod-orders-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" + $ stackit kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "prod-orders-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" Create a message authentication key (HMAC-SHA512) - $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "hmac_sha512" --name "api-mac-key" --purpose "message_authentication_code" --protection "software" + $ stackit kms key create --keyring-id "my-keyring-id" --algorithm "hmac_sha512" --name "api-mac-key" --purpose "message_authentication_code" --protection "software" Create an ECDSA P-256 key for signing & verification - $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "ecdsa_p256_sha256" --name "signing-ecdsa-p256" --purpose "asymmetric_sign_verify" --protection "software" + $ stackit kms key create --keyring-id "my-keyring-id" --algorithm "ecdsa_p256_sha256" --name "signing-ecdsa-p256" --purpose "asymmetric_sign_verify" --protection "software" Create an import-only key (versions must be imported) - $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "ext-managed-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --import-only + $ stackit kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "ext-managed-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --import-only Create a key and print the result as YAML - $ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "yaml-output-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --output yaml + $ stackit kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "yaml-output-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --output yaml ``` ### Options @@ -37,7 +37,7 @@ stackit beta kms key create [flags] ``` --algorithm string En-/Decryption / signing algorithm. Possible values: ["aes_256_gcm" "rsa_2048_oaep_sha256" "rsa_3072_oaep_sha256" "rsa_4096_oaep_sha256" "rsa_4096_oaep_sha512" "hmac_sha256" "hmac_sha384" "hmac_sha512" "ecdsa_p256_sha256" "ecdsa_p384_sha384" "ecdsa_p521_sha512"] --description string Optional description of the key - -h, --help Help for "stackit beta kms key create" + -h, --help Help for "stackit kms key create" --import-only States whether versions can be created or only imported --keyring-id string ID of the KMS key ring --name string The display name to distinguish multiple keys @@ -58,5 +58,5 @@ stackit beta kms key create [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_key_delete.md b/docs/stackit_kms_key_delete.md similarity index 73% rename from docs/stackit_beta_kms_key_delete.md rename to docs/stackit_kms_key_delete.md index 1f67c4ff8..4a5418843 100644 --- a/docs/stackit_beta_kms_key_delete.md +++ b/docs/stackit_kms_key_delete.md @@ -1,4 +1,4 @@ -## stackit beta kms key delete +## stackit kms key delete Deletes a KMS key @@ -7,20 +7,20 @@ Deletes a KMS key Deletes a KMS key inside a specific key ring. ``` -stackit beta kms key delete KEY_ID [flags] +stackit kms key delete KEY_ID [flags] ``` ### Examples ``` Delete a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id" - $ stackit beta kms key delete "MY_KEY_ID" --keyring-id "my-keyring-id" + $ stackit kms key delete "MY_KEY_ID" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms key delete" + -h, --help Help for "stackit kms key delete" --keyring-id string ID of the KMS key ring where the key is stored ``` @@ -37,5 +37,5 @@ stackit beta kms key delete KEY_ID [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_key_describe.md b/docs/stackit_kms_key_describe.md similarity index 72% rename from docs/stackit_beta_kms_key_describe.md rename to docs/stackit_kms_key_describe.md index 05e876491..d2921c47c 100644 --- a/docs/stackit_beta_kms_key_describe.md +++ b/docs/stackit_kms_key_describe.md @@ -1,4 +1,4 @@ -## stackit beta kms key describe +## stackit kms key describe Describe a KMS key @@ -7,20 +7,20 @@ Describe a KMS key Describe a KMS key ``` -stackit beta kms key describe KEY_ID [flags] +stackit kms key describe KEY_ID [flags] ``` ### Examples ``` Describe a KMS key with ID xxx of keyring yyy - $ stackit beta kms key describe xxx --keyring-id yyy + $ stackit kms key describe xxx --keyring-id yyy ``` ### Options ``` - -h, --help Help for "stackit beta kms key describe" + -h, --help Help for "stackit kms key describe" --keyring-id string Key Ring ID ``` @@ -37,5 +37,5 @@ stackit beta kms key describe KEY_ID [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_key_import.md b/docs/stackit_kms_key_import.md similarity index 69% rename from docs/stackit_beta_kms_key_import.md rename to docs/stackit_kms_key_import.md index efc1ba47a..99953dacc 100644 --- a/docs/stackit_beta_kms_key_import.md +++ b/docs/stackit_kms_key_import.md @@ -1,4 +1,4 @@ -## stackit beta kms key import +## stackit kms key import Import a KMS key @@ -7,23 +7,23 @@ Import a KMS key After encrypting the secret with the wrapping key’s public key and Base64-encoding it, import it as a new version of the specified KMS key. ``` -stackit beta kms key import KEY_ID [flags] +stackit kms key import KEY_ID [flags] ``` ### Examples ``` Import a new version for the given KMS key "MY_KEY_ID" from literal value - $ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "BASE64_VALUE" --wrapping-key-id "MY_WRAPPING_KEY_ID" + $ stackit kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "BASE64_VALUE" --wrapping-key-id "MY_WRAPPING_KEY_ID" Import from a file - $ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "@path/to/wrapped.key.b64" --wrapping-key-id "MY_WRAPPING_KEY_ID" + $ stackit kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "@path/to/wrapped.key.b64" --wrapping-key-id "MY_WRAPPING_KEY_ID" ``` ### Options ``` - -h, --help Help for "stackit beta kms key import" + -h, --help Help for "stackit kms key import" --keyring-id string ID of the KMS key ring --wrapped-key string The wrapped key material to be imported. Base64-encoded. Pass the value directly or a file path (e.g. @path/to/wrapped.key.b64) --wrapping-key-id string The unique id of the wrapping key the key material has been wrapped with @@ -42,5 +42,5 @@ stackit beta kms key import KEY_ID [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_key_list.md b/docs/stackit_kms_key_list.md similarity index 70% rename from docs/stackit_beta_kms_key_list.md rename to docs/stackit_kms_key_list.md index 766bb0a5d..336d37a6a 100644 --- a/docs/stackit_beta_kms_key_list.md +++ b/docs/stackit_kms_key_list.md @@ -1,4 +1,4 @@ -## stackit beta kms key list +## stackit kms key list List all KMS keys @@ -7,23 +7,23 @@ List all KMS keys List all KMS keys inside a key ring. ``` -stackit beta kms key list [flags] +stackit kms key list [flags] ``` ### Examples ``` List all KMS keys for the key ring "my-keyring-id" - $ stackit beta kms key list --keyring-id "my-keyring-id" + $ stackit kms key list --keyring-id "my-keyring-id" List all KMS keys in JSON format - $ stackit beta kms key list --keyring-id "my-keyring-id" --output-format json + $ stackit kms key list --keyring-id "my-keyring-id" --output-format json ``` ### Options ``` - -h, --help Help for "stackit beta kms key list" + -h, --help Help for "stackit kms key list" --keyring-id string ID of the KMS key ring where the key is stored ``` @@ -40,5 +40,5 @@ stackit beta kms key list [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_key_restore.md b/docs/stackit_kms_key_restore.md similarity index 73% rename from docs/stackit_beta_kms_key_restore.md rename to docs/stackit_kms_key_restore.md index 9abd9a85e..ebe902801 100644 --- a/docs/stackit_beta_kms_key_restore.md +++ b/docs/stackit_kms_key_restore.md @@ -1,4 +1,4 @@ -## stackit beta kms key restore +## stackit kms key restore Restore a key @@ -7,20 +7,20 @@ Restore a key Restores the given key from deletion. ``` -stackit beta kms key restore KEY_ID [flags] +stackit kms key restore KEY_ID [flags] ``` ### Examples ``` Restore a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id" that was scheduled for deletion. - $ stackit beta kms key restore "MY_KEY_ID" --keyring-id "my-keyring-id" + $ stackit kms key restore "MY_KEY_ID" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms key restore" + -h, --help Help for "stackit kms key restore" --keyring-id string ID of the KMS key ring where the key is stored ``` @@ -37,5 +37,5 @@ stackit beta kms key restore KEY_ID [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_key_rotate.md b/docs/stackit_kms_key_rotate.md similarity index 73% rename from docs/stackit_beta_kms_key_rotate.md rename to docs/stackit_kms_key_rotate.md index 7fdbbe3c5..a9152ccf3 100644 --- a/docs/stackit_beta_kms_key_rotate.md +++ b/docs/stackit_kms_key_rotate.md @@ -1,4 +1,4 @@ -## stackit beta kms key rotate +## stackit kms key rotate Rotate a key @@ -7,20 +7,20 @@ Rotate a key Rotates the given key. ``` -stackit beta kms key rotate KEY_ID [flags] +stackit kms key rotate KEY_ID [flags] ``` ### Examples ``` Rotate a KMS key "MY_KEY_ID" and increase its version inside the key ring "my-keyring-id". - $ stackit beta kms key rotate "MY_KEY_ID" --keyring-id "my-keyring-id" + $ stackit kms key rotate "MY_KEY_ID" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms key rotate" + -h, --help Help for "stackit kms key rotate" --keyring-id string ID of the KMS key ring where the key is stored ``` @@ -37,5 +37,5 @@ stackit beta kms key rotate KEY_ID [flags] ### SEE ALSO -* [stackit beta kms key](./stackit_beta_kms_key.md) - Manage KMS keys +* [stackit kms key](./stackit_kms_key.md) - Manage KMS keys diff --git a/docs/stackit_beta_kms_keyring.md b/docs/stackit_kms_keyring.md similarity index 52% rename from docs/stackit_beta_kms_keyring.md rename to docs/stackit_kms_keyring.md index 2d87f99d3..00202422e 100644 --- a/docs/stackit_beta_kms_keyring.md +++ b/docs/stackit_kms_keyring.md @@ -1,4 +1,4 @@ -## stackit beta kms keyring +## stackit kms keyring Manage KMS key rings @@ -7,13 +7,13 @@ Manage KMS key rings Provides functionality for key ring operations inside the KMS ``` -stackit beta kms keyring [flags] +stackit kms keyring [flags] ``` ### Options ``` - -h, --help Help for "stackit beta kms keyring" + -h, --help Help for "stackit kms keyring" ``` ### Options inherited from parent commands @@ -29,9 +29,9 @@ stackit beta kms keyring [flags] ### SEE ALSO -* [stackit beta kms](./stackit_beta_kms.md) - Provides functionality for KMS -* [stackit beta kms keyring create](./stackit_beta_kms_keyring_create.md) - Creates a KMS key ring -* [stackit beta kms keyring delete](./stackit_beta_kms_keyring_delete.md) - Deletes a KMS key ring -* [stackit beta kms keyring describe](./stackit_beta_kms_keyring_describe.md) - Describe a KMS key ring -* [stackit beta kms keyring list](./stackit_beta_kms_keyring_list.md) - Lists all KMS key rings +* [stackit kms](./stackit_kms.md) - Provides functionality for KMS +* [stackit kms keyring create](./stackit_kms_keyring_create.md) - Creates a KMS key ring +* [stackit kms keyring delete](./stackit_kms_keyring_delete.md) - Deletes a KMS key ring +* [stackit kms keyring describe](./stackit_kms_keyring_describe.md) - Describe a KMS key ring +* [stackit kms keyring list](./stackit_kms_keyring_list.md) - Lists all KMS key rings diff --git a/docs/stackit_beta_kms_keyring_create.md b/docs/stackit_kms_keyring_create.md similarity index 67% rename from docs/stackit_beta_kms_keyring_create.md rename to docs/stackit_kms_keyring_create.md index d02e6e13e..e07deb467 100644 --- a/docs/stackit_beta_kms_keyring_create.md +++ b/docs/stackit_kms_keyring_create.md @@ -1,4 +1,4 @@ -## stackit beta kms keyring create +## stackit kms keyring create Creates a KMS key ring @@ -7,27 +7,27 @@ Creates a KMS key ring Creates a KMS key ring. ``` -stackit beta kms keyring create [flags] +stackit kms keyring create [flags] ``` ### Examples ``` Create a KMS key ring with name "my-keyring" - $ stackit beta kms keyring create --name my-keyring + $ stackit kms keyring create --name my-keyring Create a KMS key ring with a description - $ stackit beta kms keyring create --name my-keyring --description my-description + $ stackit kms keyring create --name my-keyring --description my-description Create a KMS key ring and print the result as YAML - $ stackit beta kms keyring create --name my-keyring -o yaml + $ stackit kms keyring create --name my-keyring -o yaml ``` ### Options ``` --description string Optional description of the key ring - -h, --help Help for "stackit beta kms keyring create" + -h, --help Help for "stackit kms keyring create" --name string Name of the KMS key ring ``` @@ -44,5 +44,5 @@ stackit beta kms keyring create [flags] ### SEE ALSO -* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings +* [stackit kms keyring](./stackit_kms_keyring.md) - Manage KMS key rings diff --git a/docs/stackit_beta_kms_keyring_delete.md b/docs/stackit_kms_keyring_delete.md similarity index 71% rename from docs/stackit_beta_kms_keyring_delete.md rename to docs/stackit_kms_keyring_delete.md index d5230f353..e60c0b44a 100644 --- a/docs/stackit_beta_kms_keyring_delete.md +++ b/docs/stackit_kms_keyring_delete.md @@ -1,4 +1,4 @@ -## stackit beta kms keyring delete +## stackit kms keyring delete Deletes a KMS key ring @@ -7,20 +7,20 @@ Deletes a KMS key ring Deletes a KMS key ring. ``` -stackit beta kms keyring delete KEYRING-ID [flags] +stackit kms keyring delete KEYRING-ID [flags] ``` ### Examples ``` Delete a KMS key ring with ID "MY_KEYRING_ID" - $ stackit beta kms keyring delete "MY_KEYRING_ID" + $ stackit kms keyring delete "MY_KEYRING_ID" ``` ### Options ``` - -h, --help Help for "stackit beta kms keyring delete" + -h, --help Help for "stackit kms keyring delete" ``` ### Options inherited from parent commands @@ -36,5 +36,5 @@ stackit beta kms keyring delete KEYRING-ID [flags] ### SEE ALSO -* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings +* [stackit kms keyring](./stackit_kms_keyring.md) - Manage KMS key rings diff --git a/docs/stackit_beta_kms_keyring_describe.md b/docs/stackit_kms_keyring_describe.md similarity index 71% rename from docs/stackit_beta_kms_keyring_describe.md rename to docs/stackit_kms_keyring_describe.md index 9b1381dc0..f36bf9030 100644 --- a/docs/stackit_beta_kms_keyring_describe.md +++ b/docs/stackit_kms_keyring_describe.md @@ -1,4 +1,4 @@ -## stackit beta kms keyring describe +## stackit kms keyring describe Describe a KMS key ring @@ -7,20 +7,20 @@ Describe a KMS key ring Describe a KMS key ring ``` -stackit beta kms keyring describe KEYRING_ID [flags] +stackit kms keyring describe KEYRING_ID [flags] ``` ### Examples ``` Describe a KMS key ring with ID xxx - $ stackit beta kms keyring describe xxx + $ stackit kms keyring describe xxx ``` ### Options ``` - -h, --help Help for "stackit beta kms keyring describe" + -h, --help Help for "stackit kms keyring describe" ``` ### Options inherited from parent commands @@ -36,5 +36,5 @@ stackit beta kms keyring describe KEYRING_ID [flags] ### SEE ALSO -* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings +* [stackit kms keyring](./stackit_kms_keyring.md) - Manage KMS key rings diff --git a/docs/stackit_beta_kms_keyring_list.md b/docs/stackit_kms_keyring_list.md similarity index 70% rename from docs/stackit_beta_kms_keyring_list.md rename to docs/stackit_kms_keyring_list.md index c82dae950..65f3ab323 100644 --- a/docs/stackit_beta_kms_keyring_list.md +++ b/docs/stackit_kms_keyring_list.md @@ -1,4 +1,4 @@ -## stackit beta kms keyring list +## stackit kms keyring list Lists all KMS key rings @@ -7,23 +7,23 @@ Lists all KMS key rings Lists all KMS key rings. ``` -stackit beta kms keyring list [flags] +stackit kms keyring list [flags] ``` ### Examples ``` List all KMS key rings - $ stackit beta kms keyring list + $ stackit kms keyring list List all KMS key rings in JSON format - $ stackit beta kms keyring list --output-format json + $ stackit kms keyring list --output-format json ``` ### Options ``` - -h, --help Help for "stackit beta kms keyring list" + -h, --help Help for "stackit kms keyring list" ``` ### Options inherited from parent commands @@ -39,5 +39,5 @@ stackit beta kms keyring list [flags] ### SEE ALSO -* [stackit beta kms keyring](./stackit_beta_kms_keyring.md) - Manage KMS key rings +* [stackit kms keyring](./stackit_kms_keyring.md) - Manage KMS key rings diff --git a/docs/stackit_kms_version.md b/docs/stackit_kms_version.md new file mode 100644 index 000000000..06b3f23b5 --- /dev/null +++ b/docs/stackit_kms_version.md @@ -0,0 +1,38 @@ +## stackit kms version + +Manage KMS key versions + +### Synopsis + +Provides functionality for key version operations inside the KMS + +``` +stackit kms version [flags] +``` + +### Options + +``` + -h, --help Help for "stackit kms version" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit kms](./stackit_kms.md) - Provides functionality for KMS +* [stackit kms version destroy](./stackit_kms_version_destroy.md) - Destroy a key version +* [stackit kms version disable](./stackit_kms_version_disable.md) - Disable a key version +* [stackit kms version enable](./stackit_kms_version_enable.md) - Enable a key version +* [stackit kms version list](./stackit_kms_version_list.md) - List all key versions +* [stackit kms version restore](./stackit_kms_version_restore.md) - Restore a key version + diff --git a/docs/stackit_beta_kms_version_destroy.md b/docs/stackit_kms_version_destroy.md similarity index 70% rename from docs/stackit_beta_kms_version_destroy.md rename to docs/stackit_kms_version_destroy.md index 8a189ecf2..3145408c1 100644 --- a/docs/stackit_beta_kms_version_destroy.md +++ b/docs/stackit_kms_version_destroy.md @@ -1,4 +1,4 @@ -## stackit beta kms version destroy +## stackit kms version destroy Destroy a key version @@ -7,20 +7,20 @@ Destroy a key version Removes the key material of a version. ``` -stackit beta kms version destroy VERSION_NUMBER [flags] +stackit kms version destroy VERSION_NUMBER [flags] ``` ### Examples ``` Destroy key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" - $ stackit beta kms version destroy 42 --key-id "my-key-id" --keyring-id "my-keyring-id" + $ stackit kms version destroy 42 --key-id "my-key-id" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms version destroy" + -h, --help Help for "stackit kms version destroy" --key-id string ID of the key --keyring-id string ID of the KMS key ring ``` @@ -38,5 +38,5 @@ stackit beta kms version destroy VERSION_NUMBER [flags] ### SEE ALSO -* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions +* [stackit kms version](./stackit_kms_version.md) - Manage KMS key versions diff --git a/docs/stackit_beta_kms_version_disable.md b/docs/stackit_kms_version_disable.md similarity index 70% rename from docs/stackit_beta_kms_version_disable.md rename to docs/stackit_kms_version_disable.md index c2e13a87e..0239dd4c1 100644 --- a/docs/stackit_beta_kms_version_disable.md +++ b/docs/stackit_kms_version_disable.md @@ -1,4 +1,4 @@ -## stackit beta kms version disable +## stackit kms version disable Disable a key version @@ -7,20 +7,20 @@ Disable a key version Disable the given key version. ``` -stackit beta kms version disable VERSION_NUMBER [flags] +stackit kms version disable VERSION_NUMBER [flags] ``` ### Examples ``` Disable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" - $ stackit beta kms version disable 42 --key-id "my-key-id" --keyring-id "my-keyring-id" + $ stackit kms version disable 42 --key-id "my-key-id" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms version disable" + -h, --help Help for "stackit kms version disable" --key-id string ID of the key --keyring-id string ID of the KMS key ring ``` @@ -38,5 +38,5 @@ stackit beta kms version disable VERSION_NUMBER [flags] ### SEE ALSO -* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions +* [stackit kms version](./stackit_kms_version.md) - Manage KMS key versions diff --git a/docs/stackit_beta_kms_version_enable.md b/docs/stackit_kms_version_enable.md similarity index 70% rename from docs/stackit_beta_kms_version_enable.md rename to docs/stackit_kms_version_enable.md index 46d23bec0..bdb59e5d5 100644 --- a/docs/stackit_beta_kms_version_enable.md +++ b/docs/stackit_kms_version_enable.md @@ -1,4 +1,4 @@ -## stackit beta kms version enable +## stackit kms version enable Enable a key version @@ -7,20 +7,20 @@ Enable a key version Enable the given key version. ``` -stackit beta kms version enable VERSION_NUMBER [flags] +stackit kms version enable VERSION_NUMBER [flags] ``` ### Examples ``` Enable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" - $ stackit beta kms version enable 42 --key-id "my-key-id" --keyring-id "my-keyring-id" + $ stackit kms version enable 42 --key-id "my-key-id" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms version enable" + -h, --help Help for "stackit kms version enable" --key-id string ID of the key --keyring-id string ID of the KMS key ring ``` @@ -38,5 +38,5 @@ stackit beta kms version enable VERSION_NUMBER [flags] ### SEE ALSO -* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions +* [stackit kms version](./stackit_kms_version.md) - Manage KMS key versions diff --git a/docs/stackit_beta_kms_version_list.md b/docs/stackit_kms_version_list.md similarity index 68% rename from docs/stackit_beta_kms_version_list.md rename to docs/stackit_kms_version_list.md index bd4a96747..15522ab18 100644 --- a/docs/stackit_beta_kms_version_list.md +++ b/docs/stackit_kms_version_list.md @@ -1,4 +1,4 @@ -## stackit beta kms version list +## stackit kms version list List all key versions @@ -7,23 +7,23 @@ List all key versions List all versions of a given key. ``` -stackit beta kms version list [flags] +stackit kms version list [flags] ``` ### Examples ``` List all key versions for the key "my-key-id" inside the key ring "my-keyring-id" - $ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" + $ stackit kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" List all key versions in JSON format - $ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" -o json + $ stackit kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" -o json ``` ### Options ``` - -h, --help Help for "stackit beta kms version list" + -h, --help Help for "stackit kms version list" --key-id string ID of the key --keyring-id string ID of the KMS key ring ``` @@ -41,5 +41,5 @@ stackit beta kms version list [flags] ### SEE ALSO -* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions +* [stackit kms version](./stackit_kms_version.md) - Manage KMS key versions diff --git a/docs/stackit_beta_kms_version_restore.md b/docs/stackit_kms_version_restore.md similarity index 71% rename from docs/stackit_beta_kms_version_restore.md rename to docs/stackit_kms_version_restore.md index 1562d5fa2..b2bb1519c 100644 --- a/docs/stackit_beta_kms_version_restore.md +++ b/docs/stackit_kms_version_restore.md @@ -1,4 +1,4 @@ -## stackit beta kms version restore +## stackit kms version restore Restore a key version @@ -7,20 +7,20 @@ Restore a key version Restores the specified version of a key. ``` -stackit beta kms version restore VERSION_NUMBER [flags] +stackit kms version restore VERSION_NUMBER [flags] ``` ### Examples ``` Restore key version "42" for the key "my-key-id" inside the key ring "my-keyring-id" - $ stackit beta kms version restore 42 --key-id "my-key-id" --keyring-id "my-keyring-id" + $ stackit kms version restore 42 --key-id "my-key-id" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms version restore" + -h, --help Help for "stackit kms version restore" --key-id string ID of the key --keyring-id string ID of the KMS key ring ``` @@ -38,5 +38,5 @@ stackit beta kms version restore VERSION_NUMBER [flags] ### SEE ALSO -* [stackit beta kms version](./stackit_beta_kms_version.md) - Manage KMS key versions +* [stackit kms version](./stackit_kms_version.md) - Manage KMS key versions diff --git a/docs/stackit_kms_wrapping-key.md b/docs/stackit_kms_wrapping-key.md new file mode 100644 index 000000000..eec6e11a5 --- /dev/null +++ b/docs/stackit_kms_wrapping-key.md @@ -0,0 +1,37 @@ +## stackit kms wrapping-key + +Manage KMS wrapping keys + +### Synopsis + +Provides functionality for wrapping key operations inside the KMS + +``` +stackit kms wrapping-key [flags] +``` + +### Options + +``` + -h, --help Help for "stackit kms wrapping-key" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit kms](./stackit_kms.md) - Provides functionality for KMS +* [stackit kms wrapping-key create](./stackit_kms_wrapping-key_create.md) - Creates a KMS wrapping key +* [stackit kms wrapping-key delete](./stackit_kms_wrapping-key_delete.md) - Deletes a KMS wrapping key +* [stackit kms wrapping-key describe](./stackit_kms_wrapping-key_describe.md) - Describe a KMS wrapping key +* [stackit kms wrapping-key list](./stackit_kms_wrapping-key_list.md) - Lists all KMS wrapping keys + diff --git a/docs/stackit_beta_kms_wrapping-key_create.md b/docs/stackit_kms_wrapping-key_create.md similarity index 72% rename from docs/stackit_beta_kms_wrapping-key_create.md rename to docs/stackit_kms_wrapping-key_create.md index d4087bcbe..616f60ac7 100644 --- a/docs/stackit_beta_kms_wrapping-key_create.md +++ b/docs/stackit_kms_wrapping-key_create.md @@ -1,4 +1,4 @@ -## stackit beta kms wrapping-key create +## stackit kms wrapping-key create Creates a KMS wrapping key @@ -7,17 +7,17 @@ Creates a KMS wrapping key Creates a KMS wrapping key. ``` -stackit beta kms wrapping-key create [flags] +stackit kms wrapping-key create [flags] ``` ### Examples ``` Create a symmetric (RSA + AES) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id" - $ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256_aes_256_key_wrap" --name "my-wrapping-key-name" --purpose "wrap_symmetric_key" --protection "software" + $ stackit kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256_aes_256_key_wrap" --name "my-wrapping-key-name" --purpose "wrap_symmetric_key" --protection "software" Create an asymmetric (RSA) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id" - $ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_3072_oaep_sha256" --name "my-wrapping-key-name" --purpose "wrap_asymmetric_key" --protection "software" + $ stackit kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_3072_oaep_sha256" --name "my-wrapping-key-name" --purpose "wrap_asymmetric_key" --protection "software" ``` ### Options @@ -25,7 +25,7 @@ stackit beta kms wrapping-key create [flags] ``` --algorithm string En-/Decryption / signing algorithm. Possible values: ["rsa_2048_oaep_sha256" "rsa_3072_oaep_sha256" "rsa_4096_oaep_sha256" "rsa_4096_oaep_sha512" "rsa_2048_oaep_sha256_aes_256_key_wrap" "rsa_3072_oaep_sha256_aes_256_key_wrap" "rsa_4096_oaep_sha256_aes_256_key_wrap" "rsa_4096_oaep_sha512_aes_256_key_wrap"] --description string Optional description of the wrapping key - -h, --help Help for "stackit beta kms wrapping-key create" + -h, --help Help for "stackit kms wrapping-key create" --keyring-id string ID of the KMS key ring --name string The display name to distinguish multiple wrapping keys --protection string The underlying system that is responsible for protecting the wrapping key material. Possible values: ["wrap_symmetric_key" "wrap_asymmetric_key"] @@ -45,5 +45,5 @@ stackit beta kms wrapping-key create [flags] ### SEE ALSO -* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys +* [stackit kms wrapping-key](./stackit_kms_wrapping-key.md) - Manage KMS wrapping keys diff --git a/docs/stackit_beta_kms_wrapping-key_delete.md b/docs/stackit_kms_wrapping-key_delete.md similarity index 69% rename from docs/stackit_beta_kms_wrapping-key_delete.md rename to docs/stackit_kms_wrapping-key_delete.md index 0dfd43a03..7504c1782 100644 --- a/docs/stackit_beta_kms_wrapping-key_delete.md +++ b/docs/stackit_kms_wrapping-key_delete.md @@ -1,4 +1,4 @@ -## stackit beta kms wrapping-key delete +## stackit kms wrapping-key delete Deletes a KMS wrapping key @@ -7,20 +7,20 @@ Deletes a KMS wrapping key Deletes a KMS wrapping key inside a specific key ring. ``` -stackit beta kms wrapping-key delete WRAPPING_KEY_ID [flags] +stackit kms wrapping-key delete WRAPPING_KEY_ID [flags] ``` ### Examples ``` Delete a KMS wrapping key "MY_WRAPPING_KEY_ID" inside the key ring "my-keyring-id" - $ stackit beta kms wrapping-key delete "MY_WRAPPING_KEY_ID" --keyring-id "my-keyring-id" + $ stackit kms wrapping-key delete "MY_WRAPPING_KEY_ID" --keyring-id "my-keyring-id" ``` ### Options ``` - -h, --help Help for "stackit beta kms wrapping-key delete" + -h, --help Help for "stackit kms wrapping-key delete" --keyring-id string ID of the KMS key ring where the wrapping key is stored ``` @@ -37,5 +37,5 @@ stackit beta kms wrapping-key delete WRAPPING_KEY_ID [flags] ### SEE ALSO -* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys +* [stackit kms wrapping-key](./stackit_kms_wrapping-key.md) - Manage KMS wrapping keys diff --git a/docs/stackit_beta_kms_wrapping-key_describe.md b/docs/stackit_kms_wrapping-key_describe.md similarity index 68% rename from docs/stackit_beta_kms_wrapping-key_describe.md rename to docs/stackit_kms_wrapping-key_describe.md index 6e82cd595..2d1f484b4 100644 --- a/docs/stackit_beta_kms_wrapping-key_describe.md +++ b/docs/stackit_kms_wrapping-key_describe.md @@ -1,4 +1,4 @@ -## stackit beta kms wrapping-key describe +## stackit kms wrapping-key describe Describe a KMS wrapping key @@ -7,20 +7,20 @@ Describe a KMS wrapping key Describe a KMS wrapping key ``` -stackit beta kms wrapping-key describe WRAPPING_KEY_ID [flags] +stackit kms wrapping-key describe WRAPPING_KEY_ID [flags] ``` ### Examples ``` Describe a KMS wrapping key with ID xxx of keyring yyy - $ stackit beta kms wrappingkey describe xxx --keyring-id yyy + $ stackit kms wrapping-key describe xxx --keyring-id yyy ``` ### Options ``` - -h, --help Help for "stackit beta kms wrapping-key describe" + -h, --help Help for "stackit kms wrapping-key describe" --keyring-id string Key Ring ID ``` @@ -37,5 +37,5 @@ stackit beta kms wrapping-key describe WRAPPING_KEY_ID [flags] ### SEE ALSO -* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys +* [stackit kms wrapping-key](./stackit_kms_wrapping-key.md) - Manage KMS wrapping keys diff --git a/docs/stackit_beta_kms_wrapping-key_list.md b/docs/stackit_kms_wrapping-key_list.md similarity index 67% rename from docs/stackit_beta_kms_wrapping-key_list.md rename to docs/stackit_kms_wrapping-key_list.md index f17c23212..bc9d5dce0 100644 --- a/docs/stackit_beta_kms_wrapping-key_list.md +++ b/docs/stackit_kms_wrapping-key_list.md @@ -1,4 +1,4 @@ -## stackit beta kms wrapping-key list +## stackit kms wrapping-key list Lists all KMS wrapping keys @@ -7,23 +7,23 @@ Lists all KMS wrapping keys Lists all KMS wrapping keys inside a key ring. ``` -stackit beta kms wrapping-key list [flags] +stackit kms wrapping-key list [flags] ``` ### Examples ``` List all KMS wrapping keys for the key ring "my-keyring-id" - $ stackit beta kms wrapping-key list --keyring-id "my-keyring-id" + $ stackit kms wrapping-key list --keyring-id "my-keyring-id" List all KMS wrapping keys in JSON format - $ stackit beta kms wrapping-key list --keyring-id "my-keyring-id" --output-format json + $ stackit kms wrapping-key list --keyring-id "my-keyring-id" --output-format json ``` ### Options ``` - -h, --help Help for "stackit beta kms wrapping-key list" + -h, --help Help for "stackit kms wrapping-key list" --keyring-id string ID of the KMS key ring where the key is stored ``` @@ -40,5 +40,5 @@ stackit beta kms wrapping-key list [flags] ### SEE ALSO -* [stackit beta kms wrapping-key](./stackit_beta_kms_wrapping-key.md) - Manage KMS wrapping keys +* [stackit kms wrapping-key](./stackit_kms_wrapping-key.md) - Manage KMS wrapping keys diff --git a/internal/cmd/beta/beta.go b/internal/cmd/beta/beta.go index ebc082da7..1bcb3ae55 100644 --- a/internal/cmd/beta/beta.go +++ b/internal/cmd/beta/beta.go @@ -9,7 +9,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sfs" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/sqlserverflex" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -47,6 +46,5 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(alb.NewCmd(params)) cmd.AddCommand(edge.NewCmd(params)) cmd.AddCommand(intake.NewCmd(params)) - cmd.AddCommand(kms.NewCmd(params)) cmd.AddCommand(cdn.NewCmd(params)) } diff --git a/internal/cmd/beta/kms/key/create/create.go b/internal/cmd/kms/key/create/create.go similarity index 86% rename from internal/cmd/beta/kms/key/create/create.go rename to internal/cmd/kms/key/create/create.go index de64af6a7..076a2ffa7 100644 --- a/internal/cmd/beta/kms/key/create/create.go +++ b/internal/cmd/kms/key/create/create.go @@ -55,22 +55,22 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Create a symmetric AES key (AES-256) with the name "symm-aes-gcm" under the key ring "my-keyring-id"`, - `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "aes_256_gcm" --name "symm-aes-gcm" --purpose "symmetric_encrypt_decrypt" --protection "software"`), + `$ stackit kms key create --keyring-id "my-keyring-id" --algorithm "aes_256_gcm" --name "symm-aes-gcm" --purpose "symmetric_encrypt_decrypt" --protection "software"`), examples.NewExample( `Create an asymmetric RSA encryption key (RSA-2048)`, - `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "prod-orders-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software"`), + `$ stackit kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "prod-orders-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software"`), examples.NewExample( `Create a message authentication key (HMAC-SHA512)`, - `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "hmac_sha512" --name "api-mac-key" --purpose "message_authentication_code" --protection "software"`), + `$ stackit kms key create --keyring-id "my-keyring-id" --algorithm "hmac_sha512" --name "api-mac-key" --purpose "message_authentication_code" --protection "software"`), examples.NewExample( `Create an ECDSA P-256 key for signing & verification`, - `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "ecdsa_p256_sha256" --name "signing-ecdsa-p256" --purpose "asymmetric_sign_verify" --protection "software"`), + `$ stackit kms key create --keyring-id "my-keyring-id" --algorithm "ecdsa_p256_sha256" --name "signing-ecdsa-p256" --purpose "asymmetric_sign_verify" --protection "software"`), examples.NewExample( `Create an import-only key (versions must be imported)`, - `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "ext-managed-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --import-only`), + `$ stackit kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "ext-managed-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --import-only`), examples.NewExample( `Create a key and print the result as YAML`, - `$ stackit beta kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "yaml-output-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --output yaml`), + `$ stackit kms key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256" --name "yaml-output-rsa" --purpose "asymmetric_encrypt_decrypt" --protection "software" --output yaml`), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/key/create/create_test.go b/internal/cmd/kms/key/create/create_test.go similarity index 100% rename from internal/cmd/beta/kms/key/create/create_test.go rename to internal/cmd/kms/key/create/create_test.go diff --git a/internal/cmd/beta/kms/key/delete/delete.go b/internal/cmd/kms/key/delete/delete.go similarity index 98% rename from internal/cmd/beta/kms/key/delete/delete.go rename to internal/cmd/kms/key/delete/delete.go index d7a6e02f6..a2fb3b3b0 100644 --- a/internal/cmd/beta/kms/key/delete/delete.go +++ b/internal/cmd/kms/key/delete/delete.go @@ -43,7 +43,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Delete a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id"`, - `$ stackit beta kms key delete "MY_KEY_ID" --keyring-id "my-keyring-id"`), + `$ stackit kms key delete "MY_KEY_ID" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/key/delete/delete_test.go b/internal/cmd/kms/key/delete/delete_test.go similarity index 100% rename from internal/cmd/beta/kms/key/delete/delete_test.go rename to internal/cmd/kms/key/delete/delete_test.go diff --git a/internal/cmd/beta/kms/key/describe/describe.go b/internal/cmd/kms/key/describe/describe.go similarity index 98% rename from internal/cmd/beta/kms/key/describe/describe.go rename to internal/cmd/kms/key/describe/describe.go index 4f036c374..7b728c06a 100644 --- a/internal/cmd/beta/kms/key/describe/describe.go +++ b/internal/cmd/kms/key/describe/describe.go @@ -39,7 +39,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Describe a KMS key with ID xxx of keyring yyy`, - `$ stackit beta kms key describe xxx --keyring-id yyy`, + `$ stackit kms key describe xxx --keyring-id yyy`, ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/beta/kms/key/describe/describe_test.go b/internal/cmd/kms/key/describe/describe_test.go similarity index 100% rename from internal/cmd/beta/kms/key/describe/describe_test.go rename to internal/cmd/kms/key/describe/describe_test.go diff --git a/internal/cmd/beta/kms/key/importKey/importKey.go b/internal/cmd/kms/key/importKey/importKey.go similarity index 94% rename from internal/cmd/beta/kms/key/importKey/importKey.go rename to internal/cmd/kms/key/importKey/importKey.go index 38010860e..a04c9e3c5 100644 --- a/internal/cmd/beta/kms/key/importKey/importKey.go +++ b/internal/cmd/kms/key/importKey/importKey.go @@ -48,10 +48,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Import a new version for the given KMS key "MY_KEY_ID" from literal value`, - `$ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "BASE64_VALUE" --wrapping-key-id "MY_WRAPPING_KEY_ID"`), + `$ stackit kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "BASE64_VALUE" --wrapping-key-id "MY_WRAPPING_KEY_ID"`), examples.NewExample( `Import from a file`, - `$ stackit beta kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "@path/to/wrapped.key.b64" --wrapping-key-id "MY_WRAPPING_KEY_ID"`, + `$ stackit kms key import "MY_KEY_ID" --keyring-id "my-keyring-id" --wrapped-key "@path/to/wrapped.key.b64" --wrapping-key-id "MY_WRAPPING_KEY_ID"`, ), ), diff --git a/internal/cmd/beta/kms/key/importKey/importKey_test.go b/internal/cmd/kms/key/importKey/importKey_test.go similarity index 100% rename from internal/cmd/beta/kms/key/importKey/importKey_test.go rename to internal/cmd/kms/key/importKey/importKey_test.go diff --git a/internal/cmd/beta/kms/key/key.go b/internal/cmd/kms/key/key.go similarity index 62% rename from internal/cmd/beta/kms/key/key.go rename to internal/cmd/kms/key/key.go index d1ae57511..4ebf30501 100644 --- a/internal/cmd/beta/kms/key/key.go +++ b/internal/cmd/kms/key/key.go @@ -1,13 +1,13 @@ package key import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/create" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/delete" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/describe" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/importKey" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/restore" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key/rotate" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/importKey" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/restore" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key/rotate" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/beta/kms/key/list/list.go b/internal/cmd/kms/key/list/list.go similarity index 96% rename from internal/cmd/beta/kms/key/list/list.go rename to internal/cmd/kms/key/list/list.go index 576463689..911b63cb1 100644 --- a/internal/cmd/beta/kms/key/list/list.go +++ b/internal/cmd/kms/key/list/list.go @@ -39,10 +39,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `List all KMS keys for the key ring "my-keyring-id"`, - `$ stackit beta kms key list --keyring-id "my-keyring-id"`), + `$ stackit kms key list --keyring-id "my-keyring-id"`), examples.NewExample( `List all KMS keys in JSON format`, - `$ stackit beta kms key list --keyring-id "my-keyring-id" --output-format json`), + `$ stackit kms key list --keyring-id "my-keyring-id" --output-format json`), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/key/list/list_test.go b/internal/cmd/kms/key/list/list_test.go similarity index 100% rename from internal/cmd/beta/kms/key/list/list_test.go rename to internal/cmd/kms/key/list/list_test.go diff --git a/internal/cmd/beta/kms/key/restore/restore.go b/internal/cmd/kms/key/restore/restore.go similarity index 98% rename from internal/cmd/beta/kms/key/restore/restore.go rename to internal/cmd/kms/key/restore/restore.go index c4fc71173..85cab6c89 100644 --- a/internal/cmd/beta/kms/key/restore/restore.go +++ b/internal/cmd/kms/key/restore/restore.go @@ -43,7 +43,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Restore a KMS key "MY_KEY_ID" inside the key ring "my-keyring-id" that was scheduled for deletion.`, - `$ stackit beta kms key restore "MY_KEY_ID" --keyring-id "my-keyring-id"`), + `$ stackit kms key restore "MY_KEY_ID" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/key/restore/restore_test.go b/internal/cmd/kms/key/restore/restore_test.go similarity index 100% rename from internal/cmd/beta/kms/key/restore/restore_test.go rename to internal/cmd/kms/key/restore/restore_test.go diff --git a/internal/cmd/beta/kms/key/rotate/rotate.go b/internal/cmd/kms/key/rotate/rotate.go similarity index 98% rename from internal/cmd/beta/kms/key/rotate/rotate.go rename to internal/cmd/kms/key/rotate/rotate.go index 972234e7e..e02d58384 100644 --- a/internal/cmd/beta/kms/key/rotate/rotate.go +++ b/internal/cmd/kms/key/rotate/rotate.go @@ -43,7 +43,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Rotate a KMS key "MY_KEY_ID" and increase its version inside the key ring "my-keyring-id".`, - `$ stackit beta kms key rotate "MY_KEY_ID" --keyring-id "my-keyring-id"`), + `$ stackit kms key rotate "MY_KEY_ID" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/key/rotate/rotate_test.go b/internal/cmd/kms/key/rotate/rotate_test.go similarity index 100% rename from internal/cmd/beta/kms/key/rotate/rotate_test.go rename to internal/cmd/kms/key/rotate/rotate_test.go diff --git a/internal/cmd/beta/kms/keyring/create/create.go b/internal/cmd/kms/keyring/create/create.go similarity index 95% rename from internal/cmd/beta/kms/keyring/create/create.go rename to internal/cmd/kms/keyring/create/create.go index 0e773b364..433cd4c7c 100644 --- a/internal/cmd/beta/kms/keyring/create/create.go +++ b/internal/cmd/kms/keyring/create/create.go @@ -43,13 +43,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Create a KMS key ring with name "my-keyring"`, - "$ stackit beta kms keyring create --name my-keyring"), + "$ stackit kms keyring create --name my-keyring"), examples.NewExample( `Create a KMS key ring with a description`, - "$ stackit beta kms keyring create --name my-keyring --description my-description"), + "$ stackit kms keyring create --name my-keyring --description my-description"), examples.NewExample( `Create a KMS key ring and print the result as YAML`, - "$ stackit beta kms keyring create --name my-keyring -o yaml"), + "$ stackit kms keyring create --name my-keyring -o yaml"), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/keyring/create/create_test.go b/internal/cmd/kms/keyring/create/create_test.go similarity index 100% rename from internal/cmd/beta/kms/keyring/create/create_test.go rename to internal/cmd/kms/keyring/create/create_test.go diff --git a/internal/cmd/beta/kms/keyring/delete/delete.go b/internal/cmd/kms/keyring/delete/delete.go similarity index 98% rename from internal/cmd/beta/kms/keyring/delete/delete.go rename to internal/cmd/kms/keyring/delete/delete.go index 6e028c75b..8aa00db2b 100644 --- a/internal/cmd/beta/kms/keyring/delete/delete.go +++ b/internal/cmd/kms/keyring/delete/delete.go @@ -37,7 +37,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Delete a KMS key ring with ID "MY_KEYRING_ID"`, - `$ stackit beta kms keyring delete "MY_KEYRING_ID"`), + `$ stackit kms keyring delete "MY_KEYRING_ID"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/keyring/delete/delete_test.go b/internal/cmd/kms/keyring/delete/delete_test.go similarity index 100% rename from internal/cmd/beta/kms/keyring/delete/delete_test.go rename to internal/cmd/kms/keyring/delete/delete_test.go diff --git a/internal/cmd/beta/kms/keyring/describe/describe.go b/internal/cmd/kms/keyring/describe/describe.go similarity index 98% rename from internal/cmd/beta/kms/keyring/describe/describe.go rename to internal/cmd/kms/keyring/describe/describe.go index ed90cee8d..b378ddd6c 100644 --- a/internal/cmd/beta/kms/keyring/describe/describe.go +++ b/internal/cmd/kms/keyring/describe/describe.go @@ -36,7 +36,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Describe a KMS key ring with ID xxx`, - `$ stackit beta kms keyring describe xxx`, + `$ stackit kms keyring describe xxx`, ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/beta/kms/keyring/describe/describe_test.go b/internal/cmd/kms/keyring/describe/describe_test.go similarity index 100% rename from internal/cmd/beta/kms/keyring/describe/describe_test.go rename to internal/cmd/kms/keyring/describe/describe_test.go diff --git a/internal/cmd/beta/kms/keyring/keyring.go b/internal/cmd/kms/keyring/keyring.go similarity index 71% rename from internal/cmd/beta/kms/keyring/keyring.go rename to internal/cmd/kms/keyring/keyring.go index 8683a6907..237991e5c 100644 --- a/internal/cmd/beta/kms/keyring/keyring.go +++ b/internal/cmd/kms/keyring/keyring.go @@ -1,10 +1,10 @@ package keyring import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/create" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/delete" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/describe" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/keyring/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/keyring/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/keyring/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/keyring/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/beta/kms/keyring/list/list.go b/internal/cmd/kms/keyring/list/list.go similarity index 97% rename from internal/cmd/beta/kms/keyring/list/list.go rename to internal/cmd/kms/keyring/list/list.go index 240992c43..4928d67d3 100644 --- a/internal/cmd/beta/kms/keyring/list/list.go +++ b/internal/cmd/kms/keyring/list/list.go @@ -33,10 +33,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `List all KMS key rings`, - "$ stackit beta kms keyring list"), + "$ stackit kms keyring list"), examples.NewExample( `List all KMS key rings in JSON format`, - "$ stackit beta kms keyring list --output-format json"), + "$ stackit kms keyring list --output-format json"), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/keyring/list/list_test.go b/internal/cmd/kms/keyring/list/list_test.go similarity index 100% rename from internal/cmd/beta/kms/keyring/list/list_test.go rename to internal/cmd/kms/keyring/list/list_test.go diff --git a/internal/cmd/beta/kms/kms.go b/internal/cmd/kms/kms.go similarity index 72% rename from internal/cmd/beta/kms/kms.go rename to internal/cmd/kms/kms.go index 1adfc3004..46dc38c0b 100644 --- a/internal/cmd/beta/kms/kms.go +++ b/internal/cmd/kms/kms.go @@ -1,10 +1,10 @@ package kms import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/key" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/keyring" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/key" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/keyring" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/version" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/wrappingkey" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/beta/kms/version/destroy/destroy.go b/internal/cmd/kms/version/destroy/destroy.go similarity index 97% rename from internal/cmd/beta/kms/version/destroy/destroy.go rename to internal/cmd/kms/version/destroy/destroy.go index b33d5d5b6..3b15e6e06 100644 --- a/internal/cmd/beta/kms/version/destroy/destroy.go +++ b/internal/cmd/kms/version/destroy/destroy.go @@ -44,7 +44,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Destroy key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, - `$ stackit beta kms version destroy 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + `$ stackit kms version destroy 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/version/destroy/destroy_test.go b/internal/cmd/kms/version/destroy/destroy_test.go similarity index 100% rename from internal/cmd/beta/kms/version/destroy/destroy_test.go rename to internal/cmd/kms/version/destroy/destroy_test.go diff --git a/internal/cmd/beta/kms/version/disable/disable.go b/internal/cmd/kms/version/disable/disable.go similarity index 98% rename from internal/cmd/beta/kms/version/disable/disable.go rename to internal/cmd/kms/version/disable/disable.go index 9260c8e6a..9c9be870d 100644 --- a/internal/cmd/beta/kms/version/disable/disable.go +++ b/internal/cmd/kms/version/disable/disable.go @@ -46,7 +46,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Disable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, - `$ stackit beta kms version disable 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + `$ stackit kms version disable 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/version/disable/disable_test.go b/internal/cmd/kms/version/disable/disable_test.go similarity index 100% rename from internal/cmd/beta/kms/version/disable/disable_test.go rename to internal/cmd/kms/version/disable/disable_test.go diff --git a/internal/cmd/beta/kms/version/enable/enable.go b/internal/cmd/kms/version/enable/enable.go similarity index 98% rename from internal/cmd/beta/kms/version/enable/enable.go rename to internal/cmd/kms/version/enable/enable.go index 06d8a85ec..131bf3821 100644 --- a/internal/cmd/beta/kms/version/enable/enable.go +++ b/internal/cmd/kms/version/enable/enable.go @@ -46,7 +46,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Enable key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, - `$ stackit beta kms version enable 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + `$ stackit kms version enable 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/version/enable/enable_test.go b/internal/cmd/kms/version/enable/enable_test.go similarity index 100% rename from internal/cmd/beta/kms/version/enable/enable_test.go rename to internal/cmd/kms/version/enable/enable_test.go diff --git a/internal/cmd/beta/kms/version/list/list.go b/internal/cmd/kms/version/list/list.go similarity index 95% rename from internal/cmd/beta/kms/version/list/list.go rename to internal/cmd/kms/version/list/list.go index f9f606ac2..7d3fcccc9 100644 --- a/internal/cmd/beta/kms/version/list/list.go +++ b/internal/cmd/kms/version/list/list.go @@ -41,10 +41,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `List all key versions for the key "my-key-id" inside the key ring "my-keyring-id"`, - `$ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id"`), + `$ stackit kms version list --key-id "my-key-id" --keyring-id "my-keyring-id"`), examples.NewExample( `List all key versions in JSON format`, - `$ stackit beta kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" -o json`), + `$ stackit kms version list --key-id "my-key-id" --keyring-id "my-keyring-id" -o json`), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/version/list/list_test.go b/internal/cmd/kms/version/list/list_test.go similarity index 100% rename from internal/cmd/beta/kms/version/list/list_test.go rename to internal/cmd/kms/version/list/list_test.go diff --git a/internal/cmd/beta/kms/version/restore/restore.go b/internal/cmd/kms/version/restore/restore.go similarity index 97% rename from internal/cmd/beta/kms/version/restore/restore.go rename to internal/cmd/kms/version/restore/restore.go index 2f5f0882d..304f5a146 100644 --- a/internal/cmd/beta/kms/version/restore/restore.go +++ b/internal/cmd/kms/version/restore/restore.go @@ -44,7 +44,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Restore key version "42" for the key "my-key-id" inside the key ring "my-keyring-id"`, - `$ stackit beta kms version restore 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), + `$ stackit kms version restore 42 --key-id "my-key-id" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/version/restore/restore_test.go b/internal/cmd/kms/version/restore/restore_test.go similarity index 100% rename from internal/cmd/beta/kms/version/restore/restore_test.go rename to internal/cmd/kms/version/restore/restore_test.go diff --git a/internal/cmd/beta/kms/version/version.go b/internal/cmd/kms/version/version.go similarity index 67% rename from internal/cmd/beta/kms/version/version.go rename to internal/cmd/kms/version/version.go index 60b642679..e1a7d56fe 100644 --- a/internal/cmd/beta/kms/version/version.go +++ b/internal/cmd/kms/version/version.go @@ -1,11 +1,11 @@ package version import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/destroy" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/disable" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/enable" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/list" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/version/restore" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/version/destroy" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/version/disable" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/version/enable" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/version/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/version/restore" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/beta/kms/wrappingkey/create/create.go b/internal/cmd/kms/wrappingkey/create/create.go similarity index 94% rename from internal/cmd/beta/kms/wrappingkey/create/create.go rename to internal/cmd/kms/wrappingkey/create/create.go index 885c3b3e2..fc972126c 100644 --- a/internal/cmd/beta/kms/wrappingkey/create/create.go +++ b/internal/cmd/kms/wrappingkey/create/create.go @@ -53,10 +53,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Create a symmetric (RSA + AES) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id"`, - `$ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256_aes_256_key_wrap" --name "my-wrapping-key-name" --purpose "wrap_symmetric_key" --protection "software"`), + `$ stackit kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_2048_oaep_sha256_aes_256_key_wrap" --name "my-wrapping-key-name" --purpose "wrap_symmetric_key" --protection "software"`), examples.NewExample( `Create an asymmetric (RSA) KMS wrapping key with name "my-wrapping-key-name" in key ring with ID "my-keyring-id"`, - `$ stackit beta kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_3072_oaep_sha256" --name "my-wrapping-key-name" --purpose "wrap_asymmetric_key" --protection "software"`), + `$ stackit kms wrapping-key create --keyring-id "my-keyring-id" --algorithm "rsa_3072_oaep_sha256" --name "my-wrapping-key-name" --purpose "wrap_asymmetric_key" --protection "software"`), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/wrappingkey/create/create_test.go b/internal/cmd/kms/wrappingkey/create/create_test.go similarity index 100% rename from internal/cmd/beta/kms/wrappingkey/create/create_test.go rename to internal/cmd/kms/wrappingkey/create/create_test.go diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete.go b/internal/cmd/kms/wrappingkey/delete/delete.go similarity index 97% rename from internal/cmd/beta/kms/wrappingkey/delete/delete.go rename to internal/cmd/kms/wrappingkey/delete/delete.go index 75ce76a05..2f572d58c 100644 --- a/internal/cmd/beta/kms/wrappingkey/delete/delete.go +++ b/internal/cmd/kms/wrappingkey/delete/delete.go @@ -41,7 +41,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Delete a KMS wrapping key "MY_WRAPPING_KEY_ID" inside the key ring "my-keyring-id"`, - `$ stackit beta kms wrapping-key delete "MY_WRAPPING_KEY_ID" --keyring-id "my-keyring-id"`), + `$ stackit kms wrapping-key delete "MY_WRAPPING_KEY_ID" --keyring-id "my-keyring-id"`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/wrappingkey/delete/delete_test.go b/internal/cmd/kms/wrappingkey/delete/delete_test.go similarity index 100% rename from internal/cmd/beta/kms/wrappingkey/delete/delete_test.go rename to internal/cmd/kms/wrappingkey/delete/delete_test.go diff --git a/internal/cmd/beta/kms/wrappingkey/describe/describe.go b/internal/cmd/kms/wrappingkey/describe/describe.go similarity index 98% rename from internal/cmd/beta/kms/wrappingkey/describe/describe.go rename to internal/cmd/kms/wrappingkey/describe/describe.go index f8edb6921..d7ec6a2f8 100644 --- a/internal/cmd/beta/kms/wrappingkey/describe/describe.go +++ b/internal/cmd/kms/wrappingkey/describe/describe.go @@ -39,7 +39,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Describe a KMS wrapping key with ID xxx of keyring yyy`, - `$ stackit beta kms wrappingkey describe xxx --keyring-id yyy`, + `$ stackit kms wrapping-key describe xxx --keyring-id yyy`, ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/beta/kms/wrappingkey/describe/describe_test.go b/internal/cmd/kms/wrappingkey/describe/describe_test.go similarity index 100% rename from internal/cmd/beta/kms/wrappingkey/describe/describe_test.go rename to internal/cmd/kms/wrappingkey/describe/describe_test.go diff --git a/internal/cmd/beta/kms/wrappingkey/list/list.go b/internal/cmd/kms/wrappingkey/list/list.go similarity index 96% rename from internal/cmd/beta/kms/wrappingkey/list/list.go rename to internal/cmd/kms/wrappingkey/list/list.go index dbb514812..2046f6392 100644 --- a/internal/cmd/beta/kms/wrappingkey/list/list.go +++ b/internal/cmd/kms/wrappingkey/list/list.go @@ -39,10 +39,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `List all KMS wrapping keys for the key ring "my-keyring-id"`, - `$ stackit beta kms wrapping-key list --keyring-id "my-keyring-id"`), + `$ stackit kms wrapping-key list --keyring-id "my-keyring-id"`), examples.NewExample( `List all KMS wrapping keys in JSON format`, - `$ stackit beta kms wrapping-key list --keyring-id "my-keyring-id" --output-format json`), + `$ stackit kms wrapping-key list --keyring-id "my-keyring-id" --output-format json`), ), RunE: func(cmd *cobra.Command, _ []string) error { ctx := context.Background() diff --git a/internal/cmd/beta/kms/wrappingkey/list/list_test.go b/internal/cmd/kms/wrappingkey/list/list_test.go similarity index 100% rename from internal/cmd/beta/kms/wrappingkey/list/list_test.go rename to internal/cmd/kms/wrappingkey/list/list_test.go diff --git a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go b/internal/cmd/kms/wrappingkey/wrappingkey.go similarity index 70% rename from internal/cmd/beta/kms/wrappingkey/wrappingkey.go rename to internal/cmd/kms/wrappingkey/wrappingkey.go index 2aaa14640..ab873566d 100644 --- a/internal/cmd/beta/kms/wrappingkey/wrappingkey.go +++ b/internal/cmd/kms/wrappingkey/wrappingkey.go @@ -1,10 +1,10 @@ package wrappingkey import ( - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/create" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/delete" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/describe" - "github.com/stackitcloud/stackit-cli/internal/cmd/beta/kms/wrappingkey/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/wrappingkey/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/wrappingkey/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/wrappingkey/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms/wrappingkey/list" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/root.go b/internal/cmd/root.go index a264bddef..c120ccc76 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -17,6 +17,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/git" "github.com/stackitcloud/stackit-cli/internal/cmd/image" keypair "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair" + "github.com/stackitcloud/stackit-cli/internal/cmd/kms" loadbalancer "github.com/stackitcloud/stackit-cli/internal/cmd/load-balancer" "github.com/stackitcloud/stackit-cli/internal/cmd/logme" "github.com/stackitcloud/stackit-cli/internal/cmd/logs" @@ -197,6 +198,7 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(quota.NewCmd(params)) cmd.AddCommand(affinityGroups.NewCmd(params)) cmd.AddCommand(git.NewCmd(params)) + cmd.AddCommand(kms.NewCmd(params)) } // traverseCommands calls f for c and all of its children. From 6628b230d28b913ea75bacce0205a5a2166db6f8 Mon Sep 17 00:00:00 2001 From: Mauritz Uphoff <39736813+h3adex@users.noreply.github.com> Date: Mon, 16 Mar 2026 11:32:44 +0100 Subject: [PATCH 401/422] feat(iaas): onboard routing-table command (#1339) relates to STACKITCLI-281 --- docs/stackit.md | 1 + docs/stackit_network_create.md | 4 + docs/stackit_network_update.md | 4 + docs/stackit_routing-table.md | 41 ++ docs/stackit_routing-table_create.md | 56 +++ docs/stackit_routing-table_delete.md | 42 ++ docs/stackit_routing-table_describe.md | 42 ++ docs/stackit_routing-table_list.md | 50 +++ docs/stackit_routing-table_update.md | 59 +++ internal/cmd/network/create/create.go | 19 +- internal/cmd/network/create/create_test.go | 51 ++- internal/cmd/network/describe/describe.go | 5 + internal/cmd/network/list/list.go | 3 +- internal/cmd/network/update/update.go | 17 +- internal/cmd/network/update/update_test.go | 13 + internal/cmd/root.go | 2 + internal/cmd/routingtable/create/create.go | 160 +++++++ .../cmd/routingtable/create/create_test.go | 348 +++++++++++++++ internal/cmd/routingtable/delete/delete.go | 116 +++++ .../cmd/routingtable/delete/delete_test.go | 144 ++++++ .../cmd/routingtable/describe/describe.go | 151 +++++++ .../routingtable/describe/describe_test.go | 221 ++++++++++ internal/cmd/routingtable/list/list.go | 175 ++++++++ internal/cmd/routingtable/list/list_test.go | 280 ++++++++++++ internal/cmd/routingtable/routingtable.go | 38 ++ internal/cmd/routingtable/update/update.go | 179 ++++++++ .../cmd/routingtable/update/update_test.go | 414 ++++++++++++++++++ internal/pkg/services/iaas/utils/utils.go | 13 + .../pkg/services/iaas/utils/utils_test.go | 129 ++++-- 29 files changed, 2735 insertions(+), 42 deletions(-) create mode 100644 docs/stackit_routing-table.md create mode 100644 docs/stackit_routing-table_create.md create mode 100644 docs/stackit_routing-table_delete.md create mode 100644 docs/stackit_routing-table_describe.md create mode 100644 docs/stackit_routing-table_list.md create mode 100644 docs/stackit_routing-table_update.md create mode 100644 internal/cmd/routingtable/create/create.go create mode 100644 internal/cmd/routingtable/create/create_test.go create mode 100644 internal/cmd/routingtable/delete/delete.go create mode 100644 internal/cmd/routingtable/delete/delete_test.go create mode 100644 internal/cmd/routingtable/describe/describe.go create mode 100644 internal/cmd/routingtable/describe/describe_test.go create mode 100644 internal/cmd/routingtable/list/list.go create mode 100644 internal/cmd/routingtable/list/list_test.go create mode 100644 internal/cmd/routingtable/routingtable.go create mode 100644 internal/cmd/routingtable/update/update.go create mode 100644 internal/cmd/routingtable/update/update_test.go diff --git a/docs/stackit.md b/docs/stackit.md index 88f1a5707..f2caf941a 100644 --- a/docs/stackit.md +++ b/docs/stackit.md @@ -54,6 +54,7 @@ stackit [flags] * [stackit quota](./stackit_quota.md) - Manage server quotas * [stackit rabbitmq](./stackit_rabbitmq.md) - Provides functionality for RabbitMQ * [stackit redis](./stackit_redis.md) - Provides functionality for Redis +* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes * [stackit secrets-manager](./stackit_secrets-manager.md) - Provides functionality for Secrets Manager * [stackit security-group](./stackit_security-group.md) - Manage security groups * [stackit server](./stackit_server.md) - Provides functionality for servers diff --git a/docs/stackit_network_create.md b/docs/stackit_network_create.md index 146264977..44934bee3 100644 --- a/docs/stackit_network_create.md +++ b/docs/stackit_network_create.md @@ -30,6 +30,9 @@ stackit network create [flags] Create an IPv6 network with name "network-1" with DNS name servers, a prefix and a gateway $ stackit network create --name network-1 --ipv6-dns-name-servers "2001:4860:4860::8888,2001:4860:4860::8844" --ipv6-prefix "2001:4860:4860::8888" --ipv6-gateway "2001:4860:4860::8888" + + Create a network with name "network-1" and attach routing-table "xxx" + $ stackit network create --name network-1 --routing-table-id xxx ``` ### Options @@ -49,6 +52,7 @@ stackit network create [flags] --no-ipv4-gateway If set to true, the network doesn't have an IPv4 gateway --no-ipv6-gateway If set to true, the network doesn't have an IPv6 gateway --non-routed If set to true, the network is not routed and therefore not accessible from other networks + --routing-table-id string The ID of the routing-table for the network ``` ### Options inherited from parent commands diff --git a/docs/stackit_network_update.md b/docs/stackit_network_update.md index 313ce68fa..7069b26d2 100644 --- a/docs/stackit_network_update.md +++ b/docs/stackit_network_update.md @@ -24,6 +24,9 @@ stackit network update NETWORK_ID [flags] Update IPv6 network with ID "xxx" with new name "network-1-new", new gateway and new DNS name servers $ stackit network update xxx --name network-1-new --ipv6-dns-name-servers "2001:4860:4860::8888" --ipv6-gateway "2001:4860:4860::8888" + + Update network with ID "xxx" with new routing-table id "xxx" + $ stackit network update xxx --routing-table-id xxx ``` ### Options @@ -38,6 +41,7 @@ stackit network update NETWORK_ID [flags] -n, --name string Network name --no-ipv4-gateway If set to true, the network doesn't have an IPv4 gateway --no-ipv6-gateway If set to true, the network doesn't have an IPv6 gateway + --routing-table-id string The ID of the routing-table for the network ``` ### Options inherited from parent commands diff --git a/docs/stackit_routing-table.md b/docs/stackit_routing-table.md new file mode 100644 index 000000000..7f943ecb4 --- /dev/null +++ b/docs/stackit_routing-table.md @@ -0,0 +1,41 @@ +## stackit routing-table + +Manage routing-tables and its according routes + +### Synopsis + +Manage routing-tables and their associated routes. + +This API is currently available only to selected customers. +To request access, please contact your account manager or submit a support ticket. + +``` +stackit routing-table [flags] +``` + +### Options + +``` + -h, --help Help for "stackit routing-table" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit](./stackit.md) - Manage STACKIT resources using the command line +* [stackit routing-table create](./stackit_routing-table_create.md) - Creates a routing-table +* [stackit routing-table delete](./stackit_routing-table_delete.md) - Deletes a routing-table +* [stackit routing-table describe](./stackit_routing-table_describe.md) - Describes a routing-table +* [stackit routing-table list](./stackit_routing-table_list.md) - Lists all routing-tables +* [stackit routing-table update](./stackit_routing-table_update.md) - Updates a routing-table + diff --git a/docs/stackit_routing-table_create.md b/docs/stackit_routing-table_create.md new file mode 100644 index 000000000..4b82559b6 --- /dev/null +++ b/docs/stackit_routing-table_create.md @@ -0,0 +1,56 @@ +## stackit routing-table create + +Creates a routing-table + +### Synopsis + +Creates a routing-table. + +``` +stackit routing-table create [flags] +``` + +### Examples + +``` + Create a routing-table with name "rt" + stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" + + Create a routing-table with name "rt" and description "some description" + stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --description "some description" + + Create a routing-table with name "rt" with system routes disabled + stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --system-routes=false + + Create a routing-table with name "rt" with dynamic routes disabled + stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --dynamic-routes=false +``` + +### Options + +``` + --description string Description of the routing-table + --dynamic-routes If set to false, prevents dynamic routes from propagating to the routing table. (default true) + -h, --help Help for "stackit routing-table create" + --labels stringToString Key=value labels (default []) + --name string Name of the routing-table + --network-area-id string Network-Area ID + --organization-id string Organization ID + --system-routes If set to false, disables routes for project-to-project communication. (default true) +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes + diff --git a/docs/stackit_routing-table_delete.md b/docs/stackit_routing-table_delete.md new file mode 100644 index 000000000..0dab98d6f --- /dev/null +++ b/docs/stackit_routing-table_delete.md @@ -0,0 +1,42 @@ +## stackit routing-table delete + +Deletes a routing-table + +### Synopsis + +Deletes a routing-table + +``` +stackit routing-table delete ROUTING_TABLE_ID [flags] +``` + +### Examples + +``` + Delete a routing-table with ID "xxx" + $ stackit routing-table delete xxx --organization-id yyy --network-area-id zzz +``` + +### Options + +``` + -h, --help Help for "stackit routing-table delete" + --network-area-id string Network-Area ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes + diff --git a/docs/stackit_routing-table_describe.md b/docs/stackit_routing-table_describe.md new file mode 100644 index 000000000..b30a226cb --- /dev/null +++ b/docs/stackit_routing-table_describe.md @@ -0,0 +1,42 @@ +## stackit routing-table describe + +Describes a routing-table + +### Synopsis + +Describes a routing-table + +``` +stackit routing-table describe ROUTING_TABLE_ID [flags] +``` + +### Examples + +``` + Describe a routing-table + $ stackit routing-table describe xxx --organization-id xxx --network-area-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit routing-table describe" + --network-area-id string Network-Area ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes + diff --git a/docs/stackit_routing-table_list.md b/docs/stackit_routing-table_list.md new file mode 100644 index 000000000..d45350821 --- /dev/null +++ b/docs/stackit_routing-table_list.md @@ -0,0 +1,50 @@ +## stackit routing-table list + +Lists all routing-tables + +### Synopsis + +Lists all routing-tables + +``` +stackit routing-table list [flags] +``` + +### Examples + +``` + List all routing-tables + $ stackit routing-table list --organization-id xxx --network-area-id yyy + + List all routing-tables with labels + $ stackit routing-table list --label-selector env=dev,env=rc --organization-id xxx --network-area-id yyy + + List all routing-tables with labels and set limit to 10 + $ stackit routing-table list --label-selector env=dev,env=rc --limit 10 --organization-id xxx --network-area-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit routing-table list" + --label-selector string Filter by label + --limit int Maximum number of entries to list + --network-area-id string Network-Area ID + --organization-id string Organization ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes + diff --git a/docs/stackit_routing-table_update.md b/docs/stackit_routing-table_update.md new file mode 100644 index 000000000..9b747cd72 --- /dev/null +++ b/docs/stackit_routing-table_update.md @@ -0,0 +1,59 @@ +## stackit routing-table update + +Updates a routing-table + +### Synopsis + +Updates a routing-table. + +``` +stackit routing-table update ROUTING_TABLE_ID [flags] +``` + +### Examples + +``` + Updates the label(s) of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" + $ stackit routing-table update xxx --labels key=value,foo=bar --organization-id yyy --network-area-id zzz + + Updates the name of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" + $ stackit routing-table update xxx --name foo --organization-id yyy --network-area-id zzz + + Updates the description of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" + $ stackit routing-table update xxx --description foo --organization-id yyy --network-area-id zzz + + Disables the dynamic routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" + $ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --dynamic-routes=false + + Disables the system routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" + $ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --system-routes=false +``` + +### Options + +``` + --description string Description of the routing-table + --dynamic-routes If set to false, prevents dynamic routes from propagating to the routing table. + -h, --help Help for "stackit routing-table update" + --labels stringToString Key=value labels (default []) + --name string Name of the routing-table + --network-area-id string Network-Area ID + --organization-id string Organization ID + --system-routes If set to false, disables routes for project-to-project communication. +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes + diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index fee9123ce..bb180a176 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -35,6 +35,7 @@ const ( nonRoutedFlag = "non-routed" noIpv4GatewayFlag = "no-ipv4-gateway" noIpv6GatewayFlag = "no-ipv6-gateway" + routingTableIdFlag = "routing-table-id" labelFlag = "labels" ) @@ -52,6 +53,7 @@ type inputModel struct { NonRouted bool NoIPv4Gateway bool NoIPv6Gateway bool + RoutingTableID *string Labels *map[string]string } @@ -86,6 +88,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { `Create an IPv6 network with name "network-1" with DNS name servers, a prefix and a gateway`, `$ stackit network create --name network-1 --ipv6-dns-name-servers "2001:4860:4860::8888,2001:4860:4860::8844" --ipv6-prefix "2001:4860:4860::8888" --ipv6-gateway "2001:4860:4860::8888"`, ), + examples.NewExample( + `Create a network with name "network-1" and attach routing-table "xxx"`, + `$ stackit network create --name network-1 --routing-table-id xxx`, + ), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -157,6 +163,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(nonRoutedFlag, false, "If set to true, the network is not routed and therefore not accessible from other networks") cmd.Flags().Bool(noIpv4GatewayFlag, false, "If set to true, the network doesn't have an IPv4 gateway") cmd.Flags().Bool(noIpv6GatewayFlag, false, "If set to true, the network doesn't have an IPv6 gateway") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "The ID of the routing-table for the network") cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network. E.g. '--labels key1=value1,key2=value2,...'") // IPv4 checks @@ -195,6 +202,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, NonRouted: flags.FlagToBoolValue(p, cmd, nonRoutedFlag), NoIPv4Gateway: flags.FlagToBoolValue(p, cmd, noIpv4GatewayFlag), NoIPv6Gateway: flags.FlagToBoolValue(p, cmd, noIpv6GatewayFlag), + RoutingTableID: flags.FlagToStringPointer(p, cmd, routingTableIdFlag), Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } @@ -288,11 +296,12 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } payload := iaas.CreateNetworkPayload{ - Name: model.Name, - Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), - Routed: utils.Ptr(!model.NonRouted), - Ipv4: ipv4Network, - Ipv6: ipv6Network, + Name: model.Name, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + Routed: utils.Ptr(!model.NonRouted), + Ipv4: ipv4Network, + Ipv6: ipv6Network, + RoutingTableId: model.RoutingTableID, } return req.CreateNetworkPayload(payload) diff --git a/internal/cmd/network/create/create_test.go b/internal/cmd/network/create/create_test.go index dbb2ea6d3..c933f5a7b 100644 --- a/internal/cmd/network/create/create_test.go +++ b/internal/cmd/network/create/create_test.go @@ -40,9 +40,10 @@ var ( type testCtxKey struct{} var ( - testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") - testClient = &iaas.APIClient{} - testProjectId = uuid.NewString() + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &iaas.APIClient{} + testProjectId = uuid.NewString() + testRoutingTableId = uuid.NewString() ) func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { @@ -50,9 +51,10 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st globalflags.ProjectIdFlag: testProjectId, globalflags.RegionFlag: testRegion, - nameFlag: testNetworkName, - nonRoutedFlag: strconv.FormatBool(testNonRouted), - labelFlag: "key=value", + nameFlag: testNetworkName, + nonRoutedFlag: strconv.FormatBool(testNonRouted), + labelFlag: "key=value", + routingTableIdFlag: testRoutingTableId, } for _, mod := range mods { mod(flagValues) @@ -102,6 +104,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { Labels: utils.Ptr(map[string]string{ "key": "value", }), + RoutingTableID: utils.Ptr(testRoutingTableId), } for _, mod := range mods { mod(model) @@ -169,6 +172,7 @@ func fixturePayload(mods ...func(payload *iaas.CreateNetworkPayload)) iaas.Creat Labels: utils.Ptr(map[string]interface{}{ "key": "value", }), + RoutingTableId: utils.Ptr(testRoutingTableId), } for _, mod := range mods { mod(&payload) @@ -469,6 +473,24 @@ func TestParseInput(t *testing.T) { }), isValid: true, }, + { + description: "routing-table id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[routingTableIdFlag] = "invalid-uuid" + }), + expectedModel: nil, + isValid: false, + }, + { + description: "routing-table id not set", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, routingTableIdFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.RoutingTableID = nil + }), + }, } for _, tt := range tests { @@ -531,6 +553,23 @@ func TestBuildRequest(t *testing.T) { Routed: utils.Ptr(false), }), }, + { + description: "network with routing-table id attached", + model: &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + Name: utils.Ptr(testNetworkName), + RoutingTableID: utils.Ptr(testRoutingTableId), + }, + expectedRequest: testClient.CreateNetwork(testCtx, testProjectId, testRegion).CreateNetworkPayload(iaas.CreateNetworkPayload{ + Name: utils.Ptr(testNetworkName), + RoutingTableId: utils.Ptr(testRoutingTableId), + Routed: utils.Ptr(true), + }), + }, { description: "use ipv4 dns servers and prefix length", model: &inputModel{ diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index ab81a8c48..5a0a27969 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -151,6 +151,11 @@ func outputResult(p *print.Printer, outputFormat string, network *iaas.Network) table.AddRow("ROUTED", routed) table.AddSeparator() + if network.RoutingTableId != nil { + table.AddRow("ROUTING TABLE ID", utils.PtrString(network.RoutingTableId)) + table.AddSeparator() + } + if ipv4Gateway != nil { table.AddRow("IPv4 GATEWAY", *ipv4Gateway) table.AddSeparator() diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index 3b1fabea5..ba55e8869 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -141,7 +141,7 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli func outputResult(p *print.Printer, outputFormat string, networks []iaas.Network) error { return p.OutputResult(outputFormat, networks, func() error { table := tables.NewTable() - table.SetHeader("ID", "NAME", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED") + table.SetHeader("ID", "NAME", "STATUS", "PUBLIC IP", "PREFIXES", "ROUTED", "ROUTING TABLE ID") for _, network := range networks { var publicIp, prefixes string @@ -162,6 +162,7 @@ func outputResult(p *print.Printer, outputFormat string, networks []iaas.Network publicIp, prefixes, routed, + utils.PtrString(network.RoutingTableId), ) table.AddSeparator() } diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index 13e7e5acc..ba496a3ec 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -32,6 +32,7 @@ const ( ipv6GatewayFlag = "ipv6-gateway" noIpv4GatewayFlag = "no-ipv4-gateway" noIpv6GatewayFlag = "no-ipv6-gateway" + routingTableIdFlag = "routing-table-id" labelFlag = "labels" ) @@ -45,6 +46,7 @@ type inputModel struct { IPv6Gateway *string NoIPv4Gateway bool NoIPv6Gateway bool + RoutingTableId *string Labels *map[string]string } @@ -71,6 +73,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { `Update IPv6 network with ID "xxx" with new name "network-1-new", new gateway and new DNS name servers`, `$ stackit network update xxx --name network-1-new --ipv6-dns-name-servers "2001:4860:4860::8888" --ipv6-gateway "2001:4860:4860::8888"`, ), + examples.NewExample( + `Update network with ID "xxx" with new routing-table id "xxx"`, + `$ stackit network update xxx --routing-table-id xxx`, + ), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -138,6 +144,7 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().String(ipv6GatewayFlag, "", "The IPv6 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway") cmd.Flags().Bool(noIpv4GatewayFlag, false, "If set to true, the network doesn't have an IPv4 gateway") cmd.Flags().Bool(noIpv6GatewayFlag, false, "If set to true, the network doesn't have an IPv6 gateway") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "The ID of the routing-table for the network") cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a network. E.g. '--labels key1=value1,key2=value2,...'") } @@ -159,6 +166,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu IPv6Gateway: flags.FlagToStringPointer(p, cmd, ipv6GatewayFlag), NoIPv4Gateway: flags.FlagToBoolValue(p, cmd, noIpv4GatewayFlag), NoIPv6Gateway: flags.FlagToBoolValue(p, cmd, noIpv6GatewayFlag), + RoutingTableId: flags.FlagToStringPointer(p, cmd, routingTableIdFlag), Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), } @@ -196,10 +204,11 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli } payload := iaas.PartialUpdateNetworkPayload{ - Name: model.Name, - Ipv4: payloadIPv4, - Ipv6: payloadIPv6, - Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + Name: model.Name, + Ipv4: payloadIPv4, + Ipv6: payloadIPv6, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + RoutingTableId: model.RoutingTableId, } return req.PartialUpdateNetworkPayload(payload) diff --git a/internal/cmd/network/update/update_test.go b/internal/cmd/network/update/update_test.go index 87b533c0a..628b93190 100644 --- a/internal/cmd/network/update/update_test.go +++ b/internal/cmd/network/update/update_test.go @@ -27,6 +27,7 @@ var testClient = &iaas.APIClient{} var testProjectId = uuid.NewString() var testNetworkId = uuid.NewString() +var testRoutingTableId = uuid.NewString() func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ @@ -49,6 +50,7 @@ func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]st ipv6DnsNameServersFlag: "2001:4860:4860::8888,2001:4860:4860::8844", ipv6GatewayFlag: "2001:4860:4860::8888", labelFlag: "key=value", + routingTableIdFlag: testRoutingTableId, } for _, mod := range mods { mod(flagValues) @@ -72,6 +74,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { Labels: utils.Ptr(map[string]string{ "key": "value", }), + RoutingTableId: utils.Ptr(testRoutingTableId), } for _, mod := range mods { mod(model) @@ -102,6 +105,7 @@ func fixturePayload(mods ...func(payload *iaas.PartialUpdateNetworkPayload)) iaa Nameservers: utils.Ptr([]string{"2001:4860:4860::8888", "2001:4860:4860::8844"}), Gateway: iaas.NewNullableString(utils.Ptr("2001:4860:4860::8888")), }, + RoutingTableId: utils.Ptr(testRoutingTableId), } for _, mod := range mods { mod(&payload) @@ -241,6 +245,15 @@ func TestParseInput(t *testing.T) { }), isValid: true, }, + { + description: "route-table id wrong format", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[routingTableIdFlag] = "wrong-format" + }), + expectedModel: nil, + isValid: false, + }, } for _, tt := range tests { diff --git a/internal/cmd/root.go b/internal/cmd/root.go index c120ccc76..0e6b72df4 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -36,6 +36,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/quota" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq" "github.com/stackitcloud/stackit-cli/internal/cmd/redis" + "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable" secretsmanager "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager" securitygroup "github.com/stackitcloud/stackit-cli/internal/cmd/security-group" "github.com/stackitcloud/stackit-cli/internal/cmd/server" @@ -186,6 +187,7 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(secretsmanager.NewCmd(params)) cmd.AddCommand(serviceaccount.NewCmd(params)) cmd.AddCommand(ske.NewCmd(params)) + cmd.AddCommand(routingtable.NewCmd(params)) cmd.AddCommand(server.NewCmd(params)) cmd.AddCommand(networkArea.NewCmd(params)) cmd.AddCommand(network.NewCmd(params)) diff --git a/internal/cmd/routingtable/create/create.go b/internal/cmd/routingtable/create/create.go new file mode 100644 index 000000000..d01aaf754 --- /dev/null +++ b/internal/cmd/routingtable/create/create.go @@ -0,0 +1,160 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + descriptionFlag = "description" + labelFlag = "labels" + nameFlag = "name" + networkAreaIdFlag = "network-area-id" + dynamicRoutesFlag = "dynamic-routes" + systemRoutesFlag = "system-routes" + organizationIdFlag = "organization-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Description *string + Labels *map[string]string + Name string + NetworkAreaId string + SystemRoutes bool + DynamicRoutes bool + OrganizationId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a routing-table", + Long: "Creates a routing-table.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a routing-table with name "rt"`, + `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt"`, + ), + examples.NewExample( + `Create a routing-table with name "rt" and description "some description"`, + `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --description "some description"`, + ), + examples.NewExample( + `Create a routing-table with name "rt" with system routes disabled`, + `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --system-routes=false`, + ), + examples.NewExample( + `Create a routing-table with name "rt" with dynamic routes disabled`, + `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --dynamic-routes=false`, + ), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, nil) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + prompt := fmt.Sprintf("Are you sure you want to create the routing-table %q?", model.Name) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + req, err := buildRequest(ctx, model, apiClient) + if err != nil { + return err + } + + routingTableResp, err := req.Execute() + if err != nil { + return fmt.Errorf("create routing-table request failed: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, routingTableResp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(descriptionFlag, "", "Description of the routing-table") + cmd.Flags().StringToString(labelFlag, nil, "Key=value labels") + cmd.Flags().String(nameFlag, "", "Name of the routing-table") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Bool(dynamicRoutesFlag, true, "If set to false, prevents dynamic routes from propagating to the routing table.") + cmd.Flags().Bool(systemRoutesFlag, true, "If set to false, disables routes for project-to-project communication.") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag, nameFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := &inputModel{ + GlobalFlagModel: globalFlags, + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + DynamicRoutes: flags.FlagToBoolValue(p, cmd, dynamicRoutesFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), + Name: flags.FlagToStringValue(p, cmd, nameFlag), + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + SystemRoutes: flags.FlagToBoolValue(p, cmd, systemRoutesFlag), + } + + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) (iaas.ApiAddRoutingTableToAreaRequest, error) { + payload := iaas.AddRoutingTableToAreaPayload{ + Description: model.Description, + Name: utils.Ptr(model.Name), + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + SystemRoutes: utils.Ptr(model.SystemRoutes), + DynamicRoutes: utils.Ptr(model.DynamicRoutes), + } + + return apiClient.AddRoutingTableToArea( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + ).AddRoutingTableToAreaPayload(payload), nil +} + +func outputResult(p *print.Printer, outputFormat string, routingTable *iaas.RoutingTable) error { + if routingTable == nil { + return fmt.Errorf("routing-table is nil") + } + + if routingTable.Id == nil { + return fmt.Errorf("create routing-table id is empty") + } + + return p.OutputResult(outputFormat, routingTable, func() error { + p.Outputf("Created Routing-Table with ID %q\n", utils.PtrString(routingTable.Id)) + return nil + }) +} diff --git a/internal/cmd/routingtable/create/create_test.go b/internal/cmd/routingtable/create/create_test.go new file mode 100644 index 000000000..a4becd7fb --- /dev/null +++ b/internal/cmd/routingtable/create/create_test.go @@ -0,0 +1,348 @@ +package create + +import ( + "context" + "strconv" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() + +const testRoutingTableName = "test" +const testRoutingTableDescription = "test" + +const testSystemRoutesFlag = true +const testDynamicRoutesFlag = true + +const testLabelSelectorFlag = "key1=value1,key2=value2" + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + descriptionFlag: testRoutingTableDescription, + nameFlag: testRoutingTableName, + systemRoutesFlag: strconv.FormatBool(testSystemRoutesFlag), + dynamicRoutesFlag: strconv.FormatBool(testDynamicRoutesFlag), + labelFlag: testLabelSelectorFlag, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + Name: testRoutingTableName, + Description: utils.Ptr(testRoutingTableDescription), + SystemRoutes: testSystemRoutesFlag, + DynamicRoutes: testDynamicRoutesFlag, + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiAddRoutingTableToAreaRequest)) iaas.ApiAddRoutingTableToAreaRequest { + request := testClient.AddRoutingTableToArea(testCtx, testOrgId, testNetworkAreaId, testRegion) + request = request.AddRoutingTableToAreaPayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *iaas.AddRoutingTableToAreaPayload)) iaas.AddRoutingTableToAreaPayload { + payload := iaas.AddRoutingTableToAreaPayload{ + Description: utils.Ptr(testRoutingTableDescription), + Name: utils.Ptr(testRoutingTableName), + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + SystemRoutes: utils.Ptr(true), + DynamicRoutes: utils.Ptr(true), + } + + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "valid input", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "dynamic routes disabled", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[dynamicRoutesFlag] = "false" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.DynamicRoutes = false + }), + }, + { + description: "system routes disabled", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[systemRoutesFlag] = "false" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.SystemRoutes = false + }), + }, + { + description: "missing organization ID", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "invalid organization ID - empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid organization ID - format", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing network area ID", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "invalid network area ID - empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid network area ID - format", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing name", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nameFlag) + }), + isValid: false, + }, + { + description: "missing labels", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, labelFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Labels = nil + }), + }, + { + description: "missing description", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, descriptionFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + }), + }, + { + description: "no flags provided", + flagValues: map[string]string{}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiAddRoutingTableToAreaRequest + }{ + { + description: "valid input", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "labels missing", + model: fixtureInputModel(func(model *inputModel) { + model.Labels = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutingTableToAreaRequest) { + *request = (*request).AddRoutingTableToAreaPayload( + fixturePayload(func(payload *iaas.AddRoutingTableToAreaPayload) { + payload.Labels = nil + }), + ) + }), + }, + { + description: "system routes disabled", + model: fixtureInputModel(func(model *inputModel) { + model.SystemRoutes = false + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutingTableToAreaRequest) { + *request = (*request).AddRoutingTableToAreaPayload( + fixturePayload(func(payload *iaas.AddRoutingTableToAreaPayload) { + payload.SystemRoutes = utils.Ptr(false) + }), + ) + }), + }, + { + description: "dynamic routes disabled", + model: fixtureInputModel(func(model *inputModel) { + model.DynamicRoutes = false + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutingTableToAreaRequest) { + *request = (*request).AddRoutingTableToAreaPayload( + fixturePayload(func(payload *iaas.AddRoutingTableToAreaPayload) { + payload.DynamicRoutes = utils.Ptr(false) + }), + ) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request, err := buildRequest(testCtx, tt.model, testClient) + if err != nil { + t.Fatalf("buildRequest returned error: %v", err) + } + + if diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx)); diff != "" { + t.Errorf("buildRequest() mismatch (-got +want):\n%s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRoutingTable := iaas.RoutingTable{ + Id: utils.Ptr("id-foo"), + Name: utils.Ptr("route-table-foo"), + Description: utils.Ptr("description-foo"), + SystemRoutes: utils.Ptr(true), + DynamicRoutes: utils.Ptr(true), + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + CreatedAt: utils.Ptr(time.Now()), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + routingTable *iaas.RoutingTable + wantErr bool + }{ + { + name: "nil routing-table should return error", + outputFormat: "", + routingTable: nil, + wantErr: true, + }, + { + name: "empty routing-table", + outputFormat: print.PrettyOutputFormat, + routingTable: &iaas.RoutingTable{}, + wantErr: true, + }, + { + name: "pretty output routing-table", + outputFormat: print.PrettyOutputFormat, + routingTable: &dummyRoutingTable, + wantErr: false, + }, + { + name: "json output routing-table", + outputFormat: print.JSONOutputFormat, + routingTable: &dummyRoutingTable, + wantErr: false, + }, + { + name: "yaml output routing-table", + outputFormat: print.YAMLOutputFormat, + routingTable: &dummyRoutingTable, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, tt.routingTable); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/routingtable/delete/delete.go b/internal/cmd/routingtable/delete/delete.go new file mode 100644 index 000000000..9f111d321 --- /dev/null +++ b/internal/cmd/routingtable/delete/delete.go @@ -0,0 +1,116 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + routingTableIdArg = "ROUTING_TABLE_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + NetworkAreaId string + OrganizationId string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", routingTableIdArg), + Short: "Deletes a routing-table", + Long: "Deletes a routing-table", + Args: args.SingleArg(routingTableIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete a routing-table with ID "xxx"`, + `$ stackit routing-table delete xxx --organization-id yyy --network-area-id zzz`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + routingTableLabel, err := iaasUtils.GetRoutingTableOfAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region, model.RoutingTableId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get routing-table name: %v", err) + routingTableLabel = model.RoutingTableId + } else if routingTableLabel == "" { + routingTableLabel = model.RoutingTableId + } + + prompt := fmt.Sprintf("Are you sure you want to delete the routing-table %q?", routingTableLabel) + + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := apiClient.DeleteRoutingTableFromArea( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + ) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete routing-table: %w", err) + } + + params.Printer.Outputf("Routing-table %q deleted.", model.RoutingTableId) + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + routingTableId := inputArgs[0] + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RoutingTableId: routingTableId, + } + + p.DebugInputModel(model) + return &model, nil +} diff --git a/internal/cmd/routingtable/delete/delete_test.go b/internal/cmd/routingtable/delete/delete_test.go new file mode 100644 index 000000000..1b34d702b --- /dev/null +++ b/internal/cmd/routingtable/delete/delete_test.go @@ -0,0 +1,144 @@ +package delete + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" +) + +const testRegion = "eu01" + +var ( + testOrgId = uuid.NewString() + testNetworkAreaId = uuid.NewString() + testRoutingTableId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "valid input", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(func(m *inputModel) { + m.RoutingTableId = testRoutingTableId + }), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "missing organization ID", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "invalid organization ID - empty", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid organization ID - format", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing network area ID", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "invalid network area ID - empty", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid network area ID - format", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing routing-table ID", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "invalid routing-table ID - format", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "invalid routing-table ID - empty", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[routingTableIdArg] = "" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} diff --git a/internal/cmd/routingtable/describe/describe.go b/internal/cmd/routingtable/describe/describe.go new file mode 100644 index 000000000..f843f0c3a --- /dev/null +++ b/internal/cmd/routingtable/describe/describe.go @@ -0,0 +1,151 @@ +package describe + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + routingTableIdArg = "ROUTING_TABLE_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + NetworkAreaId string + OrganizationId string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", routingTableIdArg), + Short: "Describes a routing-table", + Long: "Describes a routing-table", + Args: args.SingleArg(routingTableIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a routing-table`, + `$ stackit routing-table describe xxx --organization-id xxx --network-area-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + request := apiClient.GetRoutingTableOfArea( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + ) + + response, err := request.Execute() + if err != nil { + return fmt.Errorf("describe routing-tables: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, response) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + routingTableId := inputArgs[0] + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RoutingTableId: routingTableId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, routingTable *iaas.RoutingTable) error { + if routingTable == nil { + return fmt.Errorf("describe routingtable response is empty") + } + + return p.OutputResult(outputFormat, routingTable, func() error { + table := tables.NewTable() + + table.AddRow("ID", utils.PtrString(routingTable.Id)) + table.AddSeparator() + + table.AddRow("NAME", utils.PtrString(routingTable.Name)) + table.AddSeparator() + + table.AddRow("DESCRIPTION", utils.PtrString(routingTable.Description)) + table.AddSeparator() + + table.AddRow("DEFAULT", utils.PtrString(routingTable.Default)) + table.AddSeparator() + + if routingTable.Labels != nil && len(*routingTable.Labels) > 0 { + var labels []string + for key, value := range *routingTable.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + table.AddRow("LABELS", strings.Join(labels, "\n")) + table.AddSeparator() + } + + table.AddRow("SYSTEM ROUTES", utils.PtrString(routingTable.SystemRoutes)) + table.AddSeparator() + + table.AddRow("DYNAMIC ROUTES", utils.PtrString(routingTable.DynamicRoutes)) + table.AddSeparator() + + table.AddRow("CREATED AT", utils.ConvertTimePToDateTimeString(routingTable.CreatedAt)) + table.AddSeparator() + + table.AddRow("UPDATED AT", utils.ConvertTimePToDateTimeString(routingTable.UpdatedAt)) + table.AddSeparator() + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/routingtable/describe/describe_test.go b/internal/cmd/routingtable/describe/describe_test.go new file mode 100644 index 000000000..5e8f76ea4 --- /dev/null +++ b/internal/cmd/routingtable/describe/describe_test.go @@ -0,0 +1,221 @@ +package describe + +import ( + "testing" + "time" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() +var testRoutingTableId = uuid.NewString() + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRoutingTableId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + argValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "valid input", + flagValues: fixtureFlagValues(), + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "missing organization ID", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "invalid organization ID - empty", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid organization ID - format", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing network area ID", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "invalid network area ID - empty", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "invalid network area ID - format", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "missing routing-table ID", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "invalid routing-table ID - format", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRouteTable := iaas.RoutingTable{ + CreatedAt: utils.Ptr(time.Now()), + Default: nil, + Description: utils.Ptr("description"), + Id: utils.Ptr("route-foo"), + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: utils.Ptr("route-foo"), + SystemRoutes: utils.Ptr(true), + DynamicRoutes: utils.Ptr(true), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + routingTable *iaas.RoutingTable + wantErr bool + }{ + { + name: "nil routing table", + outputFormat: print.PrettyOutputFormat, + routingTable: nil, + wantErr: true, + }, + { + name: "empty routing table", + outputFormat: print.PrettyOutputFormat, + routingTable: &iaas.RoutingTable{}, + wantErr: false, + }, + { + name: "json empty routing table", + outputFormat: print.JSONOutputFormat, + routingTable: &iaas.RoutingTable{}, + wantErr: false, + }, + { + name: "pretty output one route", + outputFormat: print.PrettyOutputFormat, + routingTable: &dummyRouteTable, + wantErr: false, + }, + { + name: "json output one route", + outputFormat: print.JSONOutputFormat, + routingTable: &dummyRouteTable, + wantErr: false, + }, + { + name: "yaml output one route", + outputFormat: print.YAMLOutputFormat, + routingTable: &dummyRouteTable, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, tt.routingTable); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/routingtable/list/list.go b/internal/cmd/routingtable/list/list.go new file mode 100644 index 000000000..3c676317a --- /dev/null +++ b/internal/cmd/routingtable/list/list.go @@ -0,0 +1,175 @@ +package list + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + labelSelectorFlag = "label-selector" + limitFlag = "limit" + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + LabelSelector *string + Limit *int64 + NetworkAreaId string + OrganizationId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all routing-tables", + Long: "Lists all routing-tables", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all routing-tables`, + `$ stackit routing-table list --organization-id xxx --network-area-id yyy`, + ), + examples.NewExample( + `List all routing-tables with labels`, + `$ stackit routing-table list --label-selector env=dev,env=rc --organization-id xxx --network-area-id yyy`, + ), + examples.NewExample( + `List all routing-tables with labels and set limit to 10`, + `$ stackit routing-table list --label-selector env=dev,env=rc --limit 10 --organization-id xxx --network-area-id yyy`, + ), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, nil) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + request := buildRequest(ctx, model, apiClient) + + response, err := request.Execute() + if err != nil { + return fmt.Errorf("list routing-tables: %w", err) + } + + routingTables := utils.GetSliceFromPointer(response.Items) + + // Truncate output + if model.Limit != nil && len(routingTables) > int(*model.Limit) { + routingTables = routingTables[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, routingTables, model.OrganizationId) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + cmd.Flags().String(labelSelectorFlag, "", "Filter by label") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), + Limit: limit, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiListRoutingTablesOfAreaRequest { + request := apiClient.ListRoutingTablesOfArea(ctx, model.OrganizationId, model.NetworkAreaId, model.Region) + if model.LabelSelector != nil { + request = request.LabelSelector(*model.LabelSelector) + } + + return request +} + +func outputResult(p *print.Printer, outputFormat string, routingTables []iaas.RoutingTable, orgId string) error { + if routingTables == nil { + return fmt.Errorf("list routing-table items are nil") + } + + return p.OutputResult(outputFormat, routingTables, func() error { + if len(routingTables) == 0 { + p.Outputf("No routing-tables found for organization %q\n", orgId) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "NAME", "DESCRIPTION", "DEFAULT", "LABELS", "SYSTEM ROUTES", "DYNAMIC ROUTES", "CREATED AT", "UPDATED AT") + for _, routingTable := range routingTables { + var labels []string + if routingTable.Labels != nil && len(*routingTable.Labels) > 0 { + for key, value := range *routingTable.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + } + + table.AddRow( + utils.PtrString(routingTable.Id), + utils.PtrString(routingTable.Name), + utils.PtrString(routingTable.Description), + utils.PtrString(routingTable.Default), + strings.Join(labels, "\n"), + utils.PtrString(routingTable.SystemRoutes), + utils.PtrString(routingTable.DynamicRoutes), + utils.ConvertTimePToDateTimeString(routingTable.CreatedAt), + utils.ConvertTimePToDateTimeString(routingTable.UpdatedAt), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/routingtable/list/list_test.go b/internal/cmd/routingtable/list/list_test.go new file mode 100644 index 000000000..ef7ec9849 --- /dev/null +++ b/internal/cmd/routingtable/list/list_test.go @@ -0,0 +1,280 @@ +package list + +import ( + "context" + "strconv" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() + +const testLabelSelectorFlag = "key1=value1,key2=value2" + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} +var testLimitFlag = int64(10) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + labelSelectorFlag: testLabelSelectorFlag, + limitFlag: strconv.Itoa(int(testLimitFlag)), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureRequest(mods ...func(request *iaas.ApiListRoutingTablesOfAreaRequest)) iaas.ApiListRoutingTablesOfAreaRequest { + request := testClient.ListRoutingTablesOfArea(testCtx, testOrgId, testNetworkAreaId, testRegion) + request = request.LabelSelector(testLabelSelectorFlag) + + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + LabelSelector: utils.Ptr(testLabelSelectorFlag), + Limit: utils.Ptr(testLimitFlag), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "valid input", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "missing network area ID", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "missing organization ID", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "missing labels", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, labelSelectorFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.LabelSelector = nil + }), + }, + { + description: "missing limit", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, limitFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = nil + }), + }, + { + description: "invalid limit flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "negative limit flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-10" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRouteTable := iaas.RoutingTable{ + CreatedAt: utils.Ptr(time.Now()), + Default: nil, + Description: utils.Ptr("description"), + Id: utils.Ptr("route-foo"), + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: utils.Ptr("route-foo"), + SystemRoutes: utils.Ptr(true), + DynamicRoutes: utils.Ptr(true), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + routingTable []iaas.RoutingTable + wantErr bool + }{ + { + name: "nil routing table", + outputFormat: print.PrettyOutputFormat, + routingTable: nil, + wantErr: true, + }, + { + name: "pretty empty routing table", + outputFormat: print.PrettyOutputFormat, + routingTable: []iaas.RoutingTable{}, + wantErr: false, + }, + { + name: "json empty routing table", + outputFormat: print.JSONOutputFormat, + routingTable: []iaas.RoutingTable{}, + wantErr: false, + }, + { + name: "yaml empty routing table", + outputFormat: print.YAMLOutputFormat, + routingTable: []iaas.RoutingTable{}, + wantErr: false, + }, + { + name: "pretty empty routing table in slice", + outputFormat: print.PrettyOutputFormat, + routingTable: []iaas.RoutingTable{{}}, + wantErr: false, + }, + { + name: "yaml empty routing table in slice", + outputFormat: print.YAMLOutputFormat, + routingTable: []iaas.RoutingTable{{}}, + wantErr: false, + }, + { + name: "pretty output with one route", + outputFormat: print.PrettyOutputFormat, + routingTable: []iaas.RoutingTable{dummyRouteTable}, + wantErr: false, + }, + { + name: "pretty output with multiple routes", + outputFormat: print.PrettyOutputFormat, + routingTable: []iaas.RoutingTable{dummyRouteTable, dummyRouteTable, dummyRouteTable}, + wantErr: false, + }, + { + name: "json output with one route", + outputFormat: print.JSONOutputFormat, + routingTable: []iaas.RoutingTable{dummyRouteTable}, + wantErr: false, + }, + { + name: "yaml output with one route", + outputFormat: print.YAMLOutputFormat, + routingTable: []iaas.RoutingTable{dummyRouteTable}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, tt.routingTable, "dummy-org-id"); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiListRoutingTablesOfAreaRequest + }{ + { + description: "valid input with label selector", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "missing label selector", + model: fixtureInputModel(func(model *inputModel) { + model.LabelSelector = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiListRoutingTablesOfAreaRequest) { + *request = testClient.ListRoutingTablesOfArea(testCtx, testOrgId, testNetworkAreaId, testRegion) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + if diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx)); diff != "" { + t.Errorf("buildRequest() mismatch (-got +want):\n%s", diff) + } + }) + } +} diff --git a/internal/cmd/routingtable/routingtable.go b/internal/cmd/routingtable/routingtable.go new file mode 100644 index 000000000..ebc9eae7a --- /dev/null +++ b/internal/cmd/routingtable/routingtable.go @@ -0,0 +1,38 @@ +package routingtable + +import ( + "github.com/spf13/cobra" + rtCreate "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/create" + rtDelete "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/delete" + rtDescribe "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/describe" + rtList "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/list" + rtUpdate "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "routing-table", + Short: "Manage routing-tables and its according routes", + Long: `Manage routing-tables and their associated routes. + +This API is currently available only to selected customers. +To request access, please contact your account manager or submit a support ticket.`, + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand( + rtCreate.NewCmd(params), + rtUpdate.NewCmd(params), + rtList.NewCmd(params), + rtDescribe.NewCmd(params), + rtDelete.NewCmd(params), + ) +} diff --git a/internal/cmd/routingtable/update/update.go b/internal/cmd/routingtable/update/update.go new file mode 100644 index 000000000..bdf4d377b --- /dev/null +++ b/internal/cmd/routingtable/update/update.go @@ -0,0 +1,179 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + descriptionFlag = "description" + labelFlag = "labels" + nameFlag = "name" + networkAreaIdFlag = "network-area-id" + dynamicRoutesFlag = "dynamic-routes" + systemRoutesFlag = "system-routes" + organizationIdFlag = "organization-id" + routingTableIdArg = "ROUTING_TABLE_ID" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + OrganizationId string + NetworkAreaId string + DynamicRoutes *bool + SystemRoutes *bool + RoutingTableId string + Description *string + Labels *map[string]string + Name *string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", routingTableIdArg), + Short: "Updates a routing-table", + Long: "Updates a routing-table.", + Args: args.SingleArg(routingTableIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Updates the label(s) of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, + "$ stackit routing-table update xxx --labels key=value,foo=bar --organization-id yyy --network-area-id zzz", + ), + examples.NewExample( + `Updates the name of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, + "$ stackit routing-table update xxx --name foo --organization-id yyy --network-area-id zzz", + ), + examples.NewExample( + `Updates the description of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, + "$ stackit routing-table update xxx --description foo --organization-id yyy --network-area-id zzz", + ), + examples.NewExample( + `Disables the dynamic routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, + "$ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --dynamic-routes=false", + ), + examples.NewExample( + `Disables the system routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, + "$ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --system-routes=false", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + routingTableLabel, err := iaasUtils.GetRoutingTableOfAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region, model.RoutingTableId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get routing-table name: %v", err) + routingTableLabel = model.RoutingTableId + } else if routingTableLabel == "" { + routingTableLabel = model.RoutingTableId + } + + prompt := fmt.Sprintf("Are you sure you want to update the routing-table %q?", routingTableLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update routing-table %q : %w", model.RoutingTableId, err) + } + + return outputResult(params.Printer, model.OutputFormat, model.NetworkAreaId, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(descriptionFlag, "", "Description of the routing-table") + cmd.Flags().String(nameFlag, "", "Name of the routing-table") + cmd.Flags().StringToString(labelFlag, nil, "Key=value labels") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Bool(dynamicRoutesFlag, false, "If set to false, prevents dynamic routes from propagating to the routing table.") + cmd.Flags().Bool(systemRoutesFlag, false, "If set to false, disables routes for project-to-project communication.") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag) + cmd.MarkFlagsOneRequired(dynamicRoutesFlag, systemRoutesFlag, nameFlag, descriptionFlag, labelFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + routeTableId := inputArgs[0] + + model := inputModel{ + GlobalFlagModel: globalFlags, + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), + Name: flags.FlagToStringPointer(p, cmd, nameFlag), + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + SystemRoutes: flags.FlagToBoolPointer(p, cmd, systemRoutesFlag), + DynamicRoutes: flags.FlagToBoolPointer(p, cmd, dynamicRoutesFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RoutingTableId: routeTableId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, networkAreaId string, routingTable *iaas.RoutingTable) error { + return p.OutputResult(outputFormat, routingTable, func() error { + if routingTable == nil { + return fmt.Errorf("update routing-table response is empty") + } + + if routingTable.Id == nil { + return fmt.Errorf("update routing-table id is empty") + } + + p.Outputf("Updated routing-table %q in network-area %q.", *routingTable.Id, networkAreaId) + return nil + }) +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateRoutingTableOfAreaRequest { + req := apiClient.UpdateRoutingTableOfArea( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + ) + + payload := iaas.UpdateRoutingTableOfAreaPayload{ + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + Name: model.Name, + Description: model.Description, + DynamicRoutes: model.DynamicRoutes, + SystemRoutes: model.SystemRoutes, + } + + return req.UpdateRoutingTableOfAreaPayload(payload) +} diff --git a/internal/cmd/routingtable/update/update_test.go b/internal/cmd/routingtable/update/update_test.go new file mode 100644 index 000000000..7ed4f47dd --- /dev/null +++ b/internal/cmd/routingtable/update/update_test.go @@ -0,0 +1,414 @@ +package update + +import ( + "context" + "strconv" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() +var testRoutingTableId = uuid.NewString() + +const testRoutingTableName = "test" +const testRoutingTableDescription = "test" +const testLabelSelectorFlag = "key1=value1,key2=value2" + +const testSystemRoutesFlag = true +const testDynamicRoutesFlag = true + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + descriptionFlag: testRoutingTableDescription, + nameFlag: testRoutingTableName, + systemRoutesFlag: strconv.FormatBool(testSystemRoutesFlag), + dynamicRoutesFlag: strconv.FormatBool(testDynamicRoutesFlag), + labelFlag: testLabelSelectorFlag, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + Name: utils.Ptr(testRoutingTableName), + Description: utils.Ptr(testRoutingTableDescription), + SystemRoutes: utils.Ptr(testSystemRoutesFlag), + DynamicRoutes: utils.Ptr(testDynamicRoutesFlag), + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRoutingTableId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureRequest(mods ...func(request *iaas.ApiUpdateRoutingTableOfAreaRequest)) iaas.ApiUpdateRoutingTableOfAreaRequest { + req := testClient.UpdateRoutingTableOfArea( + testCtx, + testOrgId, + testNetworkAreaId, + testRegion, + testRoutingTableId, + ) + + payload := iaas.UpdateRoutingTableOfAreaPayload{ + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: utils.Ptr(testRoutingTableName), + Description: utils.Ptr(testRoutingTableDescription), + DynamicRoutes: utils.Ptr(true), + SystemRoutes: utils.Ptr(true), + } + + req = req.UpdateRoutingTableOfAreaPayload(payload) + + for _, mod := range mods { + mod(&req) + } + return req +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + argValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + }), + }, + { + description: "dynamic routes disabled", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[dynamicRoutesFlag] = "false" + }), + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.DynamicRoutes = utils.Ptr(false) + model.RoutingTableId = testRoutingTableId + }), + }, + { + description: "system routes disabled", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[systemRoutesFlag] = "false" + }), + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.SystemRoutes = utils.Ptr(false) + model.RoutingTableId = testRoutingTableId + }), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "network-area-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "org-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "all required flags missing", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, dynamicRoutesFlag) + delete(flagValues, systemRoutesFlag) + delete(flagValues, nameFlag) + delete(flagValues, labelFlag) + delete(flagValues, descriptionFlag) + }), + isValid: false, + }, + { + description: "all except one required flag missing (description flag)", + argValues: []string{testRoutingTableId}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, dynamicRoutesFlag) + delete(flagValues, systemRoutesFlag) + delete(flagValues, nameFlag) + delete(flagValues, labelFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + model.DynamicRoutes = nil + model.SystemRoutes = nil + model.Labels = nil + model.Name = nil + model.Description = utils.Ptr(testRoutingTableDescription) + }), + isValid: true, + }, + { + description: "arg value missing", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "arg value wrong", + argValues: []string{"foo-bar"}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "labels are missing", + argValues: []string{}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, labelFlag) + }), + isValid: false, + }, + { + description: "invalid label format", + argValues: []string{}, + flagValues: map[string]string{labelFlag: "invalid-label"}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiUpdateRoutingTableOfAreaRequest + }{ + { + description: "base", + model: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + }), + expectedRequest: fixtureRequest(), + }, + { + description: "labels missing", + model: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + model.Labels = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateRoutingTableOfAreaRequest) { + *request = (*request).UpdateRoutingTableOfAreaPayload(iaas.UpdateRoutingTableOfAreaPayload{ + Labels: nil, + Name: utils.Ptr(testRoutingTableName), + Description: utils.Ptr(testRoutingTableDescription), + DynamicRoutes: utils.Ptr(true), + SystemRoutes: utils.Ptr(true), + }) + }), + }, + { + description: "name missing", + model: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + model.Name = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateRoutingTableOfAreaRequest) { + *request = (*request).UpdateRoutingTableOfAreaPayload(iaas.UpdateRoutingTableOfAreaPayload{ + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: nil, + Description: utils.Ptr(testRoutingTableDescription), + DynamicRoutes: utils.Ptr(true), + SystemRoutes: utils.Ptr(true), + }) + }), + }, + { + description: "description missing", + model: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + model.Description = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateRoutingTableOfAreaRequest) { + *request = (*request).UpdateRoutingTableOfAreaPayload(iaas.UpdateRoutingTableOfAreaPayload{ + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: utils.Ptr(testRoutingTableName), + Description: nil, + DynamicRoutes: utils.Ptr(true), + SystemRoutes: utils.Ptr(true), + }) + }), + }, + { + description: "dynamic routes disabled", + model: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + model.DynamicRoutes = utils.Ptr(false) + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateRoutingTableOfAreaRequest) { + *request = (*request).UpdateRoutingTableOfAreaPayload(iaas.UpdateRoutingTableOfAreaPayload{ + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: utils.Ptr(testRoutingTableName), + Description: utils.Ptr(testRoutingTableDescription), + DynamicRoutes: utils.Ptr(false), + SystemRoutes: utils.Ptr(true), + }) + }), + }, + { + description: "system routes disabled", + model: fixtureInputModel(func(model *inputModel) { + model.RoutingTableId = testRoutingTableId + model.DynamicRoutes = utils.Ptr(false) + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateRoutingTableOfAreaRequest) { + *request = (*request).UpdateRoutingTableOfAreaPayload(iaas.UpdateRoutingTableOfAreaPayload{ + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + Name: utils.Ptr(testRoutingTableName), + Description: utils.Ptr(testRoutingTableDescription), + SystemRoutes: utils.Ptr(true), + DynamicRoutes: utils.Ptr(false), + }) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + req := buildRequest(testCtx, tt.model, testClient) + + if diff := cmp.Diff(req, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ); diff != "" { + t.Errorf("buildRequest() mismatch (-got +want):\n%s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRoutingTable := iaas.RoutingTable{ + Id: utils.Ptr("id-foo"), + Name: utils.Ptr("route-table-foo"), + Description: utils.Ptr("description-foo"), + SystemRoutes: utils.Ptr(true), + DynamicRoutes: utils.Ptr(true), + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + CreatedAt: utils.Ptr(time.Now()), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + routingTable *iaas.RoutingTable + wantErr bool + }{ + { + name: "nil routing-table should return error", + outputFormat: print.PrettyOutputFormat, + routingTable: nil, + wantErr: true, + }, + { + name: "empty routing-table", + outputFormat: print.PrettyOutputFormat, + routingTable: &iaas.RoutingTable{}, + wantErr: true, + }, + { + name: "pretty output routing-table", + outputFormat: print.PrettyOutputFormat, + routingTable: &dummyRoutingTable, + wantErr: false, + }, + { + name: "json output routing-table", + outputFormat: print.JSONOutputFormat, + routingTable: &dummyRoutingTable, + wantErr: false, + }, + { + name: "yaml output routing-table", + outputFormat: print.YAMLOutputFormat, + routingTable: &dummyRoutingTable, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, "network-area-id", tt.routingTable); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/pkg/services/iaas/utils/utils.go b/internal/pkg/services/iaas/utils/utils.go index b7973c265..8d04cd831 100644 --- a/internal/pkg/services/iaas/utils/utils.go +++ b/internal/pkg/services/iaas/utils/utils.go @@ -21,6 +21,7 @@ type IaaSClient interface { GetServerExecute(ctx context.Context, projectId, region, serverId string) (*iaas.Server, error) GetVolumeExecute(ctx context.Context, projectId, region, volumeId string) (*iaas.Volume, error) GetNetworkExecute(ctx context.Context, projectId, region, networkId string) (*iaas.Network, error) + GetRoutingTableOfAreaExecute(ctx context.Context, organizationId, areaId, region, routingTableId string) (*iaas.RoutingTable, error) GetNetworkAreaExecute(ctx context.Context, organizationId, areaId string) (*iaas.NetworkArea, error) ListNetworkAreaProjectsExecute(ctx context.Context, organizationId, areaId string) (*iaas.ProjectListResponse, error) GetNetworkAreaRangeExecute(ctx context.Context, organizationId, areaId, region, networkRangeId string) (*iaas.NetworkRange, error) @@ -95,6 +96,18 @@ func GetNetworkName(ctx context.Context, apiClient IaaSClient, projectId, region return *resp.Name, nil } +func GetRoutingTableOfAreaName(ctx context.Context, apiClient IaaSClient, organizationId, areaId, region, routingTableId string) (string, error) { + resp, err := apiClient.GetRoutingTableOfAreaExecute(ctx, organizationId, areaId, region, routingTableId) + if err != nil { + return "", fmt.Errorf("get routing-table: %w", err) + } else if resp == nil { + return "", ErrResponseNil + } else if resp.Name == nil { + return "", ErrNameNil + } + return *resp.Name, nil +} + func GetNetworkAreaName(ctx context.Context, apiClient IaaSClient, organizationId, areaId string) (string, error) { resp, err := apiClient.GetNetworkAreaExecute(ctx, organizationId, areaId) if err != nil { diff --git a/internal/pkg/services/iaas/utils/utils_test.go b/internal/pkg/services/iaas/utils/utils_test.go index a8f530533..ce97616b8 100644 --- a/internal/pkg/services/iaas/utils/utils_test.go +++ b/internal/pkg/services/iaas/utils/utils_test.go @@ -13,32 +13,34 @@ import ( var _ IaaSClient = &IaaSClientMocked{} type IaaSClientMocked struct { - GetSecurityGroupRuleFails bool - GetSecurityGroupRuleResp *iaas.SecurityGroupRule - GetSecurityGroupFails bool - GetSecurityGroupResp *iaas.SecurityGroup - GetPublicIpFails bool - GetPublicIpResp *iaas.PublicIp - GetServerFails bool - GetServerResp *iaas.Server - GetVolumeFails bool - GetVolumeResp *iaas.Volume - GetNetworkFails bool - GetNetworkResp *iaas.Network - GetNetworkAreaFails bool - GetNetworkAreaResp *iaas.NetworkArea - GetAttachedProjectsFails bool - GetAttachedProjectsResp *iaas.ProjectListResponse - GetNetworkAreaRangeFails bool - GetNetworkAreaRangeResp *iaas.NetworkRange - GetImageFails bool - GetImageResp *iaas.Image - GetAffinityGroupsFails bool - GetAffinityGroupResp *iaas.AffinityGroup - GetBackupFails bool - GetBackupResp *iaas.Backup - GetSnapshotFails bool - GetSnapshotResp *iaas.Snapshot + GetSecurityGroupRuleFails bool + GetSecurityGroupRuleResp *iaas.SecurityGroupRule + GetSecurityGroupFails bool + GetSecurityGroupResp *iaas.SecurityGroup + GetPublicIpFails bool + GetPublicIpResp *iaas.PublicIp + GetServerFails bool + GetServerResp *iaas.Server + GetVolumeFails bool + GetVolumeResp *iaas.Volume + GetNetworkFails bool + GetNetworkResp *iaas.Network + GetRoutingTableOfAreaFails bool + GetRoutingTableOfAreaResp *iaas.RoutingTable + GetNetworkAreaFails bool + GetNetworkAreaResp *iaas.NetworkArea + GetAttachedProjectsFails bool + GetAttachedProjectsResp *iaas.ProjectListResponse + GetNetworkAreaRangeFails bool + GetNetworkAreaRangeResp *iaas.NetworkRange + GetImageFails bool + GetImageResp *iaas.Image + GetAffinityGroupsFails bool + GetAffinityGroupResp *iaas.AffinityGroup + GetBackupFails bool + GetBackupResp *iaas.Backup + GetSnapshotFails bool + GetSnapshotResp *iaas.Snapshot } func (m *IaaSClientMocked) GetAffinityGroupExecute(_ context.Context, _, _, _ string) (*iaas.AffinityGroup, error) { @@ -90,6 +92,13 @@ func (m *IaaSClientMocked) GetNetworkExecute(_ context.Context, _, _, _ string) return m.GetNetworkResp, nil } +func (m *IaaSClientMocked) GetRoutingTableOfAreaExecute(_ context.Context, _, _, _, _ string) (*iaas.RoutingTable, error) { + if m.GetRoutingTableOfAreaFails { + return nil, fmt.Errorf("could not get routing table") + } + return m.GetRoutingTableOfAreaResp, nil +} + func (m *IaaSClientMocked) GetNetworkAreaExecute(_ context.Context, _, _ string) (*iaas.NetworkArea, error) { if m.GetNetworkAreaFails { return nil, fmt.Errorf("could not get network area") @@ -1093,3 +1102,71 @@ func TestGetAffinityGroupName(t *testing.T) { }) } } + +func TestGetRoutingTableOfAreaName(t *testing.T) { + type args struct { + getInstanceFails bool + getInstanceResp *iaas.RoutingTable + } + tests := []struct { + name string + args args + want string + wantErr bool + }{ + { + name: "base", + args: args{ + getInstanceResp: &iaas.RoutingTable{ + Name: utils.Ptr("test"), + }, + }, + want: "test", + }, + { + name: "get routing table fails", + args: args{ + getInstanceFails: true, + }, + wantErr: true, + want: "", + }, + { + name: "response is nil", + args: args{ + getInstanceResp: nil, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, + { + name: "name in response is nil", + args: args{ + getInstanceResp: &iaas.RoutingTable{ + Name: nil, + }, + getInstanceFails: false, + }, + wantErr: true, + want: "", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + m := &IaaSClientMocked{ + GetRoutingTableOfAreaFails: tt.args.getInstanceFails, + GetRoutingTableOfAreaResp: tt.args.getInstanceResp, + } + + got, err := GetRoutingTableOfAreaName(context.Background(), m, "", "", "", "") + if (err != nil) != tt.wantErr { + t.Errorf("GetRoutingTableOfAreaName() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("GetRoutingTableOfAreaName() = %v, want %v", got, tt.want) + } + }) + } +} From 1feda6497e0d9d1e3792b9876b87ad9bb066d75c Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 17 Mar 2026 08:47:38 +0100 Subject: [PATCH 402/422] fix(ske): cluster describe command does not print the name correctly (#1342) --- internal/cmd/ske/cluster/describe/describe.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index c66afaaa3..6c9316bd3 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -101,7 +101,7 @@ func outputResult(p *print.Printer, outputFormat string, cluster *ske.Cluster) e } table := tables.NewTable() - table.AddRow("NAME", cluster.Name) + table.AddRow("NAME", utils.PtrString(cluster.Name)) table.AddSeparator() if cluster.HasStatus() { table.AddRow("STATE", utils.PtrString(cluster.Status.Aggregated)) From f7892420179ffc010493b6d76b330cdb501d0429 Mon Sep 17 00:00:00 2001 From: Michael Eischer <9106997+MichaelEischer@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:41:24 +0100 Subject: [PATCH 403/422] feat(ske): add idp support for kubeconfig create (#1328) Co-authored-by: cgoetz-inovex --- docs/stackit_ske_kubeconfig_create.md | 32 ++++--- internal/cmd/ske/kubeconfig/create/create.go | 96 ++++++++++++------- .../cmd/ske/kubeconfig/create/create_test.go | 65 +++++++++++-- 3 files changed, 136 insertions(+), 57 deletions(-) diff --git a/docs/stackit_ske_kubeconfig_create.md b/docs/stackit_ske_kubeconfig_create.md index 476d50bab..5717a31f8 100644 --- a/docs/stackit_ske_kubeconfig_create.md +++ b/docs/stackit_ske_kubeconfig_create.md @@ -4,9 +4,9 @@ Creates or update a kubeconfig for a SKE cluster ### Synopsis -Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exists in the kubeconfig file the information will be updated. +Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster. By default an admin kubeconfig is created. Use the `--idp` option to create an IDP kubeconfig that authenticates via the STACKIT IDP. -By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created. +If the config exists in the kubeconfig file the information will be updated. By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created. You can override this behavior by specifying a custom filepath using the --filepath flag or by setting the KUBECONFIG env variable (fallback). An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 1h. @@ -20,25 +20,28 @@ stackit ske kubeconfig create CLUSTER_NAME [flags] ### Examples ``` - Create or update a kubeconfig for the SKE cluster with name "my-cluster. If the config exits in the kubeconfig file the information will be updated." - $ stackit ske kubeconfig create my-cluster - - Get a login kubeconfig for the SKE cluster with name "my-cluster". This kubeconfig does not contain any credentials and instead obtains valid credentials via the `stackit ske kubeconfig login` command. + Get a short-lived admin kubeconfig for the SKE cluster with name "my-cluster". This kubeconfig does not contain any credentials and instead obtains valid admin credentials via the `stackit ske kubeconfig login` command. $ stackit ske kubeconfig create my-cluster --login - Create a kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 30 days. If the config exits in the kubeconfig file the information will be updated. + Get an IDP kubeconfig for the SKE cluster with name "my-cluster". This kubeconfig does not grant permissions in the cluster by default and obtains credentials on-demand via the `stackit ske kubeconfig login` command. + $ stackit ske kubeconfig create my-cluster --idp + + Create or update a short-lived admin kubeconfig for the SKE cluster with name "my-cluster" in a custom filepath. If the config exits in the kubeconfig file the information will be updated. + $ stackit ske kubeconfig create my-cluster --login --filepath /path/to/config + + Create or update an admin kubeconfig for the SKE cluster with name "my-cluster". If the config exits in the kubeconfig file the information will be updated." + $ stackit ske kubeconfig create my-cluster + + Create an admin kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 30 days. If the config exits in the kubeconfig file the information will be updated. $ stackit ske kubeconfig create my-cluster --expiration 30d - Create or update a kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 2 months. If the config exits in the kubeconfig file the information will be updated. + Create or update an admin kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 2 months. If the config exits in the kubeconfig file the information will be updated. $ stackit ske kubeconfig create my-cluster --expiration 2M - Create or update a kubeconfig for the SKE cluster with name "my-cluster" in a custom filepath. If the config exits in the kubeconfig file the information will be updated. - $ stackit ske kubeconfig create my-cluster --filepath /path/to/config - - Get a kubeconfig for the SKE cluster with name "my-cluster" without writing it to a file and format the output as json + Get an admin kubeconfig for the SKE cluster with name "my-cluster" without writing it to a file and format the output as json $ stackit ske kubeconfig create my-cluster --disable-writing --output-format json - Create a kubeconfig for the SKE cluster with name "my-cluster. It will OVERWRITE your current kubeconfig file." + Create an admin kubeconfig for the SKE cluster with name "my-cluster". It will OVERWRITE your current kubeconfig file. $ stackit ske kubeconfig create my-cluster --overwrite true ``` @@ -49,7 +52,8 @@ stackit ske kubeconfig create CLUSTER_NAME [flags] -e, --expiration string Expiration time for the kubeconfig in seconds(s), minutes(m), hours(h), days(d) or months(M). Example: 30d. By default, expiration time is 1h --filepath string Path to create the kubeconfig file. Will fall back to KUBECONFIG env variable if not set. In case both aren't set, the kubeconfig is created as file named 'config' in the .kube folder in the user's home directory. -h, --help Help for "stackit ske kubeconfig create" - -l, --login Create a login kubeconfig that obtains valid credentials via the STACKIT CLI. This flag is mutually exclusive with the expiration flag. + --idp Create a non-admin kubeconfig that uses the STACKIT IDP to obtain credentials. + -l, --login Create a short-lived admin kubeconfig that obtains valid credentials via the STACKIT CLI. This flag is mutually exclusive with the expiration flag. --overwrite Overwrite the kubeconfig file. ``` diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index bff2dfa18..b417e0bbc 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -29,6 +29,7 @@ const ( expirationFlag = "expiration" filepathFlag = "filepath" loginFlag = "login" + idpFlag = "idp" overwriteFlag = "overwrite" ) @@ -39,6 +40,7 @@ type inputModel struct { ExpirationTime *string Filepath *string Login bool + IDP bool Overwrite bool } @@ -47,34 +49,38 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Use: fmt.Sprintf("create %s", clusterNameArg), Short: "Creates or update a kubeconfig for a SKE cluster", Long: fmt.Sprintf("%s\n\n%s\n%s\n%s\n%s", - "Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster, if the config exists in the kubeconfig file the information will be updated.", - "By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created.", + "Creates a kubeconfig for a STACKIT Kubernetes Engine (SKE) cluster. By default an admin kubeconfig is created. Use the `--idp` option to create an IDP kubeconfig that authenticates via the STACKIT IDP.", + "If the config exists in the kubeconfig file the information will be updated. By default, the kubeconfig information of the SKE cluster is merged into the default kubeconfig file of the current user. If the kubeconfig file doesn't exist, a new one will be created.", "You can override this behavior by specifying a custom filepath using the --filepath flag or by setting the KUBECONFIG env variable (fallback).\n", "An expiration time can be set for the kubeconfig. The expiration time is set in seconds(s), minutes(m), hours(h), days(d) or months(M). Default is 1h.\n", "Note that the format is , e.g. 30d for 30 days and you can't combine units."), Args: args.SingleArg(clusterNameArg, nil), Example: examples.Build( examples.NewExample( - `Create or update a kubeconfig for the SKE cluster with name "my-cluster. If the config exits in the kubeconfig file the information will be updated."`, - "$ stackit ske kubeconfig create my-cluster"), - examples.NewExample( - `Get a login kubeconfig for the SKE cluster with name "my-cluster". `+ - "This kubeconfig does not contain any credentials and instead obtains valid credentials via the `stackit ske kubeconfig login` command.", + `Get a short-lived admin kubeconfig for the SKE cluster with name "my-cluster". `+ + "This kubeconfig does not contain any credentials and instead obtains valid admin credentials via the `stackit ske kubeconfig login` command.", "$ stackit ske kubeconfig create my-cluster --login"), examples.NewExample( - `Create a kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 30 days. If the config exits in the kubeconfig file the information will be updated.`, + `Get an IDP kubeconfig for the SKE cluster with name "my-cluster". `+ + "This kubeconfig does not grant permissions in the cluster by default and obtains credentials on-demand via the `stackit ske kubeconfig login` command.", + "$ stackit ske kubeconfig create my-cluster --idp"), + examples.NewExample( + `Create or update a short-lived admin kubeconfig for the SKE cluster with name "my-cluster" in a custom filepath. If the config exits in the kubeconfig file the information will be updated.`, + "$ stackit ske kubeconfig create my-cluster --login --filepath /path/to/config"), + examples.NewExample( + `Create or update an admin kubeconfig for the SKE cluster with name "my-cluster". If the config exits in the kubeconfig file the information will be updated."`, + "$ stackit ske kubeconfig create my-cluster"), + examples.NewExample( + `Create an admin kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 30 days. If the config exits in the kubeconfig file the information will be updated.`, "$ stackit ske kubeconfig create my-cluster --expiration 30d"), examples.NewExample( - `Create or update a kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 2 months. If the config exits in the kubeconfig file the information will be updated.`, + `Create or update an admin kubeconfig for the SKE cluster with name "my-cluster" and set the expiration time to 2 months. If the config exits in the kubeconfig file the information will be updated.`, "$ stackit ske kubeconfig create my-cluster --expiration 2M"), examples.NewExample( - `Create or update a kubeconfig for the SKE cluster with name "my-cluster" in a custom filepath. If the config exits in the kubeconfig file the information will be updated.`, - "$ stackit ske kubeconfig create my-cluster --filepath /path/to/config"), - examples.NewExample( - `Get a kubeconfig for the SKE cluster with name "my-cluster" without writing it to a file and format the output as json`, + `Get an admin kubeconfig for the SKE cluster with name "my-cluster" without writing it to a file and format the output as json`, "$ stackit ske kubeconfig create my-cluster --disable-writing --output-format json"), examples.NewExample( - `Create a kubeconfig for the SKE cluster with name "my-cluster. It will OVERWRITE your current kubeconfig file."`, + `Create an admin kubeconfig for the SKE cluster with name "my-cluster". It will OVERWRITE your current kubeconfig file.`, "$ stackit ske kubeconfig create my-cluster --overwrite true"), ), RunE: func(cmd *cobra.Command, args []string) error { @@ -95,7 +101,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if model.Overwrite { prompt = fmt.Sprintf("Are you sure you want to create a kubeconfig for SKE cluster %q? This will OVERWRITE your current kubeconfig file, if it exists.", model.ClusterName) } else { - prompt = fmt.Sprintf("Are you sure you want to update your kubeconfig for SKE cluster %q? This will update your kubeconfig file. \nIf it the kubeconfig file doesn't exists, it will create a new one.", model.ClusterName) + prompt = fmt.Sprintf("Are you sure you want to update your kubeconfig for SKE cluster %q? This will update your kubeconfig file. \nIf the kubeconfig file does not exists, it will create a new one.", model.ClusterName) } err = params.Printer.PromptForConfirmation(prompt) if err != nil { @@ -108,22 +114,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { kubeconfig string respKubeconfig *ske.Kubeconfig respLogin *ske.LoginKubeconfig + respIDP *ske.IDPKubeconfig ) - if !model.Login { - req, err := buildRequestCreate(ctx, model, apiClient) - if err != nil { - return fmt.Errorf("build kubeconfig create request: %w", err) - } - respKubeconfig, err = req.Execute() - if err != nil { - return fmt.Errorf("create kubeconfig for SKE cluster: %w", err) - } - if respKubeconfig.Kubeconfig == nil { - return fmt.Errorf("no kubeconfig returned from the API") - } - kubeconfig = *respKubeconfig.Kubeconfig - } else { + if model.Login { req, err := buildRequestLogin(ctx, model, apiClient) if err != nil { return fmt.Errorf("build login kubeconfig create request: %w", err) @@ -136,6 +130,32 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return fmt.Errorf("no login kubeconfig returned from the API") } kubeconfig = *respLogin.Kubeconfig + } else if model.IDP { + req, err := buildRequestIDP(ctx, model, apiClient) + if err != nil { + return fmt.Errorf("build idp kubeconfig create request: %w", err) + } + respIDP, err = req.Execute() + if err != nil { + return fmt.Errorf("create idp kubeconfig for SKE cluster: %w", err) + } + if respIDP.Kubeconfig == nil { + return fmt.Errorf("no idp kubeconfig returned from the API") + } + kubeconfig = *respIDP.Kubeconfig + } else { + req, err := buildRequestCreate(ctx, model, apiClient) + if err != nil { + return fmt.Errorf("build kubeconfig create request: %w", err) + } + respKubeconfig, err = req.Execute() + if err != nil { + return fmt.Errorf("create kubeconfig for SKE cluster: %w", err) + } + if respKubeconfig.Kubeconfig == nil { + return fmt.Errorf("no kubeconfig returned from the API") + } + kubeconfig = *respKubeconfig.Kubeconfig } // Create the config file @@ -161,7 +181,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Outputf("\nSet kubectl context to %s with: kubectl config use-context %s\n", model.ClusterName, model.ClusterName) } - return outputResult(params.Printer, model.OutputFormat, model.ClusterName, kubeconfigPath, respKubeconfig, respLogin) + return outputResult(params.Printer, model.OutputFormat, model.ClusterName, kubeconfigPath, respKubeconfig, respLogin, respIDP) }, } configureFlags(cmd) @@ -170,11 +190,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().Bool(disableWritingFlag, false, fmt.Sprintf("Disable the writing of kubeconfig. Set the output format to json or yaml using the --%s flag to display the kubeconfig.", globalflags.OutputFormatFlag)) - cmd.Flags().BoolP(loginFlag, "l", false, "Create a login kubeconfig that obtains valid credentials via the STACKIT CLI. This flag is mutually exclusive with the expiration flag.") + cmd.Flags().BoolP(loginFlag, "l", false, "Create a short-lived admin kubeconfig that obtains valid credentials via the STACKIT CLI. This flag is mutually exclusive with the expiration flag.") + cmd.Flags().Bool(idpFlag, false, "Create a non-admin kubeconfig that uses the STACKIT IDP to obtain credentials.") cmd.Flags().String(filepathFlag, "", "Path to create the kubeconfig file. Will fall back to KUBECONFIG env variable if not set. In case both aren't set, the kubeconfig is created as file named 'config' in the .kube folder in the user's home directory.") cmd.Flags().StringP(expirationFlag, "e", "", "Expiration time for the kubeconfig in seconds(s), minutes(m), hours(h), days(d) or months(M). Example: 30d. By default, expiration time is 1h") cmd.Flags().Bool(overwriteFlag, false, "Overwrite the kubeconfig file.") - cmd.MarkFlagsMutuallyExclusive(loginFlag, expirationFlag) + cmd.MarkFlagsMutuallyExclusive(loginFlag, expirationFlag, idpFlag) } func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { @@ -213,6 +234,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu Filepath: flags.FlagToStringPointer(p, cmd, filepathFlag), GlobalFlagModel: globalFlags, Login: flags.FlagToBoolValue(p, cmd, loginFlag), + IDP: flags.FlagToBoolValue(p, cmd, idpFlag), Overwrite: flags.FlagToBoolValue(p, cmd, overwriteFlag), } @@ -232,11 +254,15 @@ func buildRequestCreate(ctx context.Context, model *inputModel, apiClient *ske.A return req.CreateKubeconfigPayload(payload), nil } +func buildRequestIDP(ctx context.Context, model *inputModel, apiClient *ske.APIClient) (ske.ApiGetIDPKubeconfigRequest, error) { + return apiClient.DefaultAPI.GetIDPKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName), nil +} + func buildRequestLogin(ctx context.Context, model *inputModel, apiClient *ske.APIClient) (ske.ApiGetLoginKubeconfigRequest, error) { return apiClient.DefaultAPI.GetLoginKubeconfig(ctx, model.ProjectId, model.Region, model.ClusterName), nil } -func outputResult(p *print.Printer, outputFormat, clusterName, kubeconfigPath string, respKubeconfig *ske.Kubeconfig, respLogin *ske.LoginKubeconfig) error { +func outputResult(p *print.Printer, outputFormat, clusterName, kubeconfigPath string, respKubeconfig *ske.Kubeconfig, respLogin *ske.LoginKubeconfig, respIDP *ske.IDPKubeconfig) error { switch outputFormat { case print.JSONOutputFormat: var err error @@ -245,6 +271,8 @@ func outputResult(p *print.Printer, outputFormat, clusterName, kubeconfigPath st details, err = json.MarshalIndent(respKubeconfig, "", " ") } else if respLogin != nil { details, err = json.MarshalIndent(respLogin, "", " ") + } else if respIDP != nil { + details, err = json.MarshalIndent(respIDP, "", " ") } if err != nil { return fmt.Errorf("marshal SKE Kubeconfig: %w", err) @@ -259,6 +287,8 @@ func outputResult(p *print.Printer, outputFormat, clusterName, kubeconfigPath st details, err = yaml.MarshalWithOptions(respKubeconfig, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) } else if respLogin != nil { details, err = yaml.MarshalWithOptions(respLogin, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) + } else if respIDP != nil { + details, err = yaml.MarshalWithOptions(respIDP, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) } if err != nil { return fmt.Errorf("marshal SKE Kubeconfig: %w", err) diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index af09214f3..3c3f2cae7 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -72,6 +72,14 @@ func fixtureRequest(mods ...func(request *ske.ApiCreateKubeconfigRequest)) ske.A return request } +func fixtureRequestLogin() ske.ApiGetLoginKubeconfigRequest { + return testClient.DefaultAPI.GetLoginKubeconfig(testCtx, testProjectId, testRegion, testClusterName) +} + +func fixtureRequestIDP() ske.ApiGetIDPKubeconfigRequest { + return testClient.DefaultAPI.GetIDPKubeconfig(testCtx, testProjectId, testRegion, testClusterName) +} + func TestParseInput(t *testing.T) { tests := []struct { description string @@ -109,6 +117,17 @@ func TestParseInput(t *testing.T) { model.Login = true }), }, + { + description: "idp", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues["idp"] = "true" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.IDP = true + }), + }, { description: "custom filepath", argValues: fixtureArgValues(), @@ -238,19 +257,37 @@ func TestBuildRequestCreate(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { request, _ := buildRequestCreate(testCtx, tt.model, testClient) - - diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), - cmpopts.EquateComparable(testCtx), - cmpopts.EquateComparable(testClient.DefaultAPI), - ) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + assertNoDiff(t, request, tt.expectedRequest) }) } } +func assertNoDiff(t *testing.T, actual, expected any) { + t.Helper() + diff := cmp.Diff(actual, expected, + cmp.AllowUnexported(expected), + cmpopts.EquateComparable(testCtx), + cmpopts.EquateComparable(testClient.DefaultAPI), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } +} + +func TestBuildRequestLogin(t *testing.T) { + model := fixtureInputModel() + expectedRequest := fixtureRequestLogin() + request, _ := buildRequestLogin(testCtx, model, testClient) + assertNoDiff(t, request, expectedRequest) +} + +func TestBuildRequestIDP(t *testing.T) { + model := fixtureInputModel() + expectedRequest := fixtureRequestIDP() + request, _ := buildRequestIDP(testCtx, model, testClient) + assertNoDiff(t, request, expectedRequest) +} + func Test_outputResult(t *testing.T) { type args struct { outputFormat string @@ -258,6 +295,7 @@ func Test_outputResult(t *testing.T) { kubeconfigPath string respKubeconfig *ske.Kubeconfig respLogin *ske.LoginKubeconfig + respIDP *ske.IDPKubeconfig } tests := []struct { name string @@ -283,12 +321,19 @@ func Test_outputResult(t *testing.T) { }, wantErr: false, }, + { + name: "missing idp", + args: args{ + respIDP: &ske.IDPKubeconfig{}, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.clusterName, tt.args.kubeconfigPath, tt.args.respKubeconfig, tt.args.respLogin); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.clusterName, tt.args.kubeconfigPath, tt.args.respKubeconfig, tt.args.respLogin, tt.args.respIDP); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) From ef5172cb0d02131596671e8f75953548a7603e7b Mon Sep 17 00:00:00 2001 From: "Jonas G." <138478945+gottliebjo@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:55:42 +0100 Subject: [PATCH 404/422] fix(iaas): change routing table root to network area (#1343) * fix: change routing-table root to network-area * fix: regenerate docs --------- Co-authored-by: Jonas Gottlieb --- docs/stackit.md | 1 - docs/stackit_network-area.md | 1 + docs/stackit_network-area_routing-table.md | 41 +++++++++++++++++++ ...ckit_network-area_routing-table_create.md} | 16 ++++---- ...ckit_network-area_routing-table_delete.md} | 10 ++--- ...it_network-area_routing-table_describe.md} | 10 ++--- ...tackit_network-area_routing-table_list.md} | 14 +++---- ...ckit_network-area_routing-table_update.md} | 18 ++++---- docs/stackit_routing-table.md | 41 ------------------- internal/cmd/network-area/network_area.go | 2 + .../routingtable/create/create.go | 8 ++-- .../routingtable/create/create_test.go | 0 .../routingtable/delete/delete.go | 2 +- .../routingtable/delete/delete_test.go | 0 .../routingtable/describe/describe.go | 2 +- .../routingtable/describe/describe_test.go | 0 .../routingtable/list/list.go | 6 +-- .../routingtable/list/list_test.go | 0 .../routingtable/routingtable.go | 10 ++--- .../routingtable/update/update.go | 10 ++--- .../routingtable/update/update_test.go | 0 internal/cmd/root.go | 2 - 22 files changed, 97 insertions(+), 97 deletions(-) create mode 100644 docs/stackit_network-area_routing-table.md rename docs/{stackit_routing-table_create.md => stackit_network-area_routing-table_create.md} (64%) rename docs/{stackit_routing-table_delete.md => stackit_network-area_routing-table_delete.md} (64%) rename docs/{stackit_routing-table_describe.md => stackit_network-area_routing-table_describe.md} (64%) rename docs/{stackit_routing-table_list.md => stackit_network-area_routing-table_list.md} (60%) rename docs/{stackit_routing-table_update.md => stackit_network-area_routing-table_update.md} (66%) delete mode 100644 docs/stackit_routing-table.md rename internal/cmd/{ => network-area}/routingtable/create/create.go (90%) rename internal/cmd/{ => network-area}/routingtable/create/create_test.go (100%) rename internal/cmd/{ => network-area}/routingtable/delete/delete.go (97%) rename internal/cmd/{ => network-area}/routingtable/delete/delete_test.go (100%) rename internal/cmd/{ => network-area}/routingtable/describe/describe.go (97%) rename internal/cmd/{ => network-area}/routingtable/describe/describe_test.go (100%) rename internal/cmd/{ => network-area}/routingtable/list/list.go (93%) rename internal/cmd/{ => network-area}/routingtable/list/list_test.go (100%) rename internal/cmd/{ => network-area}/routingtable/routingtable.go (66%) rename internal/cmd/{ => network-area}/routingtable/update/update.go (91%) rename internal/cmd/{ => network-area}/routingtable/update/update_test.go (100%) diff --git a/docs/stackit.md b/docs/stackit.md index f2caf941a..88f1a5707 100644 --- a/docs/stackit.md +++ b/docs/stackit.md @@ -54,7 +54,6 @@ stackit [flags] * [stackit quota](./stackit_quota.md) - Manage server quotas * [stackit rabbitmq](./stackit_rabbitmq.md) - Provides functionality for RabbitMQ * [stackit redis](./stackit_redis.md) - Provides functionality for Redis -* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes * [stackit secrets-manager](./stackit_secrets-manager.md) - Provides functionality for Secrets Manager * [stackit security-group](./stackit_security-group.md) - Manage security groups * [stackit server](./stackit_server.md) - Provides functionality for servers diff --git a/docs/stackit_network-area.md b/docs/stackit_network-area.md index 6f2d751f8..e99e52ad1 100644 --- a/docs/stackit_network-area.md +++ b/docs/stackit_network-area.md @@ -37,5 +37,6 @@ stackit network-area [flags] * [stackit network-area network-range](./stackit_network-area_network-range.md) - Provides functionality for network ranges in STACKIT Network Areas * [stackit network-area region](./stackit_network-area_region.md) - Provides functionality for regional configuration of STACKIT Network Area (SNA) * [stackit network-area route](./stackit_network-area_route.md) - Provides functionality for static routes in STACKIT Network Areas +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes * [stackit network-area update](./stackit_network-area_update.md) - Updates a STACKIT Network Area (SNA) diff --git a/docs/stackit_network-area_routing-table.md b/docs/stackit_network-area_routing-table.md new file mode 100644 index 000000000..335202b22 --- /dev/null +++ b/docs/stackit_network-area_routing-table.md @@ -0,0 +1,41 @@ +## stackit network-area routing-table + +Manage routing-tables and its according routes + +### Synopsis + +Manage routing-tables and their associated routes. + +This API is currently available only to selected customers. +To request access, please contact your account manager or submit a support ticket. + +``` +stackit network-area routing-table [flags] +``` + +### Options + +``` + -h, --help Help for "stackit network-area routing-table" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area](./stackit_network-area.md) - Provides functionality for STACKIT Network Area (SNA) +* [stackit network-area routing-table create](./stackit_network-area_routing-table_create.md) - Creates a routing-table +* [stackit network-area routing-table delete](./stackit_network-area_routing-table_delete.md) - Deletes a routing-table +* [stackit network-area routing-table describe](./stackit_network-area_routing-table_describe.md) - Describes a routing-table +* [stackit network-area routing-table list](./stackit_network-area_routing-table_list.md) - Lists all routing-tables +* [stackit network-area routing-table update](./stackit_network-area_routing-table_update.md) - Updates a routing-table + diff --git a/docs/stackit_routing-table_create.md b/docs/stackit_network-area_routing-table_create.md similarity index 64% rename from docs/stackit_routing-table_create.md rename to docs/stackit_network-area_routing-table_create.md index 4b82559b6..b926dcc7d 100644 --- a/docs/stackit_routing-table_create.md +++ b/docs/stackit_network-area_routing-table_create.md @@ -1,4 +1,4 @@ -## stackit routing-table create +## stackit network-area routing-table create Creates a routing-table @@ -7,23 +7,23 @@ Creates a routing-table Creates a routing-table. ``` -stackit routing-table create [flags] +stackit network-area routing-table create [flags] ``` ### Examples ``` Create a routing-table with name "rt" - stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" + $ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" Create a routing-table with name "rt" and description "some description" - stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --description "some description" + $ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" --description "some description" Create a routing-table with name "rt" with system routes disabled - stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --system-routes=false + $ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" --system-routes=false Create a routing-table with name "rt" with dynamic routes disabled - stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --dynamic-routes=false + $ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" --dynamic-routes=false ``` ### Options @@ -31,7 +31,7 @@ stackit routing-table create [flags] ``` --description string Description of the routing-table --dynamic-routes If set to false, prevents dynamic routes from propagating to the routing table. (default true) - -h, --help Help for "stackit routing-table create" + -h, --help Help for "stackit network-area routing-table create" --labels stringToString Key=value labels (default []) --name string Name of the routing-table --network-area-id string Network-Area ID @@ -52,5 +52,5 @@ stackit routing-table create [flags] ### SEE ALSO -* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes diff --git a/docs/stackit_routing-table_delete.md b/docs/stackit_network-area_routing-table_delete.md similarity index 64% rename from docs/stackit_routing-table_delete.md rename to docs/stackit_network-area_routing-table_delete.md index 0dab98d6f..59a38395b 100644 --- a/docs/stackit_routing-table_delete.md +++ b/docs/stackit_network-area_routing-table_delete.md @@ -1,4 +1,4 @@ -## stackit routing-table delete +## stackit network-area routing-table delete Deletes a routing-table @@ -7,20 +7,20 @@ Deletes a routing-table Deletes a routing-table ``` -stackit routing-table delete ROUTING_TABLE_ID [flags] +stackit network-area routing-table delete ROUTING_TABLE_ID [flags] ``` ### Examples ``` Delete a routing-table with ID "xxx" - $ stackit routing-table delete xxx --organization-id yyy --network-area-id zzz + $ stackit network-area routing-table delete xxx --organization-id yyy --network-area-id zzz ``` ### Options ``` - -h, --help Help for "stackit routing-table delete" + -h, --help Help for "stackit network-area routing-table delete" --network-area-id string Network-Area ID --organization-id string Organization ID ``` @@ -38,5 +38,5 @@ stackit routing-table delete ROUTING_TABLE_ID [flags] ### SEE ALSO -* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes diff --git a/docs/stackit_routing-table_describe.md b/docs/stackit_network-area_routing-table_describe.md similarity index 64% rename from docs/stackit_routing-table_describe.md rename to docs/stackit_network-area_routing-table_describe.md index b30a226cb..b608ce830 100644 --- a/docs/stackit_routing-table_describe.md +++ b/docs/stackit_network-area_routing-table_describe.md @@ -1,4 +1,4 @@ -## stackit routing-table describe +## stackit network-area routing-table describe Describes a routing-table @@ -7,20 +7,20 @@ Describes a routing-table Describes a routing-table ``` -stackit routing-table describe ROUTING_TABLE_ID [flags] +stackit network-area routing-table describe ROUTING_TABLE_ID [flags] ``` ### Examples ``` Describe a routing-table - $ stackit routing-table describe xxx --organization-id xxx --network-area-id yyy + $ stackit network-area routing-table describe xxx --organization-id xxx --network-area-id yyy ``` ### Options ``` - -h, --help Help for "stackit routing-table describe" + -h, --help Help for "stackit network-area routing-table describe" --network-area-id string Network-Area ID --organization-id string Organization ID ``` @@ -38,5 +38,5 @@ stackit routing-table describe ROUTING_TABLE_ID [flags] ### SEE ALSO -* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes diff --git a/docs/stackit_routing-table_list.md b/docs/stackit_network-area_routing-table_list.md similarity index 60% rename from docs/stackit_routing-table_list.md rename to docs/stackit_network-area_routing-table_list.md index d45350821..5b7a277d4 100644 --- a/docs/stackit_routing-table_list.md +++ b/docs/stackit_network-area_routing-table_list.md @@ -1,4 +1,4 @@ -## stackit routing-table list +## stackit network-area routing-table list Lists all routing-tables @@ -7,26 +7,26 @@ Lists all routing-tables Lists all routing-tables ``` -stackit routing-table list [flags] +stackit network-area routing-table list [flags] ``` ### Examples ``` List all routing-tables - $ stackit routing-table list --organization-id xxx --network-area-id yyy + $ stackit network-area routing-table list --organization-id xxx --network-area-id yyy List all routing-tables with labels - $ stackit routing-table list --label-selector env=dev,env=rc --organization-id xxx --network-area-id yyy + $ stackit network-area routing-table list --label-selector env=dev,env=rc --organization-id xxx --network-area-id yyy List all routing-tables with labels and set limit to 10 - $ stackit routing-table list --label-selector env=dev,env=rc --limit 10 --organization-id xxx --network-area-id yyy + $ stackit network-area routing-table list --label-selector env=dev,env=rc --limit 10 --organization-id xxx --network-area-id yyy ``` ### Options ``` - -h, --help Help for "stackit routing-table list" + -h, --help Help for "stackit network-area routing-table list" --label-selector string Filter by label --limit int Maximum number of entries to list --network-area-id string Network-Area ID @@ -46,5 +46,5 @@ stackit routing-table list [flags] ### SEE ALSO -* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes diff --git a/docs/stackit_routing-table_update.md b/docs/stackit_network-area_routing-table_update.md similarity index 66% rename from docs/stackit_routing-table_update.md rename to docs/stackit_network-area_routing-table_update.md index 9b747cd72..917565e38 100644 --- a/docs/stackit_routing-table_update.md +++ b/docs/stackit_network-area_routing-table_update.md @@ -1,4 +1,4 @@ -## stackit routing-table update +## stackit network-area routing-table update Updates a routing-table @@ -7,26 +7,26 @@ Updates a routing-table Updates a routing-table. ``` -stackit routing-table update ROUTING_TABLE_ID [flags] +stackit network-area routing-table update ROUTING_TABLE_ID [flags] ``` ### Examples ``` Updates the label(s) of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" - $ stackit routing-table update xxx --labels key=value,foo=bar --organization-id yyy --network-area-id zzz + $ stackit network-area routing-table update xxx --labels key=value,foo=bar --organization-id yyy --network-area-id zzz Updates the name of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" - $ stackit routing-table update xxx --name foo --organization-id yyy --network-area-id zzz + $ stackit network-area routing-table update xxx --name foo --organization-id yyy --network-area-id zzz Updates the description of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" - $ stackit routing-table update xxx --description foo --organization-id yyy --network-area-id zzz + $ stackit network-area routing-table update xxx --description foo --organization-id yyy --network-area-id zzz Disables the dynamic routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" - $ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --dynamic-routes=false + $ stackit network-area routing-table update xxx --organization-id yyy --network-area-id zzz --dynamic-routes=false Disables the system routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" - $ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --system-routes=false + $ stackit network-area routing-table update xxx --organization-id yyy --network-area-id zzz --system-routes=false ``` ### Options @@ -34,7 +34,7 @@ stackit routing-table update ROUTING_TABLE_ID [flags] ``` --description string Description of the routing-table --dynamic-routes If set to false, prevents dynamic routes from propagating to the routing table. - -h, --help Help for "stackit routing-table update" + -h, --help Help for "stackit network-area routing-table update" --labels stringToString Key=value labels (default []) --name string Name of the routing-table --network-area-id string Network-Area ID @@ -55,5 +55,5 @@ stackit routing-table update ROUTING_TABLE_ID [flags] ### SEE ALSO -* [stackit routing-table](./stackit_routing-table.md) - Manage routing-tables and its according routes +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes diff --git a/docs/stackit_routing-table.md b/docs/stackit_routing-table.md deleted file mode 100644 index 7f943ecb4..000000000 --- a/docs/stackit_routing-table.md +++ /dev/null @@ -1,41 +0,0 @@ -## stackit routing-table - -Manage routing-tables and its according routes - -### Synopsis - -Manage routing-tables and their associated routes. - -This API is currently available only to selected customers. -To request access, please contact your account manager or submit a support ticket. - -``` -stackit routing-table [flags] -``` - -### Options - -``` - -h, --help Help for "stackit routing-table" -``` - -### Options inherited from parent commands - -``` - -y, --assume-yes If set, skips all confirmation prompts - --async If set, runs the command asynchronously - -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] - -p, --project-id string Project ID - --region string Target region for region-specific requests - --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") -``` - -### SEE ALSO - -* [stackit](./stackit.md) - Manage STACKIT resources using the command line -* [stackit routing-table create](./stackit_routing-table_create.md) - Creates a routing-table -* [stackit routing-table delete](./stackit_routing-table_delete.md) - Deletes a routing-table -* [stackit routing-table describe](./stackit_routing-table_describe.md) - Describes a routing-table -* [stackit routing-table list](./stackit_routing-table_list.md) - Lists all routing-tables -* [stackit routing-table update](./stackit_routing-table_update.md) - Updates a routing-table - diff --git a/internal/cmd/network-area/network_area.go b/internal/cmd/network-area/network_area.go index ff09d229e..a47e9585d 100644 --- a/internal/cmd/network-area/network_area.go +++ b/internal/cmd/network-area/network_area.go @@ -8,6 +8,7 @@ import ( networkrange "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/network-range" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/region" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/route" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" @@ -34,6 +35,7 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(networkrange.NewCmd(params)) + cmd.AddCommand(routingtable.NewCmd(params)) cmd.AddCommand(region.NewCmd(params)) cmd.AddCommand(route.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) diff --git a/internal/cmd/routingtable/create/create.go b/internal/cmd/network-area/routingtable/create/create.go similarity index 90% rename from internal/cmd/routingtable/create/create.go rename to internal/cmd/network-area/routingtable/create/create.go index d01aaf754..708737c87 100644 --- a/internal/cmd/routingtable/create/create.go +++ b/internal/cmd/network-area/routingtable/create/create.go @@ -46,19 +46,19 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Create a routing-table with name "rt"`, - `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt"`, + `$ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt"`, ), examples.NewExample( `Create a routing-table with name "rt" and description "some description"`, - `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --description "some description"`, + `$ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" --description "some description"`, ), examples.NewExample( `Create a routing-table with name "rt" with system routes disabled`, - `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --system-routes=false`, + `$ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" --system-routes=false`, ), examples.NewExample( `Create a routing-table with name "rt" with dynamic routes disabled`, - `stackit routing-table create --organization-id xxx --network-area-id yyy --name "rt" --dynamic-routes=false`, + `$ stackit network-area routing-table create --organization-id xxx --network-area-id yyy --name "rt" --dynamic-routes=false`, ), ), RunE: func(cmd *cobra.Command, _ []string) error { diff --git a/internal/cmd/routingtable/create/create_test.go b/internal/cmd/network-area/routingtable/create/create_test.go similarity index 100% rename from internal/cmd/routingtable/create/create_test.go rename to internal/cmd/network-area/routingtable/create/create_test.go diff --git a/internal/cmd/routingtable/delete/delete.go b/internal/cmd/network-area/routingtable/delete/delete.go similarity index 97% rename from internal/cmd/routingtable/delete/delete.go rename to internal/cmd/network-area/routingtable/delete/delete.go index 9f111d321..67aaf08af 100644 --- a/internal/cmd/routingtable/delete/delete.go +++ b/internal/cmd/network-area/routingtable/delete/delete.go @@ -38,7 +38,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Delete a routing-table with ID "xxx"`, - `$ stackit routing-table delete xxx --organization-id yyy --network-area-id zzz`, + `$ stackit network-area routing-table delete xxx --organization-id yyy --network-area-id zzz`, ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/routingtable/delete/delete_test.go b/internal/cmd/network-area/routingtable/delete/delete_test.go similarity index 100% rename from internal/cmd/routingtable/delete/delete_test.go rename to internal/cmd/network-area/routingtable/delete/delete_test.go diff --git a/internal/cmd/routingtable/describe/describe.go b/internal/cmd/network-area/routingtable/describe/describe.go similarity index 97% rename from internal/cmd/routingtable/describe/describe.go rename to internal/cmd/network-area/routingtable/describe/describe.go index f843f0c3a..883fc00da 100644 --- a/internal/cmd/routingtable/describe/describe.go +++ b/internal/cmd/network-area/routingtable/describe/describe.go @@ -40,7 +40,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Describe a routing-table`, - `$ stackit routing-table describe xxx --organization-id xxx --network-area-id yyy`, + `$ stackit network-area routing-table describe xxx --organization-id xxx --network-area-id yyy`, ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/routingtable/describe/describe_test.go b/internal/cmd/network-area/routingtable/describe/describe_test.go similarity index 100% rename from internal/cmd/routingtable/describe/describe_test.go rename to internal/cmd/network-area/routingtable/describe/describe_test.go diff --git a/internal/cmd/routingtable/list/list.go b/internal/cmd/network-area/routingtable/list/list.go similarity index 93% rename from internal/cmd/routingtable/list/list.go rename to internal/cmd/network-area/routingtable/list/list.go index 3c676317a..e0993d5a0 100644 --- a/internal/cmd/routingtable/list/list.go +++ b/internal/cmd/network-area/routingtable/list/list.go @@ -43,15 +43,15 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `List all routing-tables`, - `$ stackit routing-table list --organization-id xxx --network-area-id yyy`, + `$ stackit network-area routing-table list --organization-id xxx --network-area-id yyy`, ), examples.NewExample( `List all routing-tables with labels`, - `$ stackit routing-table list --label-selector env=dev,env=rc --organization-id xxx --network-area-id yyy`, + `$ stackit network-area routing-table list --label-selector env=dev,env=rc --organization-id xxx --network-area-id yyy`, ), examples.NewExample( `List all routing-tables with labels and set limit to 10`, - `$ stackit routing-table list --label-selector env=dev,env=rc --limit 10 --organization-id xxx --network-area-id yyy`, + `$ stackit network-area routing-table list --label-selector env=dev,env=rc --limit 10 --organization-id xxx --network-area-id yyy`, ), ), RunE: func(cmd *cobra.Command, _ []string) error { diff --git a/internal/cmd/routingtable/list/list_test.go b/internal/cmd/network-area/routingtable/list/list_test.go similarity index 100% rename from internal/cmd/routingtable/list/list_test.go rename to internal/cmd/network-area/routingtable/list/list_test.go diff --git a/internal/cmd/routingtable/routingtable.go b/internal/cmd/network-area/routingtable/routingtable.go similarity index 66% rename from internal/cmd/routingtable/routingtable.go rename to internal/cmd/network-area/routingtable/routingtable.go index ebc9eae7a..1e1fc860a 100644 --- a/internal/cmd/routingtable/routingtable.go +++ b/internal/cmd/network-area/routingtable/routingtable.go @@ -2,11 +2,11 @@ package routingtable import ( "github.com/spf13/cobra" - rtCreate "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/create" - rtDelete "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/delete" - rtDescribe "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/describe" - rtList "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/list" - rtUpdate "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable/update" + rtCreate "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/create" + rtDelete "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/delete" + rtDescribe "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/describe" + rtList "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/list" + rtUpdate "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/routingtable/update/update.go b/internal/cmd/network-area/routingtable/update/update.go similarity index 91% rename from internal/cmd/routingtable/update/update.go rename to internal/cmd/network-area/routingtable/update/update.go index bdf4d377b..7d83543a4 100644 --- a/internal/cmd/routingtable/update/update.go +++ b/internal/cmd/network-area/routingtable/update/update.go @@ -49,23 +49,23 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Example: examples.Build( examples.NewExample( `Updates the label(s) of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, - "$ stackit routing-table update xxx --labels key=value,foo=bar --organization-id yyy --network-area-id zzz", + "$ stackit network-area routing-table update xxx --labels key=value,foo=bar --organization-id yyy --network-area-id zzz", ), examples.NewExample( `Updates the name of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, - "$ stackit routing-table update xxx --name foo --organization-id yyy --network-area-id zzz", + "$ stackit network-area routing-table update xxx --name foo --organization-id yyy --network-area-id zzz", ), examples.NewExample( `Updates the description of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, - "$ stackit routing-table update xxx --description foo --organization-id yyy --network-area-id zzz", + "$ stackit network-area routing-table update xxx --description foo --organization-id yyy --network-area-id zzz", ), examples.NewExample( `Disables the dynamic routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, - "$ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --dynamic-routes=false", + "$ stackit network-area routing-table update xxx --organization-id yyy --network-area-id zzz --dynamic-routes=false", ), examples.NewExample( `Disables the system routes of a routing-table with ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, - "$ stackit routing-table update xxx --organization-id yyy --network-area-id zzz --system-routes=false", + "$ stackit network-area routing-table update xxx --organization-id yyy --network-area-id zzz --system-routes=false", ), ), RunE: func(cmd *cobra.Command, args []string) error { diff --git a/internal/cmd/routingtable/update/update_test.go b/internal/cmd/network-area/routingtable/update/update_test.go similarity index 100% rename from internal/cmd/routingtable/update/update_test.go rename to internal/cmd/network-area/routingtable/update/update_test.go diff --git a/internal/cmd/root.go b/internal/cmd/root.go index 0e6b72df4..c120ccc76 100644 --- a/internal/cmd/root.go +++ b/internal/cmd/root.go @@ -36,7 +36,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/quota" "github.com/stackitcloud/stackit-cli/internal/cmd/rabbitmq" "github.com/stackitcloud/stackit-cli/internal/cmd/redis" - "github.com/stackitcloud/stackit-cli/internal/cmd/routingtable" secretsmanager "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager" securitygroup "github.com/stackitcloud/stackit-cli/internal/cmd/security-group" "github.com/stackitcloud/stackit-cli/internal/cmd/server" @@ -187,7 +186,6 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(secretsmanager.NewCmd(params)) cmd.AddCommand(serviceaccount.NewCmd(params)) cmd.AddCommand(ske.NewCmd(params)) - cmd.AddCommand(routingtable.NewCmd(params)) cmd.AddCommand(server.NewCmd(params)) cmd.AddCommand(networkArea.NewCmd(params)) cmd.AddCommand(network.NewCmd(params)) From ee847502cfe55c00506e0868fd63514635e51852 Mon Sep 17 00:00:00 2001 From: svetlyopet <72823802+svetlyopet@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:52:53 +0200 Subject: [PATCH 405/422] auth(login): explicit check for ipv6 port bindings before creating listener for redirectUrl (#1251) --- internal/pkg/auth/user_login.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index cefde3868..eb021d92e 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -85,6 +85,8 @@ func AuthorizeUser(p *print.Printer, authConfig UserAuthConfig) error { var redirectURL string var listener net.Listener var listenerErr error + var ipv6Listener net.Listener + var ipv6ListenerErr error var port int startingPort := defaultPort portRange := configuredPortRange @@ -94,18 +96,27 @@ func AuthorizeUser(p *print.Printer, authConfig UserAuthConfig) error { } for i := range portRange { port = startingPort + i - portString := fmt.Sprintf(":%s", strconv.Itoa(port)) + ipv4addr := fmt.Sprintf("127.0.0.1:%d", port) + ipv6addr := fmt.Sprintf("[::1]:%d", port) p.Debug(print.DebugLevel, "trying to bind port %d for login redirect", port) - listener, listenerErr = net.Listen("tcp", portString) + ipv6Listener, ipv6ListenerErr = net.Listen("tcp6", ipv6addr) + if ipv6ListenerErr != nil { + continue + } + listener, listenerErr = net.Listen("tcp4", ipv4addr) if listenerErr == nil { + _ = ipv6Listener.Close() redirectURL = fmt.Sprintf("http://localhost:%d", port) p.Debug(print.DebugLevel, "bound port %d for login redirect", port) break } p.Debug(print.DebugLevel, "unable to bind port %d for login redirect: %s", port, listenerErr) } + if ipv6ListenerErr != nil { + return fmt.Errorf("unable to bind port for login redirect, tried from port %d to %d: %w", startingPort, port, ipv6ListenerErr) + } if listenerErr != nil { - return fmt.Errorf("unable to bind port for login redirect, tried from port %d to %d: %w", defaultPort, port, listenerErr) + return fmt.Errorf("unable to bind port for login redirect, tried from port %d to %d: %w", startingPort, port, listenerErr) } conf := &oauth2.Config{ From f4a50afac0518e9e3a7f19a5faf926ed2da7d420 Mon Sep 17 00:00:00 2001 From: Michael Eischer <9106997+MichaelEischer@users.noreply.github.com> Date: Thu, 19 Mar 2026 09:27:50 +0100 Subject: [PATCH 406/422] fix(ske): add missing fields to generate-payload command (#1344) --- internal/cmd/ske/cluster/generate-payload/generate_payload.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/cmd/ske/cluster/generate-payload/generate_payload.go b/internal/cmd/ske/cluster/generate-payload/generate_payload.go index 80f36394a..7ff0a87d3 100644 --- a/internal/cmd/ske/cluster/generate-payload/generate_payload.go +++ b/internal/cmd/ske/cluster/generate-payload/generate_payload.go @@ -82,10 +82,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return fmt.Errorf("read SKE cluster: %w", err) } payload = &ske.CreateOrUpdateClusterPayload{ + Access: resp.Access, Extensions: resp.Extensions, Hibernation: resp.Hibernation, Kubernetes: resp.Kubernetes, Maintenance: resp.Maintenance, + Network: resp.Network, Nodepools: resp.Nodepools, Status: resp.Status, } From 746300335c42527d3612779cfe4fcaf5ec8c24bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 10:37:43 +0100 Subject: [PATCH 407/422] chore(deps): bump fgrosse/go-coverage-report from 1.2.0 to 1.3.0 (#1345) --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d6dcfa44..3a5bb9f13 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -65,7 +65,7 @@ jobs: pull-requests: write # write permission needed to comment on PR steps: - name: Check new code coverage - uses: fgrosse/go-coverage-report@v1.2.0 + uses: fgrosse/go-coverage-report@v1.3.0 continue-on-error: true # Add this line to prevent pipeline failures in forks with: coverage-artifact-name: ${{ env.CODE_COVERAGE_ARTIFACT_NAME }} From 3a8aede44c142c05e28c65f637626bedc319e7f6 Mon Sep 17 00:00:00 2001 From: Sven Inter <102514411+s-inter@users.noreply.github.com> Date: Fri, 20 Mar 2026 17:40:32 +0100 Subject: [PATCH 408/422] feat: clarify command output when async flag is set (#1329) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(server): add async output handling for server creation * feat(volume): add async output handling * feat(network-area): add async output handling * feat(git): add async output handling for instance creation * feat(mongodbflex): add async output handling in restore and clone commands * feat(kms): add async output handling * feat(sfs): add async output handling * fix(kms): remove hardcoded async in outputResult tests * fix(sfs): remove hardcoded async in outputResult tests * refactor(kms): unify output handling for async operations * Update internal/cmd/git/instance/create/create.go Co-authored-by: Ruben Hönle * refactor(git): clean up outputResult function by passing only required fields * refactor(git): fix tests & removed redundant checks * fix(git): remove Id from inputModel --------- Co-authored-by: Ruben Hönle --- .../beta/sfs/resource-pool/create/create.go | 10 ++++-- .../sfs/resource-pool/create/create_test.go | 3 +- .../beta/sfs/resource-pool/delete/delete.go | 10 ++++-- .../sfs/resource-pool/delete/delete_test.go | 3 +- .../beta/sfs/resource-pool/update/update.go | 10 ++++-- .../sfs/resource-pool/update/update_test.go | 3 +- internal/cmd/git/instance/create/create.go | 24 +++++++------- .../cmd/git/instance/create/create_test.go | 32 +++++++++++-------- internal/cmd/kms/key/create/create.go | 23 ++----------- internal/cmd/kms/key/delete/delete.go | 22 ++----------- internal/cmd/kms/key/importKey/importKey.go | 24 ++------------ internal/cmd/kms/key/list/list.go | 23 ++----------- internal/cmd/kms/key/restore/restore.go | 22 ++----------- internal/cmd/kms/key/rotate/rotate.go | 24 ++------------ internal/cmd/kms/keyring/create/create.go | 23 ++----------- internal/cmd/kms/keyring/list/list.go | 24 ++------------ internal/cmd/kms/version/destroy/destroy.go | 24 ++------------ internal/cmd/kms/version/disable/disable.go | 32 ++++++------------- .../cmd/kms/version/disable/disable_test.go | 3 +- internal/cmd/kms/version/enable/enable.go | 32 ++++++------------- .../cmd/kms/version/enable/enable_test.go | 3 +- internal/cmd/kms/version/list/list.go | 24 ++------------ internal/cmd/kms/version/restore/restore.go | 22 ++----------- internal/cmd/kms/wrappingkey/create/create.go | 24 ++------------ internal/cmd/kms/wrappingkey/list/list.go | 24 ++------------ .../cmd/mongodbflex/backup/restore/restore.go | 12 +++++-- .../cmd/network-area/region/create/create.go | 10 ++++-- .../network-area/region/create/create_test.go | 3 +- internal/cmd/server/create/create.go | 10 ++++-- internal/cmd/server/create/create_test.go | 3 +- internal/cmd/volume/create/create.go | 6 +++- 31 files changed, 151 insertions(+), 361 deletions(-) diff --git a/internal/cmd/beta/sfs/resource-pool/create/create.go b/internal/cmd/beta/sfs/resource-pool/create/create.go index 4b97f16bb..8df0145a2 100644 --- a/internal/cmd/beta/sfs/resource-pool/create/create.go +++ b/internal/cmd/beta/sfs/resource-pool/create/create.go @@ -109,7 +109,7 @@ The available performance class values can be obtained by running: s.Stop() } - return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) @@ -170,13 +170,17 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, return &model, nil } -func outputResult(p *print.Printer, outputFormat, projectLabel string, resp *sfs.CreateResourcePoolResponse) error { +func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel string, resp *sfs.CreateResourcePoolResponse) error { return p.OutputResult(outputFormat, resp, func() error { if resp == nil || resp.ResourcePool == nil { p.Outputln("Resource pool response is empty") return nil } - p.Outputf("Created resource pool for project %q. Resource pool ID: %s\n", projectLabel, utils.PtrString(resp.ResourcePool.Id)) + operationState := "Created" + if async { + operationState = "Triggered creation of" + } + p.Outputf("%s resource pool for project %q. Resource pool ID: %s\n", operationState, projectLabel, utils.PtrString(resp.ResourcePool.Id)) return nil }) } diff --git a/internal/cmd/beta/sfs/resource-pool/create/create_test.go b/internal/cmd/beta/sfs/resource-pool/create/create_test.go index 5dd65f643..4b096c97d 100644 --- a/internal/cmd/beta/sfs/resource-pool/create/create_test.go +++ b/internal/cmd/beta/sfs/resource-pool/create/create_test.go @@ -252,6 +252,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + async bool projectLabel string resp *sfs.CreateResourcePoolResponse } @@ -287,7 +288,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete.go b/internal/cmd/beta/sfs/resource-pool/delete/delete.go index 6883c3987..105dd37af 100644 --- a/internal/cmd/beta/sfs/resource-pool/delete/delete.go +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete.go @@ -82,7 +82,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { s.Stop() } - return outputResult(params.Printer, model.OutputFormat, resourcePoolName, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, resourcePoolName, resp) }, } return cmd @@ -110,9 +110,13 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func outputResult(p *print.Printer, outputFormat, resourcePoolName string, response map[string]interface{}) error { +func outputResult(p *print.Printer, outputFormat string, async bool, resourcePoolName string, response map[string]interface{}) error { return p.OutputResult(outputFormat, response, func() error { - p.Outputf("Deleted resource pool %q\n", resourcePoolName) + operationState := "Deleted" + if async { + operationState = "Triggered deletion of" + } + p.Outputf("%s resource pool %q\n", operationState, resourcePoolName) return nil }) } diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go b/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go index b41ed2626..ebdb37dd1 100644 --- a/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go @@ -175,6 +175,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + async bool resourcePoolName string response map[string]interface{} } @@ -201,7 +202,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.resourcePoolName, tt.args.response); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.resourcePoolName, tt.args.response); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/beta/sfs/resource-pool/update/update.go b/internal/cmd/beta/sfs/resource-pool/update/update.go index a276fb91e..82d54f6cd 100644 --- a/internal/cmd/beta/sfs/resource-pool/update/update.go +++ b/internal/cmd/beta/sfs/resource-pool/update/update.go @@ -110,7 +110,7 @@ The available performance class values can be obtained by running: s.Stop() } - return outputResult(params.Printer, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, resp) }, } configureFlags(cmd) @@ -165,13 +165,17 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return &model, nil } -func outputResult(p *print.Printer, outputFormat string, resp *sfs.UpdateResourcePoolResponse) error { +func outputResult(p *print.Printer, outputFormat string, async bool, resp *sfs.UpdateResourcePoolResponse) error { return p.OutputResult(outputFormat, resp, func() error { if resp == nil || resp.ResourcePool == nil { p.Outputln("Resource pool response is empty") return nil } - p.Outputf("Updated resource pool %s\n", utils.PtrString(resp.ResourcePool.Name)) + operationState := "Updated" + if async { + operationState = "Triggered update of" + } + p.Outputf("%s resource pool %s\n", operationState, utils.PtrString(resp.ResourcePool.Name)) return nil }) } diff --git a/internal/cmd/beta/sfs/resource-pool/update/update_test.go b/internal/cmd/beta/sfs/resource-pool/update/update_test.go index c94b79b92..bc47336c5 100644 --- a/internal/cmd/beta/sfs/resource-pool/update/update_test.go +++ b/internal/cmd/beta/sfs/resource-pool/update/update_test.go @@ -308,6 +308,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + async bool resp *sfs.UpdateResourcePoolResponse } tests := []struct { @@ -353,7 +354,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.resp); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index b11bb16a6..ef4f5c5e8 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -15,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/git" "github.com/stackitcloud/stackit-sdk-go/services/git/wait" ) @@ -28,7 +27,6 @@ const ( type inputModel struct { *globalflags.GlobalFlagModel - Id *string Name string Flavor string Acl []string @@ -80,20 +78,19 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if err != nil { return fmt.Errorf("create stackit git instance: %w", err) } - model.Id = result.Id // Wait for async operation, if async mode not enabled if !model.Async { s := spinner.New(params.Printer) s.Start("Creating stackit git instance") - _, err = wait.CreateGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, *model.Id).WaitWithContext(ctx) + _, err = wait.CreateGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, *result.Id).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for stackit git Instance creation: %w", err) } s.Stop() } - return outputResult(params.Printer, model, result) + return outputResult(params.Printer, model.OutputFormat, model.Async, model.Name, result) }, } @@ -143,17 +140,20 @@ func createPayload(model *inputModel) git.CreateInstancePayload { } } -func outputResult(p *print.Printer, model *inputModel, resp *git.Instance) error { - if model == nil { - return fmt.Errorf("input model is nil") +func outputResult(p *print.Printer, outputFormat string, async bool, instanceName string, resp *git.Instance) error { + if resp == nil { + return fmt.Errorf("API resp is nil") } - var outputFormat string - if model.GlobalFlagModel != nil { - outputFormat = model.OutputFormat + if resp.Id == nil { + return fmt.Errorf("API resp is missing instance id") } return p.OutputResult(outputFormat, resp, func() error { - p.Outputf("Created instance %q with id %s\n", model.Name, utils.PtrString(model.Id)) + operationState := "Created" + if async { + operationState = "Triggered creation of" + } + p.Outputf("%s instance %q with id %s\n", operationState, instanceName, *resp.Id) return nil }) } diff --git a/internal/cmd/git/instance/create/create_test.go b/internal/cmd/git/instance/create/create_test.go index bde352a95..ba2b24a1e 100644 --- a/internal/cmd/git/instance/create/create_test.go +++ b/internal/cmd/git/instance/create/create_test.go @@ -175,8 +175,10 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { - model *inputModel - resp *git.Instance + outputFormat string + async bool + instanceName string + resp *git.Instance } tests := []struct { name string @@ -184,30 +186,32 @@ func TestOutputResult(t *testing.T) { wantErr bool }{ { - name: "nil", + name: "nil response", args: args{ - model: nil, - resp: nil, + outputFormat: "", + async: false, + instanceName: "", + resp: nil, }, wantErr: true, }, { name: "empty input", args: args{ - model: &inputModel{}, - resp: &git.Instance{}, + outputFormat: "", + async: false, + instanceName: "", + resp: &git.Instance{Id: utils.Ptr(uuid.NewString())}, }, wantErr: false, }, { name: "output json", args: args{ - model: &inputModel{ - GlobalFlagModel: &globalflags.GlobalFlagModel{ - OutputFormat: print.JSONOutputFormat, - }, - }, - resp: nil, + outputFormat: print.JSONOutputFormat, + async: true, + instanceName: testName, + resp: &git.Instance{Id: utils.Ptr(uuid.NewString())}, }, wantErr: false, }, @@ -216,7 +220,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.model, tt.args.resp); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.instanceName, tt.args.resp); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/kms/key/create/create.go b/internal/cmd/kms/key/create/create.go index 076a2ffa7..01668fa75 100644 --- a/internal/cmd/kms/key/create/create.go +++ b/internal/cmd/kms/key/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -159,29 +157,14 @@ func outputResult(p *print.Printer, model *inputModel, resp *kms.Key) error { return fmt.Errorf("response is nil") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s the KMS key %q. Key ID: %s\n", operationState, utils.PtrString(resp.DisplayName), utils.PtrString(resp.Id)) - } - return nil + return nil + }) } func configureFlags(cmd *cobra.Command) { diff --git a/internal/cmd/kms/key/delete/delete.go b/internal/cmd/kms/key/delete/delete.go index a2fb3b3b0..b4001df2a 100644 --- a/internal/cmd/kms/key/delete/delete.go +++ b/internal/cmd/kms/key/delete/delete.go @@ -2,12 +2,10 @@ package delete import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -127,22 +125,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *kms.Key) error { return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal output to JSON: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal output to YAML: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Deletion of KMS key %s scheduled successfully for the deletion date: %s\n", utils.PtrString(resp.DisplayName), utils.PtrString(resp.DeletionDate)) - } - return nil + return nil + }) } diff --git a/internal/cmd/kms/key/importKey/importKey.go b/internal/cmd/kms/key/importKey/importKey.go index a04c9e3c5..01896fed6 100644 --- a/internal/cmd/kms/key/importKey/importKey.go +++ b/internal/cmd/kms/key/importKey/importKey.go @@ -3,12 +3,10 @@ package importKey import ( "context" "encoding/base64" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -148,26 +146,10 @@ func outputResult(p *print.Printer, outputFormat, keyRingName, keyName string, r return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Imported a new version for the key %q inside the key ring %q\n", keyName, keyRingName) - } - - return nil + return nil + }) } func configureFlags(cmd *cobra.Command) { diff --git a/internal/cmd/kms/key/list/list.go b/internal/cmd/kms/key/list/list.go index 911b63cb1..d437bff59 100644 --- a/internal/cmd/kms/key/list/list.go +++ b/internal/cmd/kms/key/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -106,22 +104,7 @@ func outputResult(p *print.Printer, outputFormat, projectId, keyRingId string, r keys := *resp.Keys - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(keys, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS Keys list: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(keys, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS Keys list: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, keys, func() error { if len(keys) == 0 { p.Outputf("No keys found for project %q under the key ring %q\n", projectId, keyRingId) return nil @@ -144,6 +127,6 @@ func outputResult(p *print.Printer, outputFormat, projectId, keyRingId string, r if err != nil { return fmt.Errorf("render table: %w", err) } - } - return nil + return nil + }) } diff --git a/internal/cmd/kms/key/restore/restore.go b/internal/cmd/kms/key/restore/restore.go index 85cab6c89..8fb333e98 100644 --- a/internal/cmd/kms/key/restore/restore.go +++ b/internal/cmd/kms/key/restore/restore.go @@ -2,12 +2,10 @@ package restore import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -126,22 +124,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *kms.Key) error { return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal output to JSON: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal output to YAML: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Successfully restored KMS key %q\n", utils.PtrString(resp.DisplayName)) - } - return nil + return nil + }) } diff --git a/internal/cmd/kms/key/rotate/rotate.go b/internal/cmd/kms/key/rotate/rotate.go index e02d58384..8b6619a4a 100644 --- a/internal/cmd/kms/key/rotate/rotate.go +++ b/internal/cmd/kms/key/rotate/rotate.go @@ -2,12 +2,10 @@ package rotate import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -120,24 +118,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) erro return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key version: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key version: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Rotated key %s\n", utils.PtrString(resp.KeyId)) - } - - return nil + return nil + }) } diff --git a/internal/cmd/kms/keyring/create/create.go b/internal/cmd/kms/keyring/create/create.go index 433cd4c7c..b663cbfb2 100644 --- a/internal/cmd/kms/keyring/create/create.go +++ b/internal/cmd/kms/keyring/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -147,29 +145,14 @@ func outputResult(p *print.Printer, model *inputModel, resp *kms.KeyRing) error return fmt.Errorf("response is nil") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key ring: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key ring: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s key ring. KMS key ring ID: %s\n", operationState, utils.PtrString(resp.Id)) - } - return nil + return nil + }) } func configureFlags(cmd *cobra.Command) { diff --git a/internal/cmd/kms/keyring/list/list.go b/internal/cmd/kms/keyring/list/list.go index 4928d67d3..01153a6d4 100644 --- a/internal/cmd/kms/keyring/list/list.go +++ b/internal/cmd/kms/keyring/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -91,22 +89,7 @@ func outputResult(p *print.Printer, outputFormat, projectId string, resp *kms.Ke keyRings := *resp.KeyRings - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(keyRings, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key rings list: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(keyRings, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key rings list: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, keyRings, func() error { if len(keyRings) == 0 { p.Outputf("No key rings found for project %q\n", projectId) return nil @@ -128,7 +111,6 @@ func outputResult(p *print.Printer, outputFormat, projectId string, resp *kms.Ke if err != nil { return fmt.Errorf("render table: %w", err) } - } - - return nil + return nil + }) } diff --git a/internal/cmd/kms/version/destroy/destroy.go b/internal/cmd/kms/version/destroy/destroy.go index 3b15e6e06..48b40d469 100644 --- a/internal/cmd/kms/version/destroy/destroy.go +++ b/internal/cmd/kms/version/destroy/destroy.go @@ -2,13 +2,11 @@ package destroy import ( "context" - "encoding/json" "fmt" "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -125,24 +123,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) erro return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Destroyed version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) - } - - return nil + return nil + }) } diff --git a/internal/cmd/kms/version/disable/disable.go b/internal/cmd/kms/version/disable/disable.go index 9c9be870d..760b909c7 100644 --- a/internal/cmd/kms/version/disable/disable.go +++ b/internal/cmd/kms/version/disable/disable.go @@ -2,13 +2,11 @@ package disable import ( "context" - "encoding/json" "fmt" "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -87,7 +85,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get key version: %v", err) } - return outputResult(params.Printer, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, resp) }, } @@ -133,29 +131,17 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { +func outputResult(p *print.Printer, outputFormat string, async bool, resp *kms.Version) error { if resp == nil { return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) + return p.OutputResult(outputFormat, resp, func() error { + operationState := "Disabled" + if async { + operationState = "Triggered disable of" } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - default: - p.Outputf("Disabled version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) - } - - return nil + p.Outputf("%s version %d of the key %q\n", operationState, utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) + return nil + }) } diff --git a/internal/cmd/kms/version/disable/disable_test.go b/internal/cmd/kms/version/disable/disable_test.go index 8108ea4b9..c7ecf0825 100644 --- a/internal/cmd/kms/version/disable/disable_test.go +++ b/internal/cmd/kms/version/disable/disable_test.go @@ -282,6 +282,7 @@ func TestOutputResult(t *testing.T) { description string wantErr bool outputFormat string + async bool resp *kms.Version }{ { @@ -312,7 +313,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - err := outputResult(p, tt.outputFormat, tt.resp) + err := outputResult(p, tt.outputFormat, tt.async, tt.resp) if (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } diff --git a/internal/cmd/kms/version/enable/enable.go b/internal/cmd/kms/version/enable/enable.go index 131bf3821..711792a94 100644 --- a/internal/cmd/kms/version/enable/enable.go +++ b/internal/cmd/kms/version/enable/enable.go @@ -2,13 +2,11 @@ package enable import ( "context" - "encoding/json" "fmt" "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -87,7 +85,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { params.Printer.Debug(print.ErrorLevel, "get key version: %v", err) } - return outputResult(params.Printer, model.OutputFormat, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, resp) }, } @@ -133,29 +131,17 @@ func configureFlags(cmd *cobra.Command) { cobra.CheckErr(err) } -func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) error { +func outputResult(p *print.Printer, outputFormat string, async bool, resp *kms.Version) error { if resp == nil { return fmt.Errorf("response is nil") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) + return p.OutputResult(outputFormat, resp, func() error { + operationState := "Enabled" + if async { + operationState = "Triggered enable of" } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS key: %w", err) - } - p.Outputln(string(details)) - - default: - p.Outputf("Enabled version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) - } - - return nil + p.Outputf("%s version %d of the key %q\n", operationState, utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) + return nil + }) } diff --git a/internal/cmd/kms/version/enable/enable_test.go b/internal/cmd/kms/version/enable/enable_test.go index 0cc35d43f..fe0edda01 100644 --- a/internal/cmd/kms/version/enable/enable_test.go +++ b/internal/cmd/kms/version/enable/enable_test.go @@ -282,6 +282,7 @@ func TestOutputResult(t *testing.T) { description string wantErr bool outputFormat string + async bool resp *kms.Version }{ { @@ -312,7 +313,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - err := outputResult(p, tt.outputFormat, tt.resp) + err := outputResult(p, tt.outputFormat, tt.async, tt.resp) if (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } diff --git a/internal/cmd/kms/version/list/list.go b/internal/cmd/kms/version/list/list.go index 7d3fcccc9..80361455a 100644 --- a/internal/cmd/kms/version/list/list.go +++ b/internal/cmd/kms/version/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -100,22 +98,7 @@ func outputResult(p *print.Printer, outputFormat, projectId, keyId string, resp } versions := *resp.Versions - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(versions, "", " ") - if err != nil { - return fmt.Errorf("marshal key versions list: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(versions, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal key versions list: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, versions, func() error { if len(versions) == 0 { p.Outputf("No key versions found for project %q for the key %q\n", projectId, keyId) return nil @@ -137,9 +120,8 @@ func outputResult(p *print.Printer, outputFormat, projectId, keyId string, resp if err != nil { return fmt.Errorf("render table: %w", err) } - } - - return nil + return nil + }) } func configureFlags(cmd *cobra.Command) { diff --git a/internal/cmd/kms/version/restore/restore.go b/internal/cmd/kms/version/restore/restore.go index 304f5a146..b87b6165c 100644 --- a/internal/cmd/kms/version/restore/restore.go +++ b/internal/cmd/kms/version/restore/restore.go @@ -2,13 +2,11 @@ package restore import ( "context" - "encoding/json" "fmt" "strconv" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -125,22 +123,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *kms.Version) erro return fmt.Errorf("response is nil / empty") } - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal output to JSON: %w", err) - } - p.Outputln(string(details)) - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal output to YAML: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, resp, func() error { p.Outputf("Restored version %d of the key %q\n", utils.PtrValue(resp.Number), utils.PtrValue(resp.KeyId)) - } - return nil + return nil + }) } diff --git a/internal/cmd/kms/wrappingkey/create/create.go b/internal/cmd/kms/wrappingkey/create/create.go index fc972126c..1f43c6e67 100644 --- a/internal/cmd/kms/wrappingkey/create/create.go +++ b/internal/cmd/kms/wrappingkey/create/create.go @@ -2,12 +2,10 @@ package create import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -144,30 +142,14 @@ func outputResult(p *print.Printer, model *inputModel, resp *kms.WrappingKey) er return fmt.Errorf("response is nil") } - switch model.OutputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(resp, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS wrapping key: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(resp, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS wrapping key: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(model.OutputFormat, resp, func() error { operationState := "Created" if model.Async { operationState = "Triggered creation of" } p.Outputf("%s wrapping key. Wrapping key ID: %s\n", operationState, utils.PtrString(resp.Id)) - } - - return nil + return nil + }) } func configureFlags(cmd *cobra.Command) { diff --git a/internal/cmd/kms/wrappingkey/list/list.go b/internal/cmd/kms/wrappingkey/list/list.go index 2046f6392..6f1498f76 100644 --- a/internal/cmd/kms/wrappingkey/list/list.go +++ b/internal/cmd/kms/wrappingkey/list/list.go @@ -2,12 +2,10 @@ package list import ( "context" - "encoding/json" "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/goccy/go-yaml" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -105,22 +103,7 @@ func outputResult(p *print.Printer, outputFormat, keyRingId string, resp *kms.Wr wrappingKeys := *resp.WrappingKeys - switch outputFormat { - case print.JSONOutputFormat: - details, err := json.MarshalIndent(wrappingKeys, "", " ") - if err != nil { - return fmt.Errorf("marshal KMS wrapping keys list: %w", err) - } - p.Outputln(string(details)) - - case print.YAMLOutputFormat: - details, err := yaml.MarshalWithOptions(wrappingKeys, yaml.IndentSequence(true), yaml.UseJSONMarshaler()) - if err != nil { - return fmt.Errorf("marshal KMS wrapping keys list: %w", err) - } - p.Outputln(string(details)) - - default: + return p.OutputResult(outputFormat, wrappingKeys, func() error { if len(wrappingKeys) == 0 { p.Outputf("No wrapping keys found under the key ring %q\n", keyRingId) return nil @@ -144,7 +127,6 @@ func outputResult(p *print.Printer, outputFormat, keyRingId string, resp *kms.Wr if err != nil { return fmt.Errorf("render table: %w", err) } - } - - return nil + return nil + }) } diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index a4b6e5ca9..44b611669 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -108,7 +108,11 @@ func NewCmd(params *types.CmdParams) *cobra.Command { s.Stop() } - params.Printer.Outputf("Restored instance %q with backup %q\n", model.InstanceId, model.BackupId) + operationState := "Restored" + if model.Async { + operationState = "Triggered restore of" + } + params.Printer.Outputf("%s instance %q with backup %q\n", operationState, model.InstanceId, model.BackupId) return nil } @@ -129,7 +133,11 @@ func NewCmd(params *types.CmdParams) *cobra.Command { s.Stop() } - params.Printer.Outputf("Cloned instance %q from backup with timestamp %q\n", model.InstanceId, model.Timestamp) + operationState := "Cloned" + if model.Async { + operationState = "Triggered clone of" + } + params.Printer.Outputf("%s instance %q from backup with timestamp %q\n", operationState, model.InstanceId, model.Timestamp) return nil }, } diff --git a/internal/cmd/network-area/region/create/create.go b/internal/cmd/network-area/region/create/create.go index 63a8c6348..0b59fa852 100644 --- a/internal/cmd/network-area/region/create/create.go +++ b/internal/cmd/network-area/region/create/create.go @@ -117,7 +117,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { s.Stop() } - return outputResult(params.Printer, model.OutputFormat, model.Region, networkAreaLabel, *resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, model.Region, networkAreaLabel, *resp) }, } configureFlags(cmd) @@ -186,9 +186,13 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.CreateNetworkAreaRegionPayload(payload) } -func outputResult(p *print.Printer, outputFormat, region, networkAreaLabel string, regionalArea iaas.RegionalArea) error { +func outputResult(p *print.Printer, outputFormat string, async bool, region, networkAreaLabel string, regionalArea iaas.RegionalArea) error { return p.OutputResult(outputFormat, regionalArea, func() error { - p.Outputf("Create region configuration for SNA %q.\nRegion: %s\n", networkAreaLabel, region) + operationState := "Created" + if async { + operationState = "Triggered creation of" + } + p.Outputf("%s region configuration for SNA %q.\nRegion: %s\n", operationState, networkAreaLabel, region) return nil }) } diff --git a/internal/cmd/network-area/region/create/create_test.go b/internal/cmd/network-area/region/create/create_test.go index cf92c59c3..cff70a377 100644 --- a/internal/cmd/network-area/region/create/create_test.go +++ b/internal/cmd/network-area/region/create/create_test.go @@ -267,6 +267,7 @@ func TestBuildRequest(t *testing.T) { func Test_outputResult(t *testing.T) { type args struct { outputFormat string + async bool region string networkAreaLabel string regionalArea iaas.RegionalArea @@ -300,7 +301,7 @@ func Test_outputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.region, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.region, tt.args.networkAreaLabel, tt.args.regionalArea); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index a93efcbf7..ab5253af0 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -153,7 +153,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { s.Stop() } - return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } configureFlags(cmd) @@ -322,12 +322,16 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli return req.CreateServerPayload(payload) } -func outputResult(p *print.Printer, outputFormat, projectLabel string, server *iaas.Server) error { +func outputResult(p *print.Printer, outputFormat string, async bool, projectLabel string, server *iaas.Server) error { if server == nil { return fmt.Errorf("server response is empty") } return p.OutputResult(outputFormat, server, func() error { - p.Outputf("Created server for project %q.\nServer ID: %s\n", projectLabel, utils.PtrString(server.Id)) + operationState := "Created" + if async { + operationState = "Triggered creation of" + } + p.Outputf("%s server for project %q.\nServer ID: %s\n", operationState, projectLabel, utils.PtrString(server.Id)) return nil }) } diff --git a/internal/cmd/server/create/create_test.go b/internal/cmd/server/create/create_test.go index 521b80922..7ab029013 100644 --- a/internal/cmd/server/create/create_test.go +++ b/internal/cmd/server/create/create_test.go @@ -382,6 +382,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string + async bool projectLabel string server *iaas.Server } @@ -407,7 +408,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.server); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.async, tt.args.projectLabel, tt.args.server); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index f0bda5f69..f82725de6 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -184,7 +184,11 @@ func outputResult(p *print.Printer, model *inputModel, projectLabel string, volu return fmt.Errorf("volume response is empty") } return p.OutputResult(model.OutputFormat, volume, func() error { - p.Outputf("Created volume for project %q.\nVolume ID: %s\n", projectLabel, utils.PtrString(volume.Id)) + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s volume for project %q.\nVolume ID: %s\n", operationState, projectLabel, utils.PtrString(volume.Id)) return nil }) } From 001684e94c6cb8bb33fcf307855f722e3fa91b4e Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Fri, 20 Mar 2026 18:03:18 +0100 Subject: [PATCH 409/422] feat(opensearch) describe also prints host and hosts if available (#1346) --- .../credentials/describe/describe.go | 8 +++++ .../credentials/describe/describe_test.go | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/internal/cmd/opensearch/credentials/describe/describe.go b/internal/cmd/opensearch/credentials/describe/describe.go index 17ddd78f9..50a495940 100644 --- a/internal/cmd/opensearch/credentials/describe/describe.go +++ b/internal/cmd/opensearch/credentials/describe/describe.go @@ -3,6 +3,7 @@ package describe import ( "context" "fmt" + "strings" "github.com/stackitcloud/stackit-cli/internal/pkg/types" @@ -121,6 +122,13 @@ func outputResult(p *print.Printer, outputFormat string, credentials *opensearch table.AddRow("PASSWORD", utils.PtrString(credentials.Raw.Credentials.Password)) table.AddSeparator() table.AddRow("URI", utils.PtrString(credentials.Raw.Credentials.Uri)) + table.AddSeparator() + table.AddRow("HOST", utils.PtrString(credentials.Raw.Credentials.Host)) + hosts := credentials.Raw.Credentials.Hosts + if hosts != nil && len(*hosts) > 0 { + table.AddSeparator() + table.AddRow("HOSTS", strings.Join(*hosts, "\n")) + } } err := table.Display(p) if err != nil { diff --git a/internal/cmd/opensearch/credentials/describe/describe_test.go b/internal/cmd/opensearch/credentials/describe/describe_test.go index 254912869..2d8ec1a32 100644 --- a/internal/cmd/opensearch/credentials/describe/describe_test.go +++ b/internal/cmd/opensearch/credentials/describe/describe_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -220,6 +221,35 @@ func TestOutputResult(t *testing.T) { }, wantErr: false, }, + { + name: "host and hosts", + args: args{ + credentials: &opensearch.CredentialsResponse{ + Raw: &opensearch.RawCredentials{ + Credentials: &opensearch.Credentials{ + Host: utils.Ptr("host"), + Hosts: utils.Ptr([]string{ + "hosts-a", + "hosts-b", + }), + }, + }, + }, + }, + }, + { + name: "raw credentials nil host & hosts", + args: args{ + credentials: &opensearch.CredentialsResponse{ + Raw: &opensearch.RawCredentials{ + Credentials: &opensearch.Credentials{ + Host: nil, + Hosts: nil, + }, + }, + }, + }, + }, } p := print.NewPrinter() p.Cmd = NewCmd(&types.CmdParams{Printer: p}) From d1a943f189142be5f8bf53dd7c93dfd8778d373b Mon Sep 17 00:00:00 2001 From: Sven Inter <102514411+s-inter@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:40:45 +0100 Subject: [PATCH 410/422] feat(iaas): implement server security group attach/detach commands (#1341) relates to STACKITCLI-308 and #1216 --- docs/stackit_server.md | 1 + docs/stackit_server_security-group.md | 35 ++++ docs/stackit_server_security-group_attach.md | 42 ++++ docs/stackit_server_security-group_detach.md | 42 ++++ .../server/security-group/attach/attach.go | 119 ++++++++++++ .../security-group/attach/attach_test.go | 181 ++++++++++++++++++ .../server/security-group/detach/detach.go | 119 ++++++++++++ .../security-group/detach/detach_test.go | 181 ++++++++++++++++++ .../server/security-group/security-group.go | 28 +++ internal/cmd/server/server.go | 2 + .../server/service-account/detach/detach.go | 2 +- 11 files changed, 751 insertions(+), 1 deletion(-) create mode 100644 docs/stackit_server_security-group.md create mode 100644 docs/stackit_server_security-group_attach.md create mode 100644 docs/stackit_server_security-group_detach.md create mode 100644 internal/cmd/server/security-group/attach/attach.go create mode 100644 internal/cmd/server/security-group/attach/attach_test.go create mode 100644 internal/cmd/server/security-group/detach/detach.go create mode 100644 internal/cmd/server/security-group/detach/detach_test.go create mode 100644 internal/cmd/server/security-group/security-group.go diff --git a/docs/stackit_server.md b/docs/stackit_server.md index 83bf55541..267a8df3b 100644 --- a/docs/stackit_server.md +++ b/docs/stackit_server.md @@ -46,6 +46,7 @@ stackit server [flags] * [stackit server reboot](./stackit_server_reboot.md) - Reboots a server * [stackit server rescue](./stackit_server_rescue.md) - Rescues an existing server * [stackit server resize](./stackit_server_resize.md) - Resizes the server to the given machine type +* [stackit server security-group](./stackit_server_security-group.md) - Allows attaching/detaching security groups to servers * [stackit server service-account](./stackit_server_service-account.md) - Allows attaching/detaching service accounts to servers * [stackit server start](./stackit_server_start.md) - Starts an existing server or allocates the server if deallocated * [stackit server stop](./stackit_server_stop.md) - Stops an existing server diff --git a/docs/stackit_server_security-group.md b/docs/stackit_server_security-group.md new file mode 100644 index 000000000..b44ce57e4 --- /dev/null +++ b/docs/stackit_server_security-group.md @@ -0,0 +1,35 @@ +## stackit server security-group + +Allows attaching/detaching security groups to servers + +### Synopsis + +Allows attaching/detaching security groups to servers. + +``` +stackit server security-group [flags] +``` + +### Options + +``` + -h, --help Help for "stackit server security-group" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit server](./stackit_server.md) - Provides functionality for servers +* [stackit server security-group attach](./stackit_server_security-group_attach.md) - Attaches a security group to a server +* [stackit server security-group detach](./stackit_server_security-group_detach.md) - Detaches a security group from a server + diff --git a/docs/stackit_server_security-group_attach.md b/docs/stackit_server_security-group_attach.md new file mode 100644 index 000000000..c42466381 --- /dev/null +++ b/docs/stackit_server_security-group_attach.md @@ -0,0 +1,42 @@ +## stackit server security-group attach + +Attaches a security group to a server + +### Synopsis + +Attaches a security group to a server. + +``` +stackit server security-group attach [flags] +``` + +### Examples + +``` + Attach a security group with ID "xxx" to a server with ID "yyy" + $ stackit server security-group attach --server-id yyy --security-group-id xxx +``` + +### Options + +``` + -h, --help Help for "stackit server security-group attach" + --security-group-id string Security Group ID + --server-id string Server ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit server security-group](./stackit_server_security-group.md) - Allows attaching/detaching security groups to servers + diff --git a/docs/stackit_server_security-group_detach.md b/docs/stackit_server_security-group_detach.md new file mode 100644 index 000000000..493eee69f --- /dev/null +++ b/docs/stackit_server_security-group_detach.md @@ -0,0 +1,42 @@ +## stackit server security-group detach + +Detaches a security group from a server + +### Synopsis + +Detaches a security group from a server. + +``` +stackit server security-group detach [flags] +``` + +### Examples + +``` + Detach a security group with ID "xxx" from a server with ID "yyy" + $ stackit server security-group detach --server-id yyy --security-group-id xxx +``` + +### Options + +``` + -h, --help Help for "stackit server security-group detach" + --security-group-id string Security Group ID + --server-id string Server ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit server security-group](./stackit_server_security-group.md) - Allows attaching/detaching security groups to servers + diff --git a/internal/cmd/server/security-group/attach/attach.go b/internal/cmd/server/security-group/attach/attach.go new file mode 100644 index 000000000..a5942bce9 --- /dev/null +++ b/internal/cmd/server/security-group/attach/attach.go @@ -0,0 +1,119 @@ +package attach + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + serverIdFlag = "server-id" + securityGroupIdFlag = "security-group-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ServerId string + SecurityGroupId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "attach", + Short: "Attaches a security group to a server", + Long: "Attaches a security group to a server.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Attach a security group with ID "xxx" to a server with ID "yyy"`, + `$ stackit server security-group attach --server-id yyy --security-group-id xxx`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) + serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId + } + + securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) + securityGroupLabel = model.SecurityGroupId + } + + prompt := fmt.Sprintf("Are you sure you want to attach security group %q to server %q?", securityGroupLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + if err := req.Execute(); err != nil { + return fmt.Errorf("attach security group to server: %w", err) + } + + params.Printer.Outputf("Attached security group %q to server %q\n", securityGroupLabel, serverLabel) + + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), serverIdFlag, "Server ID") + cmd.Flags().Var(flags.UUIDFlag(), securityGroupIdFlag, "Security Group ID") + + err := flags.MarkFlagsRequired(cmd, serverIdFlag, securityGroupIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), + SecurityGroupId: flags.FlagToStringValue(p, cmd, securityGroupIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiAddSecurityGroupToServerRequest { + req := apiClient.AddSecurityGroupToServer(ctx, model.ProjectId, model.Region, model.ServerId, model.SecurityGroupId) + return req +} diff --git a/internal/cmd/server/security-group/attach/attach_test.go b/internal/cmd/server/security-group/attach/attach_test.go new file mode 100644 index 000000000..74261c56b --- /dev/null +++ b/internal/cmd/server/security-group/attach/attach_test.go @@ -0,0 +1,181 @@ +package attach + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} +var testProjectId = uuid.NewString() +var testServerId = uuid.NewString() +var testSecurityGroupId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, + securityGroupIdFlag: testSecurityGroupId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + ServerId: testServerId, + SecurityGroupId: testSecurityGroupId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiAddSecurityGroupToServerRequest)) iaas.ApiAddSecurityGroupToServerRequest { + request := testClient.AddSecurityGroupToServer(testCtx, testProjectId, testRegion, testServerId, testSecurityGroupId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "security group id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, securityGroupIdFlag) + }), + isValid: false, + }, + { + description: "security group id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[securityGroupIdFlag] = "" + }), + isValid: false, + }, + { + description: "security group id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[securityGroupIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "server id flag missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, serverIdFlag) + }), + isValid: false, + }, + { + description: "server id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "" + }), + isValid: false, + }, + { + description: "server id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, []string{}, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiAddSecurityGroupToServerRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/server/security-group/detach/detach.go b/internal/cmd/server/security-group/detach/detach.go new file mode 100644 index 000000000..ef8217385 --- /dev/null +++ b/internal/cmd/server/security-group/detach/detach.go @@ -0,0 +1,119 @@ +package detach + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + serverIdFlag = "server-id" + securityGroupIdFlag = "security-group-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + ServerId string + SecurityGroupId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "detach", + Short: "Detaches a security group from a server", + Long: "Detaches a security group from a server.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Detach a security group with ID "xxx" from a server with ID "yyy"`, + `$ stackit server security-group detach --server-id yyy --security-group-id xxx`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + serverLabel, err := iaasUtils.GetServerName(ctx, apiClient, model.ProjectId, model.Region, model.ServerId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get server name: %v", err) + serverLabel = model.ServerId + } else if serverLabel == "" { + serverLabel = model.ServerId + } + + securityGroupLabel, err := iaasUtils.GetSecurityGroupName(ctx, apiClient, model.ProjectId, model.Region, model.SecurityGroupId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get security group name: %v", err) + securityGroupLabel = model.SecurityGroupId + } + + prompt := fmt.Sprintf("Are you sure you want to detach security group %q from server %q?", securityGroupLabel, serverLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + if err := req.Execute(); err != nil { + return fmt.Errorf("detach security group from server: %w", err) + } + + params.Printer.Outputf("Detached security group %q from server %q\n", securityGroupLabel, serverLabel) + + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), serverIdFlag, "Server ID") + cmd.Flags().Var(flags.UUIDFlag(), securityGroupIdFlag, "Security Group ID") + + err := flags.MarkFlagsRequired(cmd, serverIdFlag, securityGroupIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + ServerId: flags.FlagToStringValue(p, cmd, serverIdFlag), + SecurityGroupId: flags.FlagToStringValue(p, cmd, securityGroupIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiRemoveSecurityGroupFromServerRequest { + req := apiClient.RemoveSecurityGroupFromServer(ctx, model.ProjectId, model.Region, model.ServerId, model.SecurityGroupId) + return req +} diff --git a/internal/cmd/server/security-group/detach/detach_test.go b/internal/cmd/server/security-group/detach/detach_test.go new file mode 100644 index 000000000..3860bc1ac --- /dev/null +++ b/internal/cmd/server/security-group/detach/detach_test.go @@ -0,0 +1,181 @@ +package detach + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + testRegion = "eu01" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} +var testProjectId = uuid.NewString() +var testServerId = uuid.NewString() +var testSecurityGroupId = uuid.NewString() + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + + serverIdFlag: testServerId, + securityGroupIdFlag: testSecurityGroupId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + ProjectId: testProjectId, + Region: testRegion, + }, + ServerId: testServerId, + SecurityGroupId: testSecurityGroupId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiRemoveSecurityGroupFromServerRequest)) iaas.ApiRemoveSecurityGroupFromServerRequest { + request := testClient.RemoveSecurityGroupFromServer(testCtx, testProjectId, testRegion, testServerId, testSecurityGroupId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "security group id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, securityGroupIdFlag) + }), + isValid: false, + }, + { + description: "security group id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[securityGroupIdFlag] = "" + }), + isValid: false, + }, + { + description: "security group id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[securityGroupIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "server id flag missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, serverIdFlag) + }), + isValid: false, + }, + { + description: "server id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "" + }), + isValid: false, + }, + { + description: "server id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[serverIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, []string{}, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiRemoveSecurityGroupFromServerRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/server/security-group/security-group.go b/internal/cmd/server/security-group/security-group.go new file mode 100644 index 000000000..aed9bfa4a --- /dev/null +++ b/internal/cmd/server/security-group/security-group.go @@ -0,0 +1,28 @@ +package securitygroup + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/server/security-group/attach" + "github.com/stackitcloud/stackit-cli/internal/cmd/server/security-group/detach" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "security-group", + Short: "Allows attaching/detaching security groups to servers", + Long: "Allows attaching/detaching security groups to servers.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(attach.NewCmd(params)) + cmd.AddCommand(detach.NewCmd(params)) +} diff --git a/internal/cmd/server/server.go b/internal/cmd/server/server.go index e671fda2b..3cb8a5ffc 100644 --- a/internal/cmd/server/server.go +++ b/internal/cmd/server/server.go @@ -17,6 +17,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/server/reboot" "github.com/stackitcloud/stackit-cli/internal/cmd/server/rescue" "github.com/stackitcloud/stackit-cli/internal/cmd/server/resize" + securitygroup "github.com/stackitcloud/stackit-cli/internal/cmd/server/security-group" serviceaccount "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account" "github.com/stackitcloud/stackit-cli/internal/cmd/server/start" "github.com/stackitcloud/stackit-cli/internal/cmd/server/stop" @@ -51,6 +52,7 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(publicip.NewCmd(params)) + cmd.AddCommand(securitygroup.NewCmd(params)) cmd.AddCommand(serviceaccount.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) cmd.AddCommand(volume.NewCmd(params)) diff --git a/internal/cmd/server/service-account/detach/detach.go b/internal/cmd/server/service-account/detach/detach.go index 00830e7d6..07b34db82 100644 --- a/internal/cmd/server/service-account/detach/detach.go +++ b/internal/cmd/server/service-account/detach/detach.go @@ -63,7 +63,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { serverLabel = model.ServerId } - prompt := fmt.Sprintf("Are your sure you want to detach service account %q from a server %q?", model.ServiceAccMail, serverLabel) + prompt := fmt.Sprintf("Are you sure you want to detach service account %q from a server %q?", model.ServiceAccMail, serverLabel) err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err From 36fff240ec58973ed935ef5da7bc677db35be94e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Wed, 25 Mar 2026 14:26:07 +0100 Subject: [PATCH 411/422] chore(objectstorage): migrate to new SDK structure (#1348) relates to STACKITCLI-369 --- go.mod | 4 +- go.sum | 8 +- .../object-storage/bucket/create/create.go | 10 +- .../bucket/create/create_test.go | 8 +- .../object-storage/bucket/delete/delete.go | 8 +- .../bucket/delete/delete_test.go | 8 +- .../bucket/describe/describe.go | 23 ++- .../bucket/describe/describe_test.go | 16 +- .../cmd/object-storage/bucket/list/list.go | 13 +- .../object-storage/bucket/list/list_test.go | 8 +- .../credentials-group/create/create.go | 24 ++- .../credentials-group/create/create_test.go | 22 +-- .../credentials-group/delete/delete.go | 6 +- .../credentials-group/delete/delete_test.go | 8 +- .../credentials-group/list/list.go | 11 +- .../credentials-group/list/list_test.go | 8 +- .../credentials/create/create.go | 15 +- .../credentials/create/create_test.go | 8 +- .../credentials/delete/delete.go | 8 +- .../credentials/delete/delete_test.go | 8 +- .../object-storage/credentials/list/list.go | 14 +- .../credentials/list/list_test.go | 8 +- .../cmd/object-storage/disable/disable.go | 4 +- .../object-storage/disable/disable_test.go | 8 +- internal/cmd/object-storage/enable/enable.go | 4 +- .../cmd/object-storage/enable/enable_test.go | 8 +- .../services/object-storage/client/client.go | 4 +- .../services/object-storage/utils/utils.go | 30 ++- .../object-storage/utils/utils_test.go | 184 +++++++----------- 29 files changed, 217 insertions(+), 271 deletions(-) diff --git a/go.mod b/go.mod index 3eeeb67c5..8d49310e1 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.21.0 - github.com/stackitcloud/stackit-sdk-go/core v0.22.0 + github.com/stackitcloud/stackit-sdk-go/core v0.23.0 github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0 github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/cdn v1.10.0 @@ -269,7 +269,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/loadbalancer v1.8.0 github.com/stackitcloud/stackit-sdk-go/services/logme v0.25.6 github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 - github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 + github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.7.0 github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 github.com/stackitcloud/stackit-sdk-go/services/rabbitmq v0.26.0 github.com/stackitcloud/stackit-sdk-go/services/redis v0.25.6 diff --git a/go.sum b/go.sum index 9f1896727..ad605a10d 100644 --- a/go.sum +++ b/go.sum @@ -596,8 +596,8 @@ github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stackitcloud/stackit-sdk-go/core v0.22.0 h1:6rViz7GnNwXSh51Lur5xuDzO8EWSZfN9J0HvEkBKq6c= -github.com/stackitcloud/stackit-sdk-go/core v0.22.0/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= +github.com/stackitcloud/stackit-sdk-go/core v0.23.0 h1:zPrOhf3Xe47rKRs1fg/AqKYUiJJRYjdcv+3qsS50mEs= +github.com/stackitcloud/stackit-sdk-go/core v0.23.0/go.mod h1:osMglDby4csGZ5sIfhNyYq1bS1TxIdPY88+skE/kkmI= github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0 h1:V9+885qkSv621rZZatg1YE5ENM1ElALxQDJsh+hDIUg= github.com/stackitcloud/stackit-sdk-go/services/alb v0.10.0/go.mod h1:V6+MolxM/M2FWyWZA+FRFKEzzUe10MU9eEVfMvxHGi8= github.com/stackitcloud/stackit-sdk-go/services/authorization v0.12.0 h1:HxPgBu04j5tj6nfZ2r0l6v4VXC0/tYOGe4sA5Addra8= @@ -626,8 +626,8 @@ github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6 h1:Y/byRjX2u/OZl github.com/stackitcloud/stackit-sdk-go/services/mariadb v0.25.6/go.mod h1:sY66ZgCgBc1mScPV95ek5WtUEGYizdP1RMsGaqbdbhw= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8 h1:S7t4wcT6SN8ZzdoY8d6VbF903zFpGjzqrU0FN27rJPg= github.com/stackitcloud/stackit-sdk-go/services/mongodbflex v1.5.8/go.mod h1:CdrhFUsBO7/iJleCc2yQjDChIbG6YaxKNBQRNCjgcF4= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5 h1:4gpvB6t7d2lLjInoTxcvjL9jCpBl5EDfYe5yUtR1MvA= -github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.4.5/go.mod h1:Bdcd59sRySyhfSUCy+5BNkp5w9PECmrywdvt+ORMKnI= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.7.0 h1:UxnbsKm6PQV8Gudw/EhySaEh9q1xSaTG8mzJz1EvhnE= +github.com/stackitcloud/stackit-sdk-go/services/objectstorage v1.7.0/go.mod h1:RFL4h6JZvpsyFYbdJ3+eINEkletzJQTfrPdd+yPT/fU= github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0 h1:LGwCvvST0fwUgZ6bOxYIfu45qqTgv421ZS07UhKjZL8= github.com/stackitcloud/stackit-sdk-go/services/observability v0.17.0/go.mod h1:9KdrXC5JS30Ay3mR0adb3vNdhca+qxiy/cPF5P4wehQ= github.com/stackitcloud/stackit-sdk-go/services/opensearch v0.24.6 h1:oTVx1+O177Ojn8OvXIOUbRSwtx7L59jhxDPrZEQFOfQ= diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index 9b8aae9a3..b0a387572 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -16,8 +16,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/wait" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api/wait" ) const ( @@ -60,7 +60,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } // Check if the project is enabled before trying to create - enabled, err := utils.ProjectEnabled(ctx, apiClient, model.ProjectId, model.Region) + enabled, err := utils.ProjectEnabled(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region) if err != nil { return fmt.Errorf("check if Object Storage is enabled: %w", err) } @@ -81,7 +81,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Creating bucket") - _, err = wait.CreateBucketWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) + _, err = wait.CreateBucketWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for Object Storage bucket creation: %w", err) } @@ -112,7 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiCreateBucketRequest { - req := apiClient.CreateBucket(ctx, model.ProjectId, model.Region, model.BucketName) + req := apiClient.DefaultAPI.CreateBucket(ctx, model.ProjectId, model.Region, model.BucketName) return req } diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index da4fcb9cf..905677814 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -13,13 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const ( @@ -64,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiCreateBucketRequest)) objectstorage.ApiCreateBucketRequest { - request := testClient.CreateBucket(testCtx, testProjectId, testRegion, testBucketName) + request := testClient.DefaultAPI.CreateBucket(testCtx, testProjectId, testRegion, testBucketName) for _, mod := range mods { mod(&request) } @@ -161,7 +161,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index c06e88718..99a82da85 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -15,8 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/wait" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api/wait" ) const ( @@ -69,7 +69,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { s := spinner.New(params.Printer) s.Start("Deleting bucket") - _, err = wait.DeleteBucketWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) + _, err = wait.DeleteBucketWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) if err != nil { return fmt.Errorf("wait for Object Storage bucket deletion: %w", err) } @@ -105,6 +105,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiDeleteBucketRequest { - req := apiClient.DeleteBucket(ctx, model.ProjectId, model.Region, model.BucketName) + req := apiClient.DefaultAPI.DeleteBucket(ctx, model.ProjectId, model.Region, model.BucketName) return req } diff --git a/internal/cmd/object-storage/bucket/delete/delete_test.go b/internal/cmd/object-storage/bucket/delete/delete_test.go index 829c374cf..2bc6f06be 100644 --- a/internal/cmd/object-storage/bucket/delete/delete_test.go +++ b/internal/cmd/object-storage/bucket/delete/delete_test.go @@ -10,13 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const ( @@ -61,7 +61,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiDeleteBucketRequest)) objectstorage.ApiDeleteBucketRequest { - request := testClient.DeleteBucket(testCtx, testProjectId, testRegion, testBucketName) + request := testClient.DefaultAPI.DeleteBucket(testCtx, testProjectId, testRegion, testBucketName) for _, mod := range mods { mod(&request) } @@ -158,7 +158,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index a2a3ceedb..de374c8d8 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -13,10 +13,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -61,7 +60,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return fmt.Errorf("read Object Storage bucket: %w", err) } - return outputResult(params.Printer, model.OutputFormat, resp.Bucket) + return outputResult(params.Printer, model.OutputFormat, resp) }, } return cmd @@ -85,24 +84,24 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiGetBucketRequest { - req := apiClient.GetBucket(ctx, model.ProjectId, model.Region, model.BucketName) + req := apiClient.DefaultAPI.GetBucket(ctx, model.ProjectId, model.Region, model.BucketName) return req } -func outputResult(p *print.Printer, outputFormat string, bucket *objectstorage.Bucket) error { - if bucket == nil { - return fmt.Errorf("bucket is empty") +func outputResult(p *print.Printer, outputFormat string, resp *objectstorage.GetBucketResponse) error { + if resp == nil { + return fmt.Errorf("response is nil") } - return p.OutputResult(outputFormat, bucket, func() error { + return p.OutputResult(outputFormat, resp.Bucket, func() error { table := tables.NewTable() - table.AddRow("Name", utils.PtrString(bucket.Name)) + table.AddRow("Name", resp.Bucket.Name) table.AddSeparator() - table.AddRow("Region", utils.PtrString(bucket.Region)) + table.AddRow("Region", resp.Bucket.Region) table.AddSeparator() - table.AddRow("URL (Path Style)", utils.PtrString(bucket.UrlPathStyle)) + table.AddRow("URL (Path Style)", resp.Bucket.UrlPathStyle) table.AddSeparator() - table.AddRow("URL (Virtual Hosted Style)", utils.PtrString(bucket.UrlVirtualHostedStyle)) + table.AddRow("URL (Virtual Hosted Style)", resp.Bucket.UrlVirtualHostedStyle) table.AddSeparator() err := table.Display(p) if err != nil { diff --git a/internal/cmd/object-storage/bucket/describe/describe_test.go b/internal/cmd/object-storage/bucket/describe/describe_test.go index 106844ed2..86deeef89 100644 --- a/internal/cmd/object-storage/bucket/describe/describe_test.go +++ b/internal/cmd/object-storage/bucket/describe/describe_test.go @@ -13,13 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const ( @@ -64,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiGetBucketRequest)) objectstorage.ApiGetBucketRequest { - request := testClient.GetBucket(testCtx, testProjectId, testRegion, testBucketName) + request := testClient.DefaultAPI.GetBucket(testCtx, testProjectId, testRegion, testBucketName) for _, mod := range mods { mod(&request) } @@ -161,7 +161,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { @@ -174,7 +174,7 @@ func TestBuildRequest(t *testing.T) { func TestOutputResult(t *testing.T) { type args struct { outputFormat string - bucket *objectstorage.Bucket + resp *objectstorage.GetBucketResponse } tests := []struct { name string @@ -187,9 +187,9 @@ func TestOutputResult(t *testing.T) { wantErr: true, }, { - name: "set empty bucket", + name: "set empty response", args: args{ - bucket: &objectstorage.Bucket{}, + resp: &objectstorage.GetBucketResponse{}, }, wantErr: false, }, @@ -198,7 +198,7 @@ func TestOutputResult(t *testing.T) { p.Cmd = NewCmd(&types.CmdParams{Printer: p}) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := outputResult(p, tt.args.outputFormat, tt.args.bucket); (err != nil) != tt.wantErr { + if err := outputResult(p, tt.args.outputFormat, tt.args.resp); (err != nil) != tt.wantErr { t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) } }) diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index ff01c60d6..e26c926e5 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -16,8 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -114,7 +113,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiListBucketsRequest { - req := apiClient.ListBuckets(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.ListBuckets(ctx, model.ProjectId, model.Region) return req } @@ -134,10 +133,10 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, buckets [ for i := range buckets { bucket := buckets[i] table.AddRow( - utils.PtrString(bucket.Name), - utils.PtrString(bucket.Region), - utils.PtrString(bucket.UrlPathStyle), - utils.PtrString(bucket.UrlVirtualHostedStyle), + bucket.Name, + bucket.Region, + bucket.UrlPathStyle, + bucket.UrlVirtualHostedStyle, ) } err := table.Display(p) diff --git a/internal/cmd/object-storage/bucket/list/list_test.go b/internal/cmd/object-storage/bucket/list/list_test.go index 47be7605e..c2916bfb3 100644 --- a/internal/cmd/object-storage/bucket/list/list_test.go +++ b/internal/cmd/object-storage/bucket/list/list_test.go @@ -14,13 +14,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() var testRegion = "eu01" @@ -52,7 +52,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiListBucketsRequest)) objectstorage.ApiListBucketsRequest { - request := testClient.ListBuckets(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.ListBuckets(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -140,7 +140,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index 9150b98fe..1b6651444 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -6,6 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -13,10 +14,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - - "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -95,24 +93,24 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiCreateCredentialsGroupRequest { - req := apiClient.CreateCredentialsGroup(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.CreateCredentialsGroup(ctx, model.ProjectId, model.Region) req = req.CreateCredentialsGroupPayload(objectstorage.CreateCredentialsGroupPayload{ - DisplayName: utils.Ptr(model.CredentialsGroupName), + DisplayName: model.CredentialsGroupName, }) return req } func outputResult(p *print.Printer, outputFormat string, resp *objectstorage.CreateCredentialsGroupResponse) error { - if resp == nil || resp.CredentialsGroup == nil { - return fmt.Errorf("create createndials group response is empty") - } - return p.OutputResult(outputFormat, resp, func() error { + if resp == nil { + return fmt.Errorf("create credentials group response is empty") + } + p.Outputf("Created credentials group %q. Credentials group ID: %s\n\n", - utils.PtrString(resp.CredentialsGroup.DisplayName), - utils.PtrString(resp.CredentialsGroup.CredentialsGroupId), + resp.CredentialsGroup.DisplayName, + resp.CredentialsGroup.CredentialsGroupId, ) - p.Outputf("URN: %s\n", utils.PtrString(resp.CredentialsGroup.Urn)) + p.Outputf("URN: %s\n", resp.CredentialsGroup.Urn) return nil }) } diff --git a/internal/cmd/object-storage/credentials-group/create/create_test.go b/internal/cmd/object-storage/credentials-group/create/create_test.go index 2823fc5da..1b3fc9216 100644 --- a/internal/cmd/object-storage/credentials-group/create/create_test.go +++ b/internal/cmd/object-storage/credentials-group/create/create_test.go @@ -6,21 +6,19 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const ( @@ -57,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { func fixturePayload(mods ...func(payload *objectstorage.CreateCredentialsGroupPayload)) objectstorage.CreateCredentialsGroupPayload { payload := objectstorage.CreateCredentialsGroupPayload{ - DisplayName: utils.Ptr(testCredentialsGroupName), + DisplayName: testCredentialsGroupName, } for _, mod := range mods { mod(&payload) @@ -66,7 +64,7 @@ func fixturePayload(mods ...func(payload *objectstorage.CreateCredentialsGroupPa } func fixtureRequest(mods ...func(request *objectstorage.ApiCreateCredentialsGroupRequest)) objectstorage.ApiCreateCredentialsGroupRequest { - request := testClient.CreateCredentialsGroup(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.CreateCredentialsGroup(testCtx, testProjectId, testRegion) request = request.CreateCredentialsGroupPayload(fixturePayload()) for _, mod := range mods { mod(&request) @@ -148,7 +146,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { @@ -178,13 +176,13 @@ func TestOutputResult(t *testing.T) { args: args{ createCredentialsGroupResponse: &objectstorage.CreateCredentialsGroupResponse{}, }, - wantErr: true, + wantErr: false, }, { name: "set create credentials group response", args: args{ createCredentialsGroupResponse: &objectstorage.CreateCredentialsGroupResponse{ - CredentialsGroup: &objectstorage.CredentialsGroup{}, + CredentialsGroup: objectstorage.CredentialsGroup{}, }, }, wantErr: false, diff --git a/internal/cmd/object-storage/credentials-group/delete/delete.go b/internal/cmd/object-storage/credentials-group/delete/delete.go index 79daa26b3..ac14221e1 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -52,7 +52,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) + credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient.DefaultAPI, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId @@ -96,6 +96,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiDeleteCredentialsGroupRequest { - req := apiClient.DeleteCredentialsGroup(ctx, model.ProjectId, model.Region, model.CredentialsGroupId) + req := apiClient.DefaultAPI.DeleteCredentialsGroup(ctx, model.ProjectId, model.Region, model.CredentialsGroupId) return req } diff --git a/internal/cmd/object-storage/credentials-group/delete/delete_test.go b/internal/cmd/object-storage/credentials-group/delete/delete_test.go index 9be471b32..e2c2e33d1 100644 --- a/internal/cmd/object-storage/credentials-group/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials-group/delete/delete_test.go @@ -10,13 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() @@ -59,7 +59,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiDeleteCredentialsGroupRequest)) objectstorage.ApiDeleteCredentialsGroupRequest { - request := testClient.DeleteCredentialsGroup(testCtx, testProjectId, testRegion, testCredentialsGroupId) + request := testClient.DefaultAPI.DeleteCredentialsGroup(testCtx, testProjectId, testRegion, testCredentialsGroupId) for _, mod := range mods { mod(&request) } @@ -162,7 +162,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index f422ad6d3..153a9b25f 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -15,8 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -105,7 +104,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiListCredentialsGroupsRequest { - req := apiClient.ListCredentialsGroups(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.ListCredentialsGroups(ctx, model.ProjectId, model.Region) return req } @@ -121,9 +120,9 @@ func outputResult(p *print.Printer, outputFormat string, credentialsGroups []obj for i := range credentialsGroups { c := credentialsGroups[i] table.AddRow( - utils.PtrString(c.CredentialsGroupId), - utils.PtrString(c.DisplayName), - utils.PtrString(c.Urn), + c.CredentialsGroupId, + c.DisplayName, + c.Urn, ) } err := table.Display(p) diff --git a/internal/cmd/object-storage/credentials-group/list/list_test.go b/internal/cmd/object-storage/credentials-group/list/list_test.go index cbbbb1a89..520a0e011 100644 --- a/internal/cmd/object-storage/credentials-group/list/list_test.go +++ b/internal/cmd/object-storage/credentials-group/list/list_test.go @@ -14,13 +14,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const testRegion = "eu01" @@ -53,7 +53,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiListCredentialsGroupsRequest)) objectstorage.ApiListCredentialsGroupsRequest { - request := testClient.ListCredentialsGroups(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.ListCredentialsGroups(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -141,7 +141,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index c970dcb21..4f4861b8f 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -16,8 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -60,7 +59,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) + credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient.DefaultAPI, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId @@ -119,7 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiCreateAccessKeyRequest { - req := apiClient.CreateAccessKey(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.CreateAccessKey(ctx, model.ProjectId, model.Region) req = req.CredentialsGroup(model.CredentialsGroupId) req = req.CreateAccessKeyPayload(objectstorage.CreateAccessKeyPayload{ Expires: model.ExpireDate, @@ -134,13 +133,13 @@ func outputResult(p *print.Printer, outputFormat, credentialsGroupLabel string, return p.OutputResult(outputFormat, resp, func() error { expireDate := "Never" - if resp.Expires != nil && resp.Expires.IsSet() && *resp.Expires.Get() != "" { + if resp.Expires.IsSet() && *resp.Expires.Get() != "" { expireDate = *resp.Expires.Get() } - p.Outputf("Created credentials in group %q. Credentials ID: %s\n\n", credentialsGroupLabel, utils.PtrString(resp.KeyId)) - p.Outputf("Access Key ID: %s\n", utils.PtrString(resp.AccessKey)) - p.Outputf("Secret Access Key: %s\n", utils.PtrString(resp.SecretAccessKey)) + p.Outputf("Created credentials in group %q. Credentials ID: %s\n\n", credentialsGroupLabel, resp.KeyId) + p.Outputf("Access Key ID: %s\n", resp.AccessKey) + p.Outputf("Secret Access Key: %s\n", resp.SecretAccessKey) p.Outputf("Expire Date: %s\n", expireDate) return nil diff --git a/internal/cmd/object-storage/credentials/create/create_test.go b/internal/cmd/object-storage/credentials/create/create_test.go index 46f0e2e18..c960ddd49 100644 --- a/internal/cmd/object-storage/credentials/create/create_test.go +++ b/internal/cmd/object-storage/credentials/create/create_test.go @@ -15,13 +15,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() @@ -79,7 +79,7 @@ func fixturePayload(mods ...func(payload *objectstorage.CreateAccessKeyPayload)) } func fixtureRequest(mods ...func(request *objectstorage.ApiCreateAccessKeyRequest)) objectstorage.ApiCreateAccessKeyRequest { - request := testClient.CreateAccessKey(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.CreateAccessKey(testCtx, testProjectId, testRegion) request = request.CreateAccessKeyPayload(fixturePayload()) request = request.CredentialsGroup(testCredentialsGroupId) for _, mod := range mods { @@ -207,7 +207,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index 84a3b363b..99307dca1 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -15,7 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -53,13 +53,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) + credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient.DefaultAPI, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId } - credentialsLabel, err := objectStorageUtils.GetCredentialsName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.CredentialsId, model.Region) + credentialsLabel, err := objectStorageUtils.GetCredentialsName(ctx, apiClient.DefaultAPI, model.ProjectId, model.CredentialsGroupId, model.CredentialsId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get credentials name: %v", err) credentialsLabel = model.CredentialsId @@ -112,7 +112,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiDeleteAccessKeyRequest { - req := apiClient.DeleteAccessKey(ctx, model.ProjectId, model.Region, model.CredentialsId) + req := apiClient.DefaultAPI.DeleteAccessKey(ctx, model.ProjectId, model.Region, model.CredentialsId) req = req.CredentialsGroup(model.CredentialsGroupId) return req } diff --git a/internal/cmd/object-storage/credentials/delete/delete_test.go b/internal/cmd/object-storage/credentials/delete/delete_test.go index 699d36bcf..12be8797a 100644 --- a/internal/cmd/object-storage/credentials/delete/delete_test.go +++ b/internal/cmd/object-storage/credentials/delete/delete_test.go @@ -10,13 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() @@ -64,7 +64,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiDeleteAccessKeyRequest)) objectstorage.ApiDeleteAccessKeyRequest { - request := testClient.DeleteAccessKey(testCtx, testProjectId, testRegion, testCredentialsId) + request := testClient.DefaultAPI.DeleteAccessKey(testCtx, testProjectId, testRegion, testCredentialsId) request = request.CredentialsGroup(testCredentialsGroupId) for _, mod := range mods { mod(&request) @@ -183,7 +183,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index f1ef8c155..73aa91dca 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -16,8 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( @@ -69,7 +68,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } credentials := resp.GetAccessKeys() - credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient, model.ProjectId, model.CredentialsGroupId, model.Region) + credentialsGroupLabel, err := objectStorageUtils.GetCredentialsGroupName(ctx, apiClient.DefaultAPI, model.ProjectId, model.CredentialsGroupId, model.Region) if err != nil { params.Printer.Debug(print.ErrorLevel, "get credentials group name: %v", err) credentialsGroupLabel = model.CredentialsGroupId @@ -119,7 +118,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiListAccessKeysRequest { - req := apiClient.ListAccessKeys(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.ListAccessKeys(ctx, model.ProjectId, model.Region) req = req.CredentialsGroup(model.CredentialsGroupId) return req } @@ -136,8 +135,11 @@ func outputResult(p *print.Printer, outputFormat, credentialsGroupLabel string, for i := range credentials { c := credentials[i] - expiresAt := utils.PtrStringDefault(c.Expires, "Never") - table.AddRow(utils.PtrString(c.KeyId), utils.PtrString(c.DisplayName), expiresAt) + expiresAt := "Never" + if c.Expires != "" { + expiresAt = c.Expires + } + table.AddRow(c.KeyId, c.DisplayName, expiresAt) } err := table.Display(p) if err != nil { diff --git a/internal/cmd/object-storage/credentials/list/list_test.go b/internal/cmd/object-storage/credentials/list/list_test.go index ba6967c84..b950ac36a 100644 --- a/internal/cmd/object-storage/credentials/list/list_test.go +++ b/internal/cmd/object-storage/credentials/list/list_test.go @@ -14,13 +14,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() var testCredentialsGroupId = uuid.NewString() var testRegion = "eu01" @@ -55,7 +55,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiListAccessKeysRequest)) objectstorage.ApiListAccessKeysRequest { - request := testClient.ListAccessKeys(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.ListAccessKeys(testCtx, testProjectId, testRegion) request = request.CredentialsGroup(testCredentialsGroupId) for _, mod := range mods { mod(&request) @@ -165,7 +165,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/disable/disable.go b/internal/cmd/object-storage/disable/disable.go index e7b0f501b..22eba8a93 100644 --- a/internal/cmd/object-storage/disable/disable.go +++ b/internal/cmd/object-storage/disable/disable.go @@ -15,7 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type inputModel struct { @@ -91,6 +91,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiDisableServiceRequest { - req := apiClient.DisableService(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.DisableService(ctx, model.ProjectId, model.Region) return req } diff --git a/internal/cmd/object-storage/disable/disable_test.go b/internal/cmd/object-storage/disable/disable_test.go index 8820b8cc3..9f6ce3322 100644 --- a/internal/cmd/object-storage/disable/disable_test.go +++ b/internal/cmd/object-storage/disable/disable_test.go @@ -10,13 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const testRegion = "eu01" @@ -47,7 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiDisableServiceRequest)) objectstorage.ApiDisableServiceRequest { - request := testClient.DisableService(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.DisableService(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -121,7 +121,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/cmd/object-storage/enable/enable.go b/internal/cmd/object-storage/enable/enable.go index bd5304493..0018d56d9 100644 --- a/internal/cmd/object-storage/enable/enable.go +++ b/internal/cmd/object-storage/enable/enable.go @@ -15,7 +15,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type inputModel struct { @@ -91,6 +91,6 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiEnableServiceRequest { - req := apiClient.EnableService(ctx, model.ProjectId, model.Region) + req := apiClient.DefaultAPI.EnableService(ctx, model.ProjectId, model.Region) return req } diff --git a/internal/cmd/object-storage/enable/enable_test.go b/internal/cmd/object-storage/enable/enable_test.go index db8c35d3f..936b2d0f9 100644 --- a/internal/cmd/object-storage/enable/enable_test.go +++ b/internal/cmd/object-storage/enable/enable_test.go @@ -10,13 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") -var testClient = &objectstorage.APIClient{} +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} var testProjectId = uuid.NewString() const testRegion = "eu01" @@ -47,7 +47,7 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { } func fixtureRequest(mods ...func(request *objectstorage.ApiEnableServiceRequest)) objectstorage.ApiEnableServiceRequest { - request := testClient.EnableService(testCtx, testProjectId, testRegion) + request := testClient.DefaultAPI.EnableService(testCtx, testProjectId, testRegion) for _, mod := range mods { mod(&request) } @@ -121,7 +121,7 @@ func TestBuildRequest(t *testing.T) { request := buildRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, - cmp.AllowUnexported(tt.expectedRequest), + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), cmpopts.EquateComparable(testCtx), ) if diff != "" { diff --git a/internal/pkg/services/object-storage/client/client.go b/internal/pkg/services/object-storage/client/client.go index 82b2447f8..81e5dbe95 100644 --- a/internal/pkg/services/object-storage/client/client.go +++ b/internal/pkg/services/object-storage/client/client.go @@ -6,9 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/spf13/viper" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) func ConfigureClient(p *print.Printer, cliVersion string) (*objectstorage.APIClient, error) { - return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ObjectStorageCustomEndpointKey), true, genericclient.CreateApiClient[*objectstorage.APIClient](objectstorage.NewAPIClient)) + return genericclient.ConfigureClientGeneric(p, cliVersion, viper.GetString(config.ObjectStorageCustomEndpointKey), false, genericclient.CreateApiClient[*objectstorage.APIClient](objectstorage.NewAPIClient)) } diff --git a/internal/pkg/services/object-storage/utils/utils.go b/internal/pkg/services/object-storage/utils/utils.go index bd23d0854..a122cb1ef 100644 --- a/internal/pkg/services/object-storage/utils/utils.go +++ b/internal/pkg/services/object-storage/utils/utils.go @@ -6,17 +6,11 @@ import ( "net/http" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) -type ObjectStorageClient interface { - GetServiceStatusExecute(ctx context.Context, projectId, region string) (*objectstorage.ProjectStatus, error) - ListCredentialsGroupsExecute(ctx context.Context, projectId, region string) (*objectstorage.ListCredentialsGroupsResponse, error) - ListAccessKeys(ctx context.Context, projectId, region string) objectstorage.ApiListAccessKeysRequest -} - -func ProjectEnabled(ctx context.Context, apiClient ObjectStorageClient, projectId, region string) (bool, error) { - _, err := apiClient.GetServiceStatusExecute(ctx, projectId, region) +func ProjectEnabled(ctx context.Context, apiClient objectstorage.DefaultAPI, projectId, region string) (bool, error) { + _, err := apiClient.GetServiceStatus(ctx, projectId, region).Execute() if err != nil { oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped if !ok { @@ -30,8 +24,8 @@ func ProjectEnabled(ctx context.Context, apiClient ObjectStorageClient, projectI return true, nil } -func GetCredentialsGroupName(ctx context.Context, apiClient ObjectStorageClient, projectId, credentialsGroupId, region string) (string, error) { - resp, err := apiClient.ListCredentialsGroupsExecute(ctx, projectId, region) +func GetCredentialsGroupName(ctx context.Context, apiClient objectstorage.DefaultAPI, projectId, credentialsGroupId, region string) (string, error) { + resp, err := apiClient.ListCredentialsGroups(ctx, projectId, region).Execute() if err != nil { return "", fmt.Errorf("list Object Storage credentials groups: %w", err) } @@ -41,16 +35,16 @@ func GetCredentialsGroupName(ctx context.Context, apiClient ObjectStorageClient, return "", fmt.Errorf("nil Object Storage credentials group list: %w", err) } - for _, group := range *credentialsGroups { - if group.CredentialsGroupId != nil && *group.CredentialsGroupId == credentialsGroupId && group.DisplayName != nil && *group.DisplayName != "" { - return *group.DisplayName, nil + for _, group := range credentialsGroups { + if group.CredentialsGroupId == credentialsGroupId && group.DisplayName != "" { + return group.DisplayName, nil } } return "", fmt.Errorf("could not find Object Storage credentials group name") } -func GetCredentialsName(ctx context.Context, apiClient ObjectStorageClient, projectId, credentialsGroupId, keyId, region string) (string, error) { +func GetCredentialsName(ctx context.Context, apiClient objectstorage.DefaultAPI, projectId, credentialsGroupId, keyId, region string) (string, error) { req := apiClient.ListAccessKeys(ctx, projectId, region) req = req.CredentialsGroup(credentialsGroupId) resp, err := req.Execute() @@ -64,9 +58,9 @@ func GetCredentialsName(ctx context.Context, apiClient ObjectStorageClient, proj return "", fmt.Errorf("nil Object Storage credentials list") } - for _, credential := range *credentials { - if credential.KeyId != nil && *credential.KeyId == keyId && credential.DisplayName != nil && *credential.DisplayName != "" { - return *credential.DisplayName, nil + for _, credential := range credentials { + if credential.KeyId == keyId && credential.DisplayName != "" { + return credential.DisplayName, nil } } diff --git a/internal/pkg/services/object-storage/utils/utils_test.go b/internal/pkg/services/object-storage/utils/utils_test.go index 65b176172..16c9c6c1b 100644 --- a/internal/pkg/services/object-storage/utils/utils_test.go +++ b/internal/pkg/services/object-storage/utils/utils_test.go @@ -2,59 +2,68 @@ package utils import ( "context" - "encoding/json" "fmt" "net/http" - "net/http/httptest" "testing" "github.com/google/uuid" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/objectstorage" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) var ( testProjectId = uuid.NewString() testCredentialsGroupId = uuid.NewString() - testCredentialsId = "credentialsID" //nolint:gosec // linter false positive - testRegion = "eu01" ) const ( testCredentialsGroupName = "testGroup" testCredentialsName = "testCredential" + testCredentialsId = "credentialsID" //nolint:gosec // linter false positive + testRegion = "eu01" ) -type objectStorageClientMocked struct { - serviceDisabled bool - getServiceStatusFails bool +type mockSettings struct { + serviceDisabled bool + getServiceStatusFails bool + listCredentialsGroupsFails bool listCredentialsGroupsResp *objectstorage.ListCredentialsGroupsResponse - listAccessKeysReq objectstorage.ApiListAccessKeysRequest -} -func (m *objectStorageClientMocked) GetServiceStatusExecute(_ context.Context, _, _ string) (*objectstorage.ProjectStatus, error) { - if m.getServiceStatusFails { - return nil, fmt.Errorf("could not get service status") - } - if m.serviceDisabled { - return nil, &oapierror.GenericOpenAPIError{StatusCode: 404} - } - return &objectstorage.ProjectStatus{}, nil + listAccessKeysFails bool + listAccessKeysResp *objectstorage.ListAccessKeysResponse } -func (m *objectStorageClientMocked) ListCredentialsGroupsExecute(_ context.Context, _, _ string) (*objectstorage.ListCredentialsGroupsResponse, error) { - if m.listCredentialsGroupsFails { - return nil, fmt.Errorf("could not list credentials groups") - } - return m.listCredentialsGroupsResp, nil -} +func newAPIMock(settings *mockSettings) objectstorage.DefaultAPI { + return &objectstorage.DefaultAPIServiceMock{ + GetServiceStatusExecuteMock: utils.Ptr(func(_ objectstorage.ApiGetServiceStatusRequest) (*objectstorage.ProjectStatus, error) { + if settings.getServiceStatusFails { + return nil, fmt.Errorf("could not get service status") + } -func (m *objectStorageClientMocked) ListAccessKeys(_ context.Context, _, _ string) objectstorage.ApiListAccessKeysRequest { - return m.listAccessKeysReq + if settings.serviceDisabled { + return nil, &oapierror.GenericOpenAPIError{StatusCode: http.StatusNotFound} + } + + return &objectstorage.ProjectStatus{}, nil + }), + ListCredentialsGroupsExecuteMock: utils.Ptr(func(_ objectstorage.ApiListCredentialsGroupsRequest) (*objectstorage.ListCredentialsGroupsResponse, error) { + if settings.listCredentialsGroupsFails { + return nil, fmt.Errorf("could not list credentials groups") + } + + return settings.listCredentialsGroupsResp, nil + }), + ListAccessKeysExecuteMock: utils.Ptr(func(_ objectstorage.ApiListAccessKeysRequest) (*objectstorage.ListAccessKeysResponse, error) { + if settings.listAccessKeysFails { + return nil, &oapierror.GenericOpenAPIError{StatusCode: http.StatusBadGateway} + } + + return settings.listAccessKeysResp, nil + }), + } } func TestProjectEnabled(t *testing.T) { @@ -85,10 +94,10 @@ func TestProjectEnabled(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &objectStorageClientMocked{ + client := newAPIMock(&mockSettings{ serviceDisabled: tt.serviceDisabled, getServiceStatusFails: tt.getProjectFails, - } + }) output, err := ProjectEnabled(context.Background(), client, testProjectId, testRegion) @@ -120,10 +129,10 @@ func TestGetCredentialsGroupName(t *testing.T) { { description: "base", listCredentialsGroupsResp: &objectstorage.ListCredentialsGroupsResponse{ - CredentialsGroups: &[]objectstorage.CredentialsGroup{ + CredentialsGroups: []objectstorage.CredentialsGroup{ { - CredentialsGroupId: utils.Ptr(testCredentialsGroupId), - DisplayName: utils.Ptr(testCredentialsGroupName), + CredentialsGroupId: testCredentialsGroupId, + DisplayName: testCredentialsGroupName, }, }, }, @@ -138,14 +147,14 @@ func TestGetCredentialsGroupName(t *testing.T) { { description: "multiple credentials groups", listCredentialsGroupsResp: &objectstorage.ListCredentialsGroupsResponse{ - CredentialsGroups: &[]objectstorage.CredentialsGroup{ + CredentialsGroups: []objectstorage.CredentialsGroup{ { - CredentialsGroupId: utils.Ptr("test-UUID"), - DisplayName: utils.Ptr("test-name"), + CredentialsGroupId: "test-UUID", + DisplayName: "test-name", }, { - CredentialsGroupId: utils.Ptr(testCredentialsGroupId), - DisplayName: utils.Ptr(testCredentialsGroupName), + CredentialsGroupId: testCredentialsGroupId, + DisplayName: testCredentialsGroupName, }, }, }, @@ -160,23 +169,11 @@ func TestGetCredentialsGroupName(t *testing.T) { isValid: false, }, { - description: "nil credentials group id", - listCredentialsGroupsResp: &objectstorage.ListCredentialsGroupsResponse{ - CredentialsGroups: &[]objectstorage.CredentialsGroup{ - { - CredentialsGroupId: nil, - }, - }, - }, - isValid: false, - }, - { - description: "nil credentials group name", + description: "empty credentials group id", listCredentialsGroupsResp: &objectstorage.ListCredentialsGroupsResponse{ - CredentialsGroups: &[]objectstorage.CredentialsGroup{ + CredentialsGroups: []objectstorage.CredentialsGroup{ { - CredentialsGroupId: utils.Ptr(testCredentialsGroupId), - DisplayName: nil, + CredentialsGroupId: "", }, }, }, @@ -185,10 +182,10 @@ func TestGetCredentialsGroupName(t *testing.T) { { description: "empty credentials group name", listCredentialsGroupsResp: &objectstorage.ListCredentialsGroupsResponse{ - CredentialsGroups: &[]objectstorage.CredentialsGroup{ + CredentialsGroups: []objectstorage.CredentialsGroup{ { - CredentialsGroupId: utils.Ptr(testCredentialsGroupId), - DisplayName: utils.Ptr(""), + CredentialsGroupId: testCredentialsGroupId, + DisplayName: "", }, }, }, @@ -198,10 +195,10 @@ func TestGetCredentialsGroupName(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - client := &objectStorageClientMocked{ + client := newAPIMock(&mockSettings{ listCredentialsGroupsFails: tt.listCredentialsGroupsFails, listCredentialsGroupsResp: tt.listCredentialsGroupsResp, - } + }) output, err := GetCredentialsGroupName(context.Background(), client, testProjectId, testCredentialsGroupId, testRegion) @@ -232,10 +229,10 @@ func TestGetCredentialsName(t *testing.T) { { description: "base", listAccessKeysResp: &objectstorage.ListAccessKeysResponse{ - AccessKeys: &[]objectstorage.AccessKey{ + AccessKeys: []objectstorage.AccessKey{ { - KeyId: utils.Ptr(testCredentialsId), - DisplayName: utils.Ptr(testCredentialsName), + KeyId: testCredentialsId, + DisplayName: testCredentialsName, }, }, }, @@ -250,14 +247,14 @@ func TestGetCredentialsName(t *testing.T) { { description: "multiple credentials", listAccessKeysResp: &objectstorage.ListAccessKeysResponse{ - AccessKeys: &[]objectstorage.AccessKey{ + AccessKeys: []objectstorage.AccessKey{ { - KeyId: utils.Ptr("test-UUID"), - DisplayName: utils.Ptr("test-name"), + KeyId: "test-UUID", + DisplayName: "test-name", }, { - KeyId: utils.Ptr(testCredentialsId), - DisplayName: utils.Ptr(testCredentialsName), + KeyId: testCredentialsId, + DisplayName: testCredentialsName, }, }, }, @@ -272,23 +269,11 @@ func TestGetCredentialsName(t *testing.T) { isValid: false, }, { - description: "nil credentials id", + description: "empty credentials id", listAccessKeysResp: &objectstorage.ListAccessKeysResponse{ - AccessKeys: &[]objectstorage.AccessKey{ + AccessKeys: []objectstorage.AccessKey{ { - KeyId: nil, - }, - }, - }, - isValid: false, - }, - { - description: "nil credentials name", - listAccessKeysResp: &objectstorage.ListAccessKeysResponse{ - AccessKeys: &[]objectstorage.AccessKey{ - { - KeyId: utils.Ptr(testCredentialsId), - DisplayName: nil, + KeyId: "", }, }, }, @@ -297,10 +282,10 @@ func TestGetCredentialsName(t *testing.T) { { description: "empty credentials name", listAccessKeysResp: &objectstorage.ListAccessKeysResponse{ - AccessKeys: &[]objectstorage.AccessKey{ + AccessKeys: []objectstorage.AccessKey{ { - KeyId: utils.Ptr(testCredentialsId), - DisplayName: utils.Ptr(""), + KeyId: testCredentialsId, + DisplayName: "", }, }, }, @@ -310,37 +295,10 @@ func TestGetCredentialsName(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - mockedRespBytes, err := json.Marshal(tt.listAccessKeysResp) - if err != nil { - t.Fatalf("Failed to marshal mocked response: %v", err) - } - - handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.Header().Set("Content-Type", "application/json") - if tt.getCredentialsNameFails { - w.WriteHeader(http.StatusBadGateway) - w.Header().Set("Content-Type", "application/json") - _, err := w.Write([]byte("{\"message\": \"Something bad happened\"")) - if err != nil { - t.Errorf("Failed to write bad response: %v", err) - } - return - } - - _, err := w.Write(mockedRespBytes) - if err != nil { - t.Errorf("Failed to write response: %v", err) - } + client := newAPIMock(&mockSettings{ + listAccessKeysFails: tt.getCredentialsNameFails, + listAccessKeysResp: tt.listAccessKeysResp, }) - mockedServer := httptest.NewServer(handler) - defer mockedServer.Close() - client, err := objectstorage.NewAPIClient( - config.WithEndpoint(mockedServer.URL), - config.WithoutAuthentication(), - ) - if err != nil { - t.Fatalf("Failed to initialize client: %v", err) - } output, err := GetCredentialsName(context.Background(), client, testProjectId, testCredentialsGroupId, testCredentialsId, testRegion) From 13d8a3b39b7fc9de8fdbde3eca3ff19dfac36a01 Mon Sep 17 00:00:00 2001 From: Mauritz Uphoff <39736813+h3adex@users.noreply.github.com> Date: Wed, 25 Mar 2026 17:19:18 +0100 Subject: [PATCH 412/422] feat(iaas): onboard routes command (#1340) relates to STACKITCLI-281 --- docs/stackit_network-area_routing-table.md | 1 + ...tackit_network-area_routing-table_route.md | 38 + ...network-area_routing-table_route_create.md | 54 ++ ...network-area_routing-table_route_delete.md | 43 ++ ...twork-area_routing-table_route_describe.md | 43 ++ ...t_network-area_routing-table_route_list.md | 51 ++ ...network-area_routing-table_route_update.md | 44 ++ .../routingtable/route/create/create.go | 268 +++++++ .../routingtable/route/create/create_test.go | 701 ++++++++++++++++++ .../routingtable/route/delete/delete.go | 120 +++ .../routingtable/route/delete/delete_test.go | 132 ++++ .../routingtable/route/describe/describe.go | 157 ++++ .../route/describe/describe_test.go | 233 ++++++ .../routingtable/route/list/list.go | 172 +++++ .../routingtable/route/list/list_test.go | 246 ++++++ .../network-area/routingtable/route/route.go | 33 + .../routingtable/route/update/update.go | 154 ++++ .../routingtable/route/update/update_test.go | 301 ++++++++ .../network-area/routingtable/routingtable.go | 2 + .../network-area/routing-table/utils/utils.go | 65 ++ .../routing-table/utils/utils_test.go | 268 +++++++ 21 files changed, 3126 insertions(+) create mode 100644 docs/stackit_network-area_routing-table_route.md create mode 100644 docs/stackit_network-area_routing-table_route_create.md create mode 100644 docs/stackit_network-area_routing-table_route_delete.md create mode 100644 docs/stackit_network-area_routing-table_route_describe.md create mode 100644 docs/stackit_network-area_routing-table_route_list.md create mode 100644 docs/stackit_network-area_routing-table_route_update.md create mode 100644 internal/cmd/network-area/routingtable/route/create/create.go create mode 100644 internal/cmd/network-area/routingtable/route/create/create_test.go create mode 100644 internal/cmd/network-area/routingtable/route/delete/delete.go create mode 100644 internal/cmd/network-area/routingtable/route/delete/delete_test.go create mode 100644 internal/cmd/network-area/routingtable/route/describe/describe.go create mode 100644 internal/cmd/network-area/routingtable/route/describe/describe_test.go create mode 100644 internal/cmd/network-area/routingtable/route/list/list.go create mode 100644 internal/cmd/network-area/routingtable/route/list/list_test.go create mode 100644 internal/cmd/network-area/routingtable/route/route.go create mode 100644 internal/cmd/network-area/routingtable/route/update/update.go create mode 100644 internal/cmd/network-area/routingtable/route/update/update_test.go create mode 100644 internal/pkg/services/network-area/routing-table/utils/utils.go create mode 100644 internal/pkg/services/network-area/routing-table/utils/utils_test.go diff --git a/docs/stackit_network-area_routing-table.md b/docs/stackit_network-area_routing-table.md index 335202b22..d1aefa50a 100644 --- a/docs/stackit_network-area_routing-table.md +++ b/docs/stackit_network-area_routing-table.md @@ -37,5 +37,6 @@ stackit network-area routing-table [flags] * [stackit network-area routing-table delete](./stackit_network-area_routing-table_delete.md) - Deletes a routing-table * [stackit network-area routing-table describe](./stackit_network-area_routing-table_describe.md) - Describes a routing-table * [stackit network-area routing-table list](./stackit_network-area_routing-table_list.md) - Lists all routing-tables +* [stackit network-area routing-table route](./stackit_network-area_routing-table_route.md) - Manages routes of a routing-table * [stackit network-area routing-table update](./stackit_network-area_routing-table_update.md) - Updates a routing-table diff --git a/docs/stackit_network-area_routing-table_route.md b/docs/stackit_network-area_routing-table_route.md new file mode 100644 index 000000000..f23144acf --- /dev/null +++ b/docs/stackit_network-area_routing-table_route.md @@ -0,0 +1,38 @@ +## stackit network-area routing-table route + +Manages routes of a routing-table + +### Synopsis + +Manages routes of a routing-table + +``` +stackit network-area routing-table route [flags] +``` + +### Options + +``` + -h, --help Help for "stackit network-area routing-table route" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area routing-table](./stackit_network-area_routing-table.md) - Manage routing-tables and its according routes +* [stackit network-area routing-table route create](./stackit_network-area_routing-table_route_create.md) - Creates a route in a routing-table +* [stackit network-area routing-table route delete](./stackit_network-area_routing-table_route_delete.md) - Deletes a route within a routing-table +* [stackit network-area routing-table route describe](./stackit_network-area_routing-table_route_describe.md) - Describes a route within a routing-table +* [stackit network-area routing-table route list](./stackit_network-area_routing-table_route_list.md) - Lists all routes within a routing-table +* [stackit network-area routing-table route update](./stackit_network-area_routing-table_route_update.md) - Updates a route in a routing-table + diff --git a/docs/stackit_network-area_routing-table_route_create.md b/docs/stackit_network-area_routing-table_route_create.md new file mode 100644 index 000000000..eb3c3ad52 --- /dev/null +++ b/docs/stackit_network-area_routing-table_route_create.md @@ -0,0 +1,54 @@ +## stackit network-area routing-table route create + +Creates a route in a routing-table + +### Synopsis + +Creates a route in a routing-table. + +``` +stackit network-area routing-table route create [flags] +``` + +### Examples + +``` + Create a route with CIDRv4 destination and IPv4 nexthop + $ stackit network-area routing-table route create --routing-table-id xxx --organization-id yyy --network-area-id zzz --destination-type cidrv4 --destination-value --nexthop-type ipv4 --nexthop-value + + Create a route with CIDRv6 destination and IPv6 nexthop + $ stackit network-area routing-table route create --routing-table-id xxx --organization-id yyy --network-area-id zzz --destination-type cidrv6 --destination-value --nexthop-type ipv6 --nexthop-value + + Create a route with CIDRv6 destination and Nexthop Internet + $ stackit network-area routing-table route create --routing-table-id xxx --organization-id yyy --network-area-id zzz --destination-type cidrv6 --destination-value --nexthop-type internet +``` + +### Options + +``` + --destination-type string Destination type + --destination-value string Destination value + -h, --help Help for "stackit network-area routing-table route create" + --labels stringToString Key=value labels (default []) + --network-area-id string Network-Area ID + --nexthop-type string Next hop type + --nexthop-value string NextHop value + --organization-id string Organization ID + --routing-table-id string Routing-Table ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area routing-table route](./stackit_network-area_routing-table_route.md) - Manages routes of a routing-table + diff --git a/docs/stackit_network-area_routing-table_route_delete.md b/docs/stackit_network-area_routing-table_route_delete.md new file mode 100644 index 000000000..5f15e61d0 --- /dev/null +++ b/docs/stackit_network-area_routing-table_route_delete.md @@ -0,0 +1,43 @@ +## stackit network-area routing-table route delete + +Deletes a route within a routing-table + +### Synopsis + +Deletes a route within a routing-table + +``` +stackit network-area routing-table route delete routing-table-id [flags] +``` + +### Examples + +``` + Deletes a route within a routing-table + $ stackit network-area routing-table route delete xxx --routing-table-id xxx --organization-id yyy --network-area-id zzz +``` + +### Options + +``` + -h, --help Help for "stackit network-area routing-table route delete" + --network-area-id string Network-Area ID + --organization-id string Organization ID + --routing-table-id string Routing-Table ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area routing-table route](./stackit_network-area_routing-table_route.md) - Manages routes of a routing-table + diff --git a/docs/stackit_network-area_routing-table_route_describe.md b/docs/stackit_network-area_routing-table_route_describe.md new file mode 100644 index 000000000..9b50da817 --- /dev/null +++ b/docs/stackit_network-area_routing-table_route_describe.md @@ -0,0 +1,43 @@ +## stackit network-area routing-table route describe + +Describes a route within a routing-table + +### Synopsis + +Describes a route within a routing-table + +``` +stackit network-area routing-table route describe ROUTE_ID [flags] +``` + +### Examples + +``` + Describe a route within a routing-table + $ stackit network-area routing-table route describe xxx --routing-table-id xxx --organization-id yyy --network-area-id zzz +``` + +### Options + +``` + -h, --help Help for "stackit network-area routing-table route describe" + --network-area-id string Network-Area ID + --organization-id string Organization ID + --routing-table-id string Routing-Table ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area routing-table route](./stackit_network-area_routing-table_route.md) - Manages routes of a routing-table + diff --git a/docs/stackit_network-area_routing-table_route_list.md b/docs/stackit_network-area_routing-table_route_list.md new file mode 100644 index 000000000..901b8d593 --- /dev/null +++ b/docs/stackit_network-area_routing-table_route_list.md @@ -0,0 +1,51 @@ +## stackit network-area routing-table route list + +Lists all routes within a routing-table + +### Synopsis + +Lists all routes within a routing-table + +``` +stackit network-area routing-table route list [flags] +``` + +### Examples + +``` + List all routes within a routing-table + $ stackit network-area routing-table route list --routing-table-id xxx --organization-id yyy --network-area-id zzz + + List all routes within a routing-table with labels + $ stackit network-area routing-table list --routing-table-id xxx --organization-id yyy --network-area-id zzz --label-selector env=dev,env=rc + + List all routes within a routing-tables with labels and limit to 10 + $ stackit network-area routing-table list --routing-table-id xxx --organization-id yyy --network-area-id zzz --label-selector env=dev,env=rc --limit 10 +``` + +### Options + +``` + -h, --help Help for "stackit network-area routing-table route list" + --label-selector string Filter by label + --limit int Maximum number of entries to list + --network-area-id string Network-Area ID + --organization-id string Organization ID + --routing-table-id string Routing-Table ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area routing-table route](./stackit_network-area_routing-table_route.md) - Manages routes of a routing-table + diff --git a/docs/stackit_network-area_routing-table_route_update.md b/docs/stackit_network-area_routing-table_route_update.md new file mode 100644 index 000000000..22bdb11ad --- /dev/null +++ b/docs/stackit_network-area_routing-table_route_update.md @@ -0,0 +1,44 @@ +## stackit network-area routing-table route update + +Updates a route in a routing-table + +### Synopsis + +Updates a route in a routing-table. + +``` +stackit network-area routing-table route update ROUTE_ID [flags] +``` + +### Examples + +``` + Updates the label(s) of a route with ID "xxx" in a routing-table ID "xxx" in organization with ID "yyy" and network-area with ID "zzz" + $ stackit network-area routing-table route update xxx --labels key=value,foo=bar --routing-table-id xxx --organization-id yyy --network-area-id zzz +``` + +### Options + +``` + -h, --help Help for "stackit network-area routing-table route update" + --labels stringToString Labels are key-value string pairs which can be attached to a route. A label can be provided with the format key=value and the flag can be used multiple times to provide a list of labels (default []) + --network-area-id string Network-Area ID + --organization-id string Organization ID + --routing-table-id string Routing-Table ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit network-area routing-table route](./stackit_network-area_routing-table_route.md) - Manages routes of a routing-table + diff --git a/internal/cmd/network-area/routingtable/route/create/create.go b/internal/cmd/network-area/routingtable/route/create/create.go new file mode 100644 index 000000000..fea46c5d8 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/create/create.go @@ -0,0 +1,268 @@ +package create + +import ( + "context" + "errors" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + destinationTypeFlag = "destination-type" + destinationValueFlag = "destination-value" + labelFlag = "labels" + networkAreaIdFlag = "network-area-id" + nextHopTypeFlag = "nexthop-type" + nextHopValueFlag = "nexthop-value" + organizationIdFlag = "organization-id" + routingTableIdFlag = "routing-table-id" + + // Destination Type Constants + destTypeCIDRv4 = "cidrv4" + destTypeCIDRv6 = "cidrv6" + + // NextHop Type Constants + nextHopTypeIPv4 = "ipv4" + nextHopTypeIPv6 = "ipv6" + nextHopTypeInternet = "internet" + nextHopTypeBlackhole = "blackhole" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + DestinationType string + DestinationValue *string + Labels *map[string]string + NetworkAreaId string + NextHopType string + NextHopValue *string + OrganizationId string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a route in a routing-table", + Long: "Creates a route in a routing-table.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample("Create a route with CIDRv4 destination and IPv4 nexthop", + `$ stackit network-area routing-table route create --routing-table-id xxx --organization-id yyy --network-area-id zzz --destination-type cidrv4 --destination-value --nexthop-type ipv4 --nexthop-value `), + + examples.NewExample("Create a route with CIDRv6 destination and IPv6 nexthop", + `$ stackit network-area routing-table route create --routing-table-id xxx --organization-id yyy --network-area-id zzz --destination-type cidrv6 --destination-value --nexthop-type ipv6 --nexthop-value `), + + examples.NewExample("Create a route with CIDRv6 destination and Nexthop Internet", + `$ stackit network-area routing-table route create --routing-table-id xxx --organization-id yyy --network-area-id zzz --destination-type cidrv6 --destination-value --nexthop-type internet`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, nil) + if err != nil { + return err + } + + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + routingTableLabel, err := iaasUtils.GetRoutingTableOfAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region, model.RoutingTableId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get routing-table name: %v", err) + routingTableLabel = model.RoutingTableId + } else if routingTableLabel == "" { + routingTableLabel = model.RoutingTableId + } + + prompt := fmt.Sprintf("Are you sure you want to create a route for routing-table %q?", routingTableLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + req, err := buildRequest(ctx, model, apiClient) + if err != nil { + return err + } + + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create route request failed: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp.GetItems()) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.CIDRFlag(), destinationValueFlag, "Destination value") + cmd.Flags().String(nextHopValueFlag, "", "NextHop value") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "Routing-Table ID") + + cmd.Flags().Var( + flags.EnumFlag(true, "", destTypeCIDRv4, destTypeCIDRv6), + destinationTypeFlag, + "Destination type") + + cmd.Flags().Var( + flags.EnumFlag(true, "", nextHopTypeIPv4, nextHopTypeIPv6, nextHopTypeInternet, nextHopTypeBlackhole), + nextHopTypeFlag, + "Next hop type") + + cmd.Flags().StringToString(labelFlag, nil, "Key=value labels") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag, routingTableIdFlag, destinationTypeFlag, destinationValueFlag, nextHopTypeFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + model := &inputModel{ + GlobalFlagModel: globalFlags, + DestinationType: flags.FlagToStringValue(p, cmd, destinationTypeFlag), + DestinationValue: flags.FlagToStringPointer(p, cmd, destinationValueFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelFlag), + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + NextHopType: flags.FlagToStringValue(p, cmd, nextHopTypeFlag), + NextHopValue: flags.FlagToStringPointer(p, cmd, nextHopValueFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RoutingTableId: flags.FlagToStringValue(p, cmd, routingTableIdFlag), + } + + // Next Hop validation logic + switch strings.ToLower(model.NextHopType) { + case nextHopTypeInternet, nextHopTypeBlackhole: + if model.NextHopValue != nil && *model.NextHopValue != "" { + return nil, errors.New("--nexthop-value is not allowed when --nexthop-type is 'internet' or 'blackhole'") + } + case nextHopTypeIPv4, nextHopTypeIPv6: + if model.NextHopValue == nil || *model.NextHopValue == "" { + return nil, errors.New("--nexthop-value is required when --nexthop-type is 'ipv4' or 'ipv6'") + } + default: + return nil, fmt.Errorf("invalid nexthop-type: %q", model.NextHopType) + } + + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) (iaas.ApiAddRoutesToRoutingTableRequest, error) { + destination := buildDestination(model) + nextHop := buildNextHop(model) + + if destination != nil && nextHop != nil { + payload := iaas.AddRoutesToRoutingTablePayload{ + Items: &[]iaas.Route{ + { + Destination: destination, + Nexthop: nextHop, + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + }, + }, + } + + return apiClient.AddRoutesToRoutingTable( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + ).AddRoutesToRoutingTablePayload(payload), nil + } + + return nil, fmt.Errorf("invalid input") +} + +func buildDestination(model *inputModel) *iaas.RouteDestination { + if model.DestinationValue == nil { + return nil + } + + destinationType := strings.ToLower(model.DestinationType) + switch destinationType { + case destTypeCIDRv4: + return &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: &model.DestinationType, + Value: model.DestinationValue, + }, + } + case destTypeCIDRv6: + return &iaas.RouteDestination{ + DestinationCIDRv6: &iaas.DestinationCIDRv6{ + Type: &model.DestinationType, + Value: model.DestinationValue, + }, + } + default: + return nil + } +} + +func buildNextHop(model *inputModel) *iaas.RouteNexthop { + nextHopType := strings.ToLower(model.NextHopType) + switch nextHopType { + case nextHopTypeIPv4: + return &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: &model.NextHopType, + Value: model.NextHopValue, + }, + } + case nextHopTypeIPv6: + return &iaas.RouteNexthop{ + NexthopIPv6: &iaas.NexthopIPv6{ + Type: &model.NextHopType, + Value: model.NextHopValue, + }, + } + case nextHopTypeInternet: + return &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: &model.NextHopType, + }, + } + case nextHopTypeBlackhole: + return &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: &model.NextHopType, + }, + } + default: + return nil + } +} + +func outputResult(p *print.Printer, outputFormat string, routes []iaas.Route) error { + if len(routes) == 0 { + return fmt.Errorf("create routes response is empty") + } + + return p.OutputResult(outputFormat, routes, func() error { + for _, route := range routes { + p.Outputf("Created route with ID %q\n", utils.PtrString(route.Id)) + } + return nil + }) +} diff --git a/internal/cmd/network-area/routingtable/route/create/create_test.go b/internal/cmd/network-area/routingtable/route/create/create_test.go new file mode 100644 index 000000000..548a40d1f --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/create/create_test.go @@ -0,0 +1,701 @@ +package create + +import ( + "context" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() +var testRoutingTableId = uuid.NewString() + +const testDestinationTypeFlag = destTypeCIDRv4 +const testDestinationValueFlag = "1.1.1.0/24" +const testNextHopTypeFlag = nextHopTypeIPv4 +const testNextHopValueFlag = "1.1.1.1" +const testLabelSelectorFlag = "key1=value1,key2=value2" + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + labelFlag: testLabelSelectorFlag, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + routingTableIdFlag: testRoutingTableId, + destinationTypeFlag: testDestinationTypeFlag, + destinationValueFlag: testDestinationValueFlag, + nextHopTypeFlag: testNextHopTypeFlag, + nextHopValueFlag: testNextHopValueFlag, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + DestinationType: testDestinationTypeFlag, + DestinationValue: utils.Ptr(testDestinationValueFlag), + NextHopType: testNextHopTypeFlag, + NextHopValue: utils.Ptr(testNextHopValueFlag), + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *iaas.ApiAddRoutesToRoutingTableRequest)) iaas.ApiAddRoutesToRoutingTableRequest { + request := testClient.AddRoutesToRoutingTable(testCtx, testOrgId, testNetworkAreaId, testRegion, testRoutingTableId) + request = request.AddRoutesToRoutingTablePayload(fixturePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func fixturePayload(mods ...func(payload *iaas.AddRoutesToRoutingTablePayload)) iaas.AddRoutesToRoutingTablePayload { + payload := iaas.AddRoutesToRoutingTablePayload{ + Items: &[]iaas.Route{ + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(testDestinationTypeFlag), + Value: utils.Ptr(testDestinationValueFlag), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(testNextHopTypeFlag), + Value: utils.Ptr(testNextHopValueFlag), + }, + }, + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + }, + }, + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "valid input", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "routing-table ID missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, routingTableIdFlag) + }), + isValid: false, + }, + { + description: "destination value missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, destinationValueFlag) + }), + isValid: false, + }, + { + description: "destination type missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, destinationTypeFlag) + }), + isValid: false, + }, + { + description: "next hop type missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nextHopTypeFlag) + }), + isValid: false, + }, + { + description: "next hop value missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, nextHopValueFlag) + }), + isValid: false, + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "organization ID missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "organization ID invalid - empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "" + }), + isValid: false, + }, + { + description: "organization ID invalid - format", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "network area ID missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "network area ID invalid - empty", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "" + }), + isValid: false, + }, + { + description: "network area ID invalid - format", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "invalid destination type enum", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[destinationTypeFlag] = nextHopTypeIPv4 // Deliberately invalid for dest + }), + isValid: false, + }, + { + description: "destination value not IPv4 CIDR", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[destinationValueFlag] = "0.0.0.0" + }), + isValid: false, + }, + { + description: "destination value not IPv6 CIDR", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[destinationTypeFlag] = destTypeCIDRv6 + flagValues[destinationValueFlag] = "2001:db8::" + }), + isValid: false, + }, + { + description: "destination value is IPv6 CIDR", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[destinationTypeFlag] = destTypeCIDRv6 + flagValues[destinationValueFlag] = "2001:db8::/32" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.DestinationType = destTypeCIDRv6 + model.DestinationValue = utils.Ptr("2001:db8::/32") + }), + }, + { + description: "invalid next hop type enum", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = destTypeCIDRv4 // Deliberately invalid for hop + }), + isValid: false, + }, + { + description: "next hop type is internet and next hop value is provided", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = nextHopTypeInternet + flagValues[nextHopValueFlag] = "1.1.1.1" // should not be allowed + }), + isValid: false, + }, + { + description: "next hop type is blackhole and next hop value is provided", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = nextHopTypeBlackhole + flagValues[nextHopValueFlag] = "1.1.1.1" + }), + isValid: false, + }, + { + description: "next hop type is internet and next hop value is not provided", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = nextHopTypeInternet + delete(flagValues, nextHopValueFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.NextHopType = nextHopTypeInternet + model.NextHopValue = nil + }), + isValid: true, + }, + { + description: "next hop type is blackhole and next hop value is not provided", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = nextHopTypeBlackhole + delete(flagValues, nextHopValueFlag) + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.NextHopType = nextHopTypeBlackhole + model.NextHopValue = nil + }), + isValid: true, + }, + { + description: "next hop type is IPv4 and next hop value is missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = nextHopTypeIPv4 + delete(flagValues, nextHopValueFlag) + }), + isValid: false, + }, + { + description: "next hop type is IPv6 and next hop value is missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = nextHopTypeIPv6 + delete(flagValues, nextHopValueFlag) + }), + isValid: false, + }, + { + description: "invalid next hop type provided", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[nextHopTypeFlag] = "invalid-type" + }), + isValid: false, + }, + { + description: "optional labels are provided", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[labelFlag] = "key=value" + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Labels = utils.Ptr(map[string]string{"key": "value"}) + }), + isValid: true, + }, + { + description: "argument value is empty string", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "argument value wrong", + argValues: []string{"foo-bar"}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildNextHop(t *testing.T) { + tests := []struct { + description string + model *inputModel + expected *iaas.RouteNexthop + }{ + { + description: "IPv4 next hop", + model: fixtureInputModel(func(m *inputModel) { + m.NextHopType = nextHopTypeIPv4 + m.NextHopValue = utils.Ptr("1.1.1.1") + }), + expected: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(nextHopTypeIPv4), + Value: utils.Ptr("1.1.1.1"), + }, + }, + }, + { + description: "IPv6 next hop", + model: fixtureInputModel(func(m *inputModel) { + m.NextHopType = nextHopTypeIPv6 + m.NextHopValue = utils.Ptr("::1") + }), + expected: &iaas.RouteNexthop{ + NexthopIPv6: &iaas.NexthopIPv6{ + Type: utils.Ptr(nextHopTypeIPv6), + Value: utils.Ptr("::1"), + }, + }, + }, + { + description: "Internet next hop", + model: fixtureInputModel(func(m *inputModel) { + m.NextHopType = nextHopTypeInternet + m.NextHopValue = nil + }), + expected: &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr(nextHopTypeInternet), + }, + }, + }, + { + description: "Blackhole next hop", + model: fixtureInputModel(func(m *inputModel) { + m.NextHopType = nextHopTypeBlackhole + m.NextHopValue = nil + }), + expected: &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr(nextHopTypeBlackhole), + }, + }, + }, + { + description: "Unsupported next hop type", + model: fixtureInputModel(func(m *inputModel) { + m.NextHopType = "unsupported" + }), + expected: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := buildNextHop(tt.model) + if diff := cmp.Diff(tt.expected, got); diff != "" { + t.Errorf("buildNextHop() mismatch (-want +got):\n%s", diff) + } + }) + } +} + +func TestBuildDestination(t *testing.T) { + tests := []struct { + description string + model *inputModel + expected *iaas.RouteDestination + }{ + { + description: "CIDRv4 destination", + model: fixtureInputModel(func(m *inputModel) { + m.DestinationType = destTypeCIDRv4 + m.DestinationValue = utils.Ptr("192.168.1.0/24") + }), + expected: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(destTypeCIDRv4), + Value: utils.Ptr("192.168.1.0/24"), + }, + }, + }, + { + description: "CIDRv6 destination", + model: fixtureInputModel(func(m *inputModel) { + m.DestinationType = destTypeCIDRv6 + m.DestinationValue = utils.Ptr("2001:db8::/32") + }), + expected: &iaas.RouteDestination{ + DestinationCIDRv6: &iaas.DestinationCIDRv6{ + Type: utils.Ptr(destTypeCIDRv6), + Value: utils.Ptr("2001:db8::/32"), + }, + }, + }, + { + description: "unsupported destination type", + model: fixtureInputModel(func(m *inputModel) { + m.DestinationType = "other" + m.DestinationValue = utils.Ptr("1.1.1.1") + }), + expected: nil, + }, + { + description: "nil destination value", + model: fixtureInputModel(func(m *inputModel) { + m.DestinationValue = nil + }), + expected: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := buildDestination(tt.model) + if diff := cmp.Diff(tt.expected, got); diff != "" { + t.Errorf("buildDestination() mismatch (-want +got):\n%s", diff) + } + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiAddRoutesToRoutingTableRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "optional labels provided", + model: fixtureInputModel(func(model *inputModel) { + model.Labels = utils.Ptr(map[string]string{"key": "value"}) + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutesToRoutingTableRequest) { + *request = (*request).AddRoutesToRoutingTablePayload(fixturePayload(func(payload *iaas.AddRoutesToRoutingTablePayload) { + (*payload.Items)[0].Labels = utils.ConvertStringMapToInterfaceMap(utils.Ptr(map[string]string{"key": "value"})) + })) + }), + }, + { + description: "destination is cidrv6 and nexthop is ipv6", + model: fixtureInputModel(func(model *inputModel) { + model.DestinationType = destTypeCIDRv6 + model.DestinationValue = utils.Ptr("2001:db8::/32") + model.NextHopType = nextHopTypeIPv6 + model.NextHopValue = utils.Ptr("2001:db8::1") + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutesToRoutingTableRequest) { + *request = (*request).AddRoutesToRoutingTablePayload(iaas.AddRoutesToRoutingTablePayload{ + Items: &[]iaas.Route{ + { + Destination: &iaas.RouteDestination{ + DestinationCIDRv6: &iaas.DestinationCIDRv6{ + Type: utils.Ptr(destTypeCIDRv6), + Value: utils.Ptr("2001:db8::/32"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv6: &iaas.NexthopIPv6{ + Type: utils.Ptr(nextHopTypeIPv6), + Value: utils.Ptr("2001:db8::1"), + }, + }, + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + }, + }, + }) + }), + }, + { + description: "nexthop type is internet (no value)", + model: fixtureInputModel(func(model *inputModel) { + model.NextHopType = nextHopTypeInternet + model.NextHopValue = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutesToRoutingTableRequest) { + payload := fixturePayload(func(payload *iaas.AddRoutesToRoutingTablePayload) { + (*payload.Items)[0].Nexthop = &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr(nextHopTypeInternet), + }, + } + }) + *request = (*request).AddRoutesToRoutingTablePayload(payload) + }), + }, + { + description: "nexthop type is blackhole (no value)", + model: fixtureInputModel(func(model *inputModel) { + model.NextHopType = nextHopTypeBlackhole + model.NextHopValue = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutesToRoutingTableRequest) { + payload := fixturePayload(func(payload *iaas.AddRoutesToRoutingTablePayload) { + (*payload.Items)[0].Nexthop = &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr(nextHopTypeBlackhole), + }, + } + }) + *request = (*request).AddRoutesToRoutingTablePayload(payload) + }), + }, + { + description: "nexthop type is ipv4 with value", + model: fixtureInputModel(func(model *inputModel) { + model.NextHopType = nextHopTypeIPv4 + model.NextHopValue = utils.Ptr("1.2.3.4") + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutesToRoutingTableRequest) { + payload := fixturePayload(func(payload *iaas.AddRoutesToRoutingTablePayload) { + (*payload.Items)[0].Nexthop = &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(nextHopTypeIPv4), + Value: utils.Ptr("1.2.3.4"), + }, + } + }) + *request = (*request).AddRoutesToRoutingTablePayload(payload) + }), + }, + { + description: "nexthop type is ipv6 with value", + model: fixtureInputModel(func(model *inputModel) { + model.NextHopType = nextHopTypeIPv6 + model.NextHopValue = utils.Ptr("2001:db8::1") + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiAddRoutesToRoutingTableRequest) { + payload := fixturePayload(func(payload *iaas.AddRoutesToRoutingTablePayload) { + (*payload.Items)[0].Nexthop = &iaas.RouteNexthop{ + NexthopIPv6: &iaas.NexthopIPv6{ + Type: utils.Ptr(nextHopTypeIPv6), + Value: utils.Ptr("2001:db8::1"), + }, + } + }) + *request = (*request).AddRoutesToRoutingTablePayload(payload) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request, err := buildRequest(testCtx, tt.model, testClient) + if err != nil { + t.Fatalf("buildRequest returned error: %v", err) + } + + if diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx)); diff != "" { + t.Errorf("buildRequest() mismatch (-got +want):\n%s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRoute := iaas.Route{ + Id: utils.Ptr("route-foo"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(destTypeCIDRv4), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(nextHopTypeIPv4), + Value: utils.Ptr("10.0.0.1"), + }, + }, + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + CreatedAt: utils.Ptr(time.Now()), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + routes []iaas.Route + wantErr bool + }{ + { + name: "nil routes should return error", + outputFormat: print.PrettyOutputFormat, + routes: nil, + wantErr: true, + }, + { + name: "empty routes list", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{}, + wantErr: true, + }, + { + name: "route list with empty struct", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{{}}, + wantErr: false, + }, + { + name: "pretty output with one route", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{dummyRoute}, + wantErr: false, + }, + { + name: "pretty output with multiple routes", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{dummyRoute, dummyRoute, dummyRoute}, + wantErr: false, + }, + { + name: "json output with one route", + outputFormat: print.JSONOutputFormat, + routes: []iaas.Route{dummyRoute}, + wantErr: false, + }, + { + name: "yaml output with one route", + outputFormat: print.YAMLOutputFormat, + routes: []iaas.Route{dummyRoute}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, tt.routes); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/routingtable/route/delete/delete.go b/internal/cmd/network-area/routingtable/route/delete/delete.go new file mode 100644 index 000000000..1d07556ec --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/delete/delete.go @@ -0,0 +1,120 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + routeIdArg = "ROUTE_ID" + routingTableIdFlag = "routing-table-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + NetworkAreaId string + OrganizationId string + RouteID string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", routingTableIdFlag), + Short: "Deletes a route within a routing-table", + Long: "Deletes a route within a routing-table", + Args: args.SingleArg(routeIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Deletes a route within a routing-table`, + `$ stackit network-area routing-table route delete xxx --routing-table-id xxx --organization-id yyy --network-area-id zzz`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + routingTableLabel, err := iaasUtils.GetRoutingTableOfAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region, model.RoutingTableId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get routing-table name: %v", err) + routingTableLabel = model.RoutingTableId + } else if routingTableLabel == "" { + routingTableLabel = model.RoutingTableId + } + + prompt := fmt.Sprintf("Are you sure you want to delete the route %q in routing-table %q for network area id %q?", model.RouteID, routingTableLabel, model.NetworkAreaId) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := apiClient.DeleteRouteFromRoutingTable( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + model.RouteID, + ) + err = req.Execute() + if err != nil { + return fmt.Errorf("delete route from routing-table: %w", err) + } + + params.Printer.Outputf("Route %q from routing-table %q deleted.\n", model.RouteID, model.RoutingTableId) + return nil + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "Routing-Table ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag, routingTableIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + routeId := inputArgs[0] + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RouteID: routeId, + RoutingTableId: flags.FlagToStringValue(p, cmd, routingTableIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} diff --git a/internal/cmd/network-area/routingtable/route/delete/delete_test.go b/internal/cmd/network-area/routingtable/route/delete/delete_test.go new file mode 100644 index 000000000..22e137698 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/delete/delete_test.go @@ -0,0 +1,132 @@ +package delete + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" +) + +var ( + testOrgId = uuid.NewString() + testNetworkAreaId = uuid.NewString() + testRoutingTableId = uuid.NewString() + testRouteId = uuid.NewString() +) + +func fixtureFlagValues(mods ...func(map[string]string)) map[string]string { + flagValues := map[string]string{ + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + routingTableIdFlag: testRoutingTableId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(*inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.InfoVerbosity, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + RouteID: testRouteId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "valid input", + argValues: []string{testRouteId}, + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(func(m *inputModel) { + m.RouteID = testRouteId + }), + }, + { + description: "missing route id arg", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "missing organization-id flag", + argValues: []string{testRouteId}, + flagValues: fixtureFlagValues(func(m map[string]string) { + delete(m, "organization-id") + }), + isValid: false, + }, + { + description: "missing network-area-id flag", + argValues: []string{testRouteId}, + flagValues: fixtureFlagValues(func(m map[string]string) { + delete(m, "network-area-id") + }), + isValid: false, + }, + { + description: "missing routing-table-id flag", + argValues: []string{testRouteId}, + flagValues: fixtureFlagValues(func(m map[string]string) { + delete(m, "routing-table-id") + }), + isValid: false, + }, + { + description: "arg value missing", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "arg value wrong", + argValues: []string{"foo-bar"}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "invalid organization-id flag", + argValues: []string{testRouteId}, + flagValues: map[string]string{"organization-id": "invalid-org"}, + isValid: false, + }, + { + description: "invalid network-area-id flag", + argValues: []string{testRouteId}, + flagValues: map[string]string{"network-area-id": "invalid-area"}, + isValid: false, + }, + { + description: "invalid routing-table-id flag", + argValues: []string{testRouteId}, + flagValues: map[string]string{"routing-table-id": "invalid-table"}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} diff --git a/internal/cmd/network-area/routingtable/route/describe/describe.go b/internal/cmd/network-area/routingtable/route/describe/describe.go new file mode 100644 index 000000000..fd4e76489 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/describe/describe.go @@ -0,0 +1,157 @@ +package describe + +import ( + "context" + "fmt" + "strings" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + routeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/network-area/routing-table/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + routeIdArg = "ROUTE_ID" + routingTableIdFlag = "routing-table-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + NetworkAreaId string + OrganizationId string + RouteID string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", routeIdArg), + Short: "Describes a route within a routing-table", + Long: "Describes a route within a routing-table", + Args: args.SingleArg(routeIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Describe a route within a routing-table`, + `$ stackit network-area routing-table route describe xxx --routing-table-id xxx --organization-id yyy --network-area-id zzz`, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + request := apiClient.GetRouteOfRoutingTable( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + model.RouteID, + ) + + response, err := request.Execute() + if err != nil { + return fmt.Errorf("describe route: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, response) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "Routing-Table ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag, routingTableIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + routeId := inputArgs[0] + + model := inputModel{ + GlobalFlagModel: globalFlags, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RouteID: routeId, + RoutingTableId: flags.FlagToStringValue(p, cmd, routingTableIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, route *iaas.Route) error { + if route == nil { + return fmt.Errorf("describe route response is empty") + } + + return p.OutputResult(outputFormat, route, func() error { + routeDetails := routeUtils.ExtractRouteDetails(*route) + + table := tables.NewTable() + + table.AddRow("ID", utils.PtrString(route.Id)) + table.AddSeparator() + + table.AddRow("DESTINATION TYPE", routeDetails.DestType) + table.AddSeparator() + + table.AddRow("DESTINATION VALUE", routeDetails.DestValue) + table.AddSeparator() + + table.AddRow("NEXTHOP TYPE", routeDetails.HopType) + table.AddSeparator() + + table.AddRow("NEXTHOP VALUE", routeDetails.HopValue) + table.AddSeparator() + + if route.Labels != nil && len(*route.Labels) > 0 { + var labels []string + for key, value := range *route.Labels { + labels = append(labels, fmt.Sprintf("%s: %s", key, value)) + } + table.AddRow("LABELS", strings.Join(labels, "\n")) + table.AddSeparator() + } + + table.AddRow("CREATED AT", routeDetails.CreatedAt) + table.AddSeparator() + + table.AddRow("UPDATED AT", routeDetails.UpdatedAt) + table.AddSeparator() + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/network-area/routingtable/route/describe/describe_test.go b/internal/cmd/network-area/routingtable/route/describe/describe_test.go new file mode 100644 index 000000000..8be0698c9 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/describe/describe_test.go @@ -0,0 +1,233 @@ +package describe + +import ( + "testing" + "time" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() +var testRoutingTableId = uuid.NewString() +var testRouteId = uuid.NewString() + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + routingTableIdFlag: testRoutingTableId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + RouteID: testRouteId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRouteId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + argValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "routing-table-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, routingTableIdFlag) + }), + isValid: false, + }, + { + description: "network-area-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "org-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "invalid routing-table-id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[routingTableIdFlag] = "invalid-id" + }), + isValid: false, + }, + { + description: "arg value missing", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "arg value wrong", + argValues: []string{"foo-bar"}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "invalid organization-id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[organizationIdFlag] = "invalid-org" + }), + isValid: false, + }, + { + description: "invalid network-area-id", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[networkAreaIdFlag] = "invalid-area" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRoute := iaas.Route{ + Id: utils.Ptr("route-foo"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr("cidrv4"), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr("ipv4"), + Value: utils.Ptr("10.0.0.1"), + }, + }, + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + CreatedAt: utils.Ptr(time.Now()), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + route *iaas.Route + wantErr bool + }{ + { + name: "nil route should return error", + outputFormat: print.PrettyOutputFormat, + route: nil, + wantErr: true, + }, + { + name: "empty route", + outputFormat: print.PrettyOutputFormat, + route: &iaas.Route{}, + wantErr: false, + }, + { + name: "json empty route", + outputFormat: print.JSONOutputFormat, + route: &iaas.Route{}, + wantErr: false, + }, + { + name: "pretty output with one route", + outputFormat: print.PrettyOutputFormat, + route: &dummyRoute, + wantErr: false, + }, + { + name: "json output with one route", + outputFormat: print.JSONOutputFormat, + route: &dummyRoute, + wantErr: false, + }, + { + name: "yaml output with one route", + outputFormat: print.YAMLOutputFormat, + route: &dummyRoute, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, tt.route); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/routingtable/route/list/list.go b/internal/cmd/network-area/routingtable/route/list/list.go new file mode 100644 index 000000000..36317b652 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/list/list.go @@ -0,0 +1,172 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + routeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/network-area/routing-table/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + labelSelectorFlag = "label-selector" + limitFlag = "limit" + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + routingTableIdFlag = "routing-table-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + LabelSelector *string + Limit *int64 + NetworkAreaId string + OrganizationId string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all routes within a routing-table", + Long: "Lists all routes within a routing-table", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all routes within a routing-table`, + `$ stackit network-area routing-table route list --routing-table-id xxx --organization-id yyy --network-area-id zzz`, + ), + examples.NewExample( + `List all routes within a routing-table with labels`, + `$ stackit network-area routing-table list --routing-table-id xxx --organization-id yyy --network-area-id zzz --label-selector env=dev,env=rc`, + ), + examples.NewExample( + `List all routes within a routing-tables with labels and limit to 10`, + `$ stackit network-area routing-table list --routing-table-id xxx --organization-id yyy --network-area-id zzz --label-selector env=dev,env=rc --limit 10`, + ), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, nil) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Call API + request := apiClient.ListRoutesOfRoutingTable( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + ) + + if model.LabelSelector != nil { + request.LabelSelector(*model.LabelSelector) + } + + response, err := request.Execute() + if err != nil { + return fmt.Errorf("list routes: %w", err) + } + + routes := utils.GetSliceFromPointer(response.Items) + + // Truncate output + if model.Limit != nil && len(routes) > int(*model.Limit) { + routes = routes[:*model.Limit] + } + + return outputResult(params.Printer, model.OutputFormat, routes, model.OrganizationId, model.RoutingTableId) + }, + } + + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + cmd.Flags().String(labelSelectorFlag, "", "Filter by label") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "Routing-Table ID") + + err := flags.MarkFlagsRequired(cmd, organizationIdFlag, networkAreaIdFlag, routingTableIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &errors.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), + Limit: limit, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RoutingTableId: flags.FlagToStringValue(p, cmd, routingTableIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat string, routes []iaas.Route, orgId, routeTableId string) error { + if routes == nil { + return fmt.Errorf("list routes routes are nil") + } + + return p.OutputResult(outputFormat, routes, func() error { + if len(routes) == 0 { + p.Outputf("No routes found for routing-table %q in organization %q\n", routeTableId, orgId) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "DESTINATION TYPE", "DESTINATION VALUE", "NEXTHOP TYPE", "NEXTHOP VALUE", "LABELS", "CREATED AT", "UPDATED AT") + for _, route := range routes { + routeDetails := routeUtils.ExtractRouteDetails(route) + table.AddRow( + utils.PtrString(route.Id), + routeDetails.DestType, + routeDetails.DestValue, + routeDetails.HopType, + routeDetails.HopValue, + routeDetails.Labels, + routeDetails.CreatedAt, + routeDetails.UpdatedAt, + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/network-area/routingtable/route/list/list_test.go b/internal/cmd/network-area/routingtable/route/list/list_test.go new file mode 100644 index 000000000..9834e9bae --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/list/list_test.go @@ -0,0 +1,246 @@ +package list + +import ( + "strconv" + "testing" + "time" + + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() +var testRoutingTableId = uuid.NewString() + +const testLabelSelectorFlag = "key1=value1,key2=value2" + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +var testLimitFlag = int64(10) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + routingTableIdFlag: testRoutingTableId, + labelSelectorFlag: testLabelSelectorFlag, + limitFlag: strconv.Itoa(int(testLimitFlag)), + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + LabelSelector: utils.Ptr(testLabelSelectorFlag), + Limit: utils.Ptr(testLimitFlag), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + argValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "routing-table-id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, routingTableIdFlag) + }), + isValid: false, + }, + { + description: "network-area-id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "org-id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "labels missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, labelSelectorFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.LabelSelector = nil + }), + }, + { + description: "limit missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, limitFlag) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = nil + }), + }, + { + description: "invalid limit flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "invalid" + }), + isValid: false, + }, + { + description: "negative limit flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-10" + }), + isValid: false, + }, + { + description: "limit zero flag", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRoute := iaas.Route{ + Id: utils.Ptr("route-foo"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr("cidrv4"), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr("ipv4"), + Value: utils.Ptr("10.0.0.1"), + }, + }, + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + CreatedAt: utils.Ptr(time.Now()), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + routes []iaas.Route + wantErr bool + }{ + { + name: "nil routes should return error", + outputFormat: print.PrettyOutputFormat, + routes: nil, + wantErr: true, + }, + { + name: "empty routes list", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{}, + wantErr: false, + }, + { + name: "empty routes list json output", + outputFormat: print.JSONOutputFormat, + routes: []iaas.Route{}, + wantErr: false, + }, + { + name: "empty routes list json output", + outputFormat: print.YAMLOutputFormat, + routes: []iaas.Route{}, + wantErr: false, + }, + { + name: "route list with empty struct", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{{}}, + wantErr: false, + }, + { + name: "pretty output with one route", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{dummyRoute}, + wantErr: false, + }, + { + name: "pretty output with multiple routes", + outputFormat: print.PrettyOutputFormat, + routes: []iaas.Route{dummyRoute, dummyRoute, dummyRoute}, + wantErr: false, + }, + { + name: "json output with one route", + outputFormat: print.JSONOutputFormat, + routes: []iaas.Route{dummyRoute}, + wantErr: false, + }, + { + name: "yaml output with one route", + outputFormat: print.YAMLOutputFormat, + routes: []iaas.Route{dummyRoute}, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, tt.routes, "dummy-org", "dummy-route-table-id"); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/routingtable/route/route.go b/internal/cmd/network-area/routingtable/route/route.go new file mode 100644 index 000000000..158881952 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/route.go @@ -0,0 +1,33 @@ +package route + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "route", + Short: "Manages routes of a routing-table", + Long: "Manages routes of a routing-table", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) + cmd.AddCommand(create.NewCmd(params)) +} diff --git a/internal/cmd/network-area/routingtable/route/update/update.go b/internal/cmd/network-area/routingtable/route/update/update.go new file mode 100644 index 000000000..e2fb4d2c8 --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/update/update.go @@ -0,0 +1,154 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" + iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ( + labelFlag = "labels" + networkAreaIdFlag = "network-area-id" + organizationIdFlag = "organization-id" + routeIdArg = "ROUTE_ID" + routingTableIdFlag = "routing-table-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + Labels *map[string]string + NetworkAreaId string + OrganizationId string + RouteId string + RoutingTableId string +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", routeIdArg), + Short: "Updates a route in a routing-table", + Long: "Updates a route in a routing-table.", + Args: args.SingleArg(routeIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Updates the label(s) of a route with ID "xxx" in a routing-table ID "xxx" in organization with ID "yyy" and network-area with ID "zzz"`, + "$ stackit network-area routing-table route update xxx --labels key=value,foo=bar --routing-table-id xxx --organization-id yyy --network-area-id zzz", + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + routingTableLabel, err := iaasUtils.GetRoutingTableOfAreaName(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region, model.RoutingTableId) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get routing-table name: %v", err) + routingTableLabel = model.RoutingTableId + } else if routingTableLabel == "" { + routingTableLabel = model.RoutingTableId + } + + prompt := fmt.Sprintf("Are you sure you want to update route %q for routing-table %q?", model.RouteId, routingTableLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update route %q of routing-table %q : %w", model.RouteId, model.RoutingTableId, err) + } + + return outputResult(params.Printer, model.OutputFormat, model.RoutingTableId, model.NetworkAreaId, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringToString(labelFlag, nil, "Labels are key-value string pairs which can be attached to a route. A label can be provided with the format key=value and the flag can be used multiple times to provide a list of labels") + cmd.Flags().Var(flags.UUIDFlag(), networkAreaIdFlag, "Network-Area ID") + cmd.Flags().Var(flags.UUIDFlag(), organizationIdFlag, "Organization ID") + cmd.Flags().Var(flags.UUIDFlag(), routingTableIdFlag, "Routing-Table ID") + + err := flags.MarkFlagsRequired(cmd, labelFlag, organizationIdFlag, networkAreaIdFlag, routingTableIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + + routeId := inputArgs[0] + + labels := flags.FlagToStringToStringPointer(p, cmd, labelFlag) + + if labels == nil { + return nil, &cliErr.EmptyUpdateError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + Labels: labels, + NetworkAreaId: flags.FlagToStringValue(p, cmd, networkAreaIdFlag), + OrganizationId: flags.FlagToStringValue(p, cmd, organizationIdFlag), + RouteId: routeId, + RoutingTableId: flags.FlagToStringValue(p, cmd, routingTableIdFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func outputResult(p *print.Printer, outputFormat, routingTableId, networkAreaId string, route *iaas.Route) error { + return p.OutputResult(outputFormat, route, func() error { + if route == nil { + return fmt.Errorf("update route response is empty") + } + + if route.Id == nil || *route.Id == "" { + return fmt.Errorf("update route response has empty id") + } + + p.Outputf("Updated route %q for routing-table %q in network-area %q.\n", *route.Id, routingTableId, networkAreaId) + return nil + }) +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APIClient) iaas.ApiUpdateRouteOfRoutingTableRequest { + req := apiClient.UpdateRouteOfRoutingTable( + ctx, + model.OrganizationId, + model.NetworkAreaId, + model.Region, + model.RoutingTableId, + model.RouteId, + ) + + payload := iaas.UpdateRouteOfRoutingTablePayload{ + Labels: utils.ConvertStringMapToInterfaceMap(model.Labels), + } + + return req.UpdateRouteOfRoutingTablePayload(payload) +} diff --git a/internal/cmd/network-area/routingtable/route/update/update_test.go b/internal/cmd/network-area/routingtable/route/update/update_test.go new file mode 100644 index 000000000..5f987734d --- /dev/null +++ b/internal/cmd/network-area/routingtable/route/update/update_test.go @@ -0,0 +1,301 @@ +package update + +import ( + "context" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &iaas.APIClient{} + +const testRegion = "eu01" + +var testOrgId = uuid.NewString() +var testNetworkAreaId = uuid.NewString() +var testRoutingTableId = uuid.NewString() +var testRouteId = uuid.NewString() + +const testLabelSelectorFlag = "key1=value1,key2=value2" + +var testLabels = &map[string]string{ + "key1": "value1", + "key2": "value2", +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.RegionFlag: testRegion, + organizationIdFlag: testOrgId, + networkAreaIdFlag: testNetworkAreaId, + routingTableIdFlag: testRoutingTableId, + labelFlag: testLabelSelectorFlag, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + Verbosity: globalflags.VerbosityDefault, + Region: testRegion, + }, + OrganizationId: testOrgId, + NetworkAreaId: testNetworkAreaId, + RoutingTableId: testRoutingTableId, + RouteId: testRouteId, + Labels: testLabels, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testRouteId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureRequest(mods ...func(req *iaas.ApiUpdateRouteOfRoutingTableRequest)) iaas.ApiUpdateRouteOfRoutingTableRequest { + req := testClient.UpdateRouteOfRoutingTable( + testCtx, + testOrgId, + testNetworkAreaId, + testRegion, + testRoutingTableId, + testRouteId, + ) + + payload := iaas.UpdateRouteOfRoutingTablePayload{ + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + } + + req = req.UpdateRouteOfRoutingTablePayload(payload) + + for _, mod := range mods { + mod(&req) + } + + return req +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + argValues []string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + argValues: fixtureArgValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + argValues: []string{}, + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "routing-table-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, routingTableIdFlag) + }), + isValid: false, + }, + { + description: "network-area-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, networkAreaIdFlag) + }), + isValid: false, + }, + { + description: "org-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, organizationIdFlag) + }), + isValid: false, + }, + { + description: "routing-table-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, routingTableIdFlag) + }), + isValid: false, + }, + { + description: "arg value missing", + argValues: []string{""}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "arg value wrong", + argValues: []string{"foo-bar"}, + flagValues: fixtureFlagValues(), + isValid: false, + expectedModel: fixtureInputModel(), + }, + { + description: "labels are missing", + argValues: []string{}, + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, labelFlag) + }), + isValid: false, + }, + { + description: "invalid label format", + argValues: []string{}, + flagValues: map[string]string{labelFlag: "invalid-label"}, + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest iaas.ApiUpdateRouteOfRoutingTableRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "labels nil", + model: fixtureInputModel(func(m *inputModel) { + m.Labels = nil + }), + expectedRequest: fixtureRequest(func(request *iaas.ApiUpdateRouteOfRoutingTableRequest) { + *request = (*request).UpdateRouteOfRoutingTablePayload(iaas.UpdateRouteOfRoutingTablePayload{ + Labels: nil, + }) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + gotReq := buildRequest(testCtx, tt.model, testClient) + + if diff := cmp.Diff( + tt.expectedRequest, + gotReq, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ); diff != "" { + t.Errorf("buildRequest() mismatch (-want +got):\n%s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + dummyRoute := iaas.Route{ + Id: utils.Ptr("route-foo"), + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr("cidrv4"), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr("ipv4"), + Value: utils.Ptr("10.0.0.1"), + }, + }, + Labels: utils.ConvertStringMapToInterfaceMap(testLabels), + CreatedAt: utils.Ptr(time.Now()), + UpdatedAt: utils.Ptr(time.Now()), + } + + tests := []struct { + name string + outputFormat string + route *iaas.Route + wantErr bool + }{ + { + name: "nil route should return error", + outputFormat: print.PrettyOutputFormat, + route: nil, + wantErr: true, + }, + { + name: "empty route", + outputFormat: print.PrettyOutputFormat, + route: &iaas.Route{}, + // should fail on pretty format + wantErr: true, + }, + { + name: "pretty output with one route", + outputFormat: print.PrettyOutputFormat, + route: &dummyRoute, + wantErr: false, + }, + { + name: "json output with one route", + outputFormat: print.JSONOutputFormat, + route: &dummyRoute, + wantErr: false, + }, + { + name: "yaml output with one route", + outputFormat: print.YAMLOutputFormat, + route: &dummyRoute, + wantErr: false, + }, + } + + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.outputFormat, "", "", tt.route); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/network-area/routingtable/routingtable.go b/internal/cmd/network-area/routingtable/routingtable.go index 1e1fc860a..64e86403a 100644 --- a/internal/cmd/network-area/routingtable/routingtable.go +++ b/internal/cmd/network-area/routingtable/routingtable.go @@ -6,6 +6,7 @@ import ( rtDelete "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/delete" rtDescribe "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/describe" rtList "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/list" + rtRoute "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route" rtUpdate "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/update" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" @@ -34,5 +35,6 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { rtList.NewCmd(params), rtDescribe.NewCmd(params), rtDelete.NewCmd(params), + rtRoute.NewCmd(params), ) } diff --git a/internal/pkg/services/network-area/routing-table/utils/utils.go b/internal/pkg/services/network-area/routing-table/utils/utils.go new file mode 100644 index 000000000..19e68a551 --- /dev/null +++ b/internal/pkg/services/network-area/routing-table/utils/utils.go @@ -0,0 +1,65 @@ +package utils + +import ( + "fmt" + "time" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +type RouteDetails struct { + DestType string + DestValue string + HopType string + HopValue string + CreatedAt string + UpdatedAt string + Labels string +} + +func ExtractRouteDetails(route iaas.Route) RouteDetails { + var routeDetails RouteDetails + + if route.Destination != nil { + if route.Destination.DestinationCIDRv4 != nil { + routeDetails.DestType = utils.PtrString(route.Destination.DestinationCIDRv4.Type) + routeDetails.DestValue = utils.PtrString(route.Destination.DestinationCIDRv4.Value) + } else if route.Destination.DestinationCIDRv6 != nil { + routeDetails.DestType = utils.PtrString(route.Destination.DestinationCIDRv6.Type) + routeDetails.DestValue = utils.PtrString(route.Destination.DestinationCIDRv6.Value) + } + } + + if route.Nexthop != nil { + if route.Nexthop.NexthopIPv4 != nil { + routeDetails.HopType = utils.PtrString(route.Nexthop.NexthopIPv4.Type) + routeDetails.HopValue = utils.PtrString(route.Nexthop.NexthopIPv4.Value) + } else if route.Nexthop.NexthopIPv6 != nil { + routeDetails.HopType = utils.PtrString(route.Nexthop.NexthopIPv6.Type) + routeDetails.HopValue = utils.PtrString(route.Nexthop.NexthopIPv6.Value) + } else if route.Nexthop.NexthopInternet != nil { + routeDetails.HopType = utils.PtrString(route.Nexthop.NexthopInternet.Type) + } else if route.Nexthop.NexthopBlackhole != nil { + routeDetails.HopType = utils.PtrString(route.Nexthop.NexthopBlackhole.Type) + } + } + + if route.Labels != nil && len(*route.Labels) > 0 { + stringMap := make(map[string]string) + for key, value := range *route.Labels { + stringMap[key] = fmt.Sprintf("%v", value) + } + routeDetails.Labels = utils.JoinStringMap(stringMap, ": ", "\n") + } + + if route.CreatedAt != nil { + routeDetails.CreatedAt = route.CreatedAt.Format(time.RFC3339) + } + + if route.UpdatedAt != nil { + routeDetails.UpdatedAt = route.UpdatedAt.Format(time.RFC3339) + } + + return routeDetails +} diff --git a/internal/pkg/services/network-area/routing-table/utils/utils_test.go b/internal/pkg/services/network-area/routing-table/utils/utils_test.go new file mode 100644 index 000000000..e08c796d6 --- /dev/null +++ b/internal/pkg/services/network-area/routing-table/utils/utils_test.go @@ -0,0 +1,268 @@ +package utils + +import ( + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" +) + +const ipv4 = "ipv4" +const ipv6 = "ipv6" +const cidrv4 = "cidrv4" +const cidrv6 = "cidrv6" + +func TestExtractRouteDetails(t *testing.T) { + created := time.Date(2024, 1, 2, 3, 4, 5, 0, time.UTC) + updated := time.Date(2024, 1, 2, 4, 5, 6, 0, time.UTC) + + tests := []struct { + description string + input *iaas.Route + want RouteDetails + }{ + { + description: "completely empty route (zero value)", + input: &iaas.Route{}, + want: RouteDetails{}, + }, + { + description: "destination only, no nexthop, no labels", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(cidrv4), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + }, + want: RouteDetails{ + DestType: cidrv4, + DestValue: "10.0.0.0/24", + }, + }, + { + description: "nexthop only, no destination, empty labels map", + input: &iaas.Route{ + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(ipv4), + Value: utils.Ptr("10.0.0.1"), + }, + }, + Labels: &map[string]interface{}{}, // empty but non-nil + }, + want: RouteDetails{ + HopType: ipv4, + HopValue: "10.0.0.1", + }, + }, + { + description: "destination present, nexthop struct nil, labels nil", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv6: &iaas.DestinationCIDRv6{ + Type: utils.Ptr(cidrv6), + Value: utils.Ptr("2001:db8::/32"), + }, + }, + Nexthop: nil, + Labels: nil, + }, + want: RouteDetails{ + DestType: cidrv6, + DestValue: "2001:db8::/32", + }, + }, + { + description: "CIDRv4 destination, IPv4 nexthop, with labels", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(cidrv4), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(ipv4), + Value: utils.Ptr("10.0.0.1"), + }, + }, + Labels: &map[string]interface{}{ + "key": "value", + }, + }, + want: RouteDetails{ + DestType: cidrv4, + DestValue: "10.0.0.0/24", + HopType: ipv4, + HopValue: "10.0.0.1", + Labels: "key: value", + }, + }, + { + description: "CIDRv6 destination, IPv6 nexthop, with no labels", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv6: &iaas.DestinationCIDRv6{ + Type: utils.Ptr(cidrv6), + Value: utils.Ptr("2001:db8::/32"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv6: &iaas.NexthopIPv6{ + Type: utils.Ptr(ipv6), + Value: utils.Ptr("2001:db8::1"), + }, + }, + Labels: nil, + }, + want: RouteDetails{ + DestType: cidrv6, + DestValue: "2001:db8::/32", + HopType: ipv6, + HopValue: "2001:db8::1", + }, + }, + { + description: "Internet nexthop without value", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(cidrv4), + Value: utils.Ptr("0.0.0.0/0"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopInternet: &iaas.NexthopInternet{ + Type: utils.Ptr("Internet"), + }, + }, + Labels: nil, + }, + want: RouteDetails{ + DestType: cidrv4, + DestValue: "0.0.0.0/0", + HopType: "Internet", + // HopValue empty + }, + }, + { + description: "Blackhole nexthop without value and nil labels map", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv6: &iaas.DestinationCIDRv6{ + Type: utils.Ptr(cidrv6), + Value: utils.Ptr("::/0"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopBlackhole: &iaas.NexthopBlackhole{ + Type: utils.Ptr("Blackhole"), + }, + }, + Labels: nil, + }, + want: RouteDetails{ + DestType: cidrv6, + DestValue: "::/0", + HopType: "Blackhole", + }, + }, + { + description: "route with created and updated timestamps", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(cidrv4), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(ipv4), + Value: utils.Ptr("10.0.0.1"), + }, + }, + CreatedAt: &created, + UpdatedAt: &updated, + }, + want: RouteDetails{ + DestType: cidrv4, + DestValue: "10.0.0.0/24", + HopType: ipv4, + HopValue: "10.0.0.1", + CreatedAt: created.Format(time.RFC3339), + UpdatedAt: updated.Format(time.RFC3339), + Labels: "", + }, + }, + { + description: "route with created timestamp only", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(cidrv4), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(ipv4), + Value: utils.Ptr("10.0.0.1"), + }, + }, + CreatedAt: &created, + }, + want: RouteDetails{ + DestType: cidrv4, + DestValue: "10.0.0.0/24", + HopType: ipv4, + HopValue: "10.0.0.1", + CreatedAt: created.Format(time.RFC3339), + UpdatedAt: "", + Labels: "", + }, + }, + { + description: "route with updated timestamp only", + input: &iaas.Route{ + Destination: &iaas.RouteDestination{ + DestinationCIDRv4: &iaas.DestinationCIDRv4{ + Type: utils.Ptr(cidrv4), + Value: utils.Ptr("10.0.0.0/24"), + }, + }, + Nexthop: &iaas.RouteNexthop{ + NexthopIPv4: &iaas.NexthopIPv4{ + Type: utils.Ptr(ipv4), + Value: utils.Ptr("10.0.0.1"), + }, + }, + UpdatedAt: &updated, + }, + want: RouteDetails{ + DestType: cidrv4, + DestValue: "10.0.0.0/24", + HopType: ipv4, + HopValue: "10.0.0.1", + CreatedAt: "", + UpdatedAt: updated.Format(time.RFC3339), + Labels: "", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + got := ExtractRouteDetails(*tt.input) + + if diff := cmp.Diff(tt.want, got); diff != "" { + t.Fatalf("ExtractRouteDetails() mismatch (-want +got):\n%s", diff) + } + }) + } +} From aa3f6fe7cdcda9f68b7563b4c571efc21633da88 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Wed, 25 Mar 2026 17:28:57 +0100 Subject: [PATCH 413/422] feat(object-storage) add objectLockEnable flag to bucket create (#1349) relates to STACKITCLI-342 --- docs/stackit_object-storage_bucket_create.md | 6 +++- .../object-storage/bucket/create/create.go | 22 ++++++++++---- .../bucket/create/create_test.go | 29 ++++++++++++++++--- .../bucket/describe/describe.go | 2 ++ .../cmd/object-storage/bucket/list/list.go | 3 +- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/docs/stackit_object-storage_bucket_create.md b/docs/stackit_object-storage_bucket_create.md index 1c07eb540..58f14a21a 100644 --- a/docs/stackit_object-storage_bucket_create.md +++ b/docs/stackit_object-storage_bucket_create.md @@ -15,12 +15,16 @@ stackit object-storage bucket create BUCKET_NAME [flags] ``` Create an Object Storage bucket with name "my-bucket" $ stackit object-storage bucket create my-bucket + + Create an Object Storage bucket with enabled object-lock + $ stackit object-storage bucket create my-bucket --object-lock-enabled ``` ### Options ``` - -h, --help Help for "stackit object-storage bucket create" + -h, --help Help for "stackit object-storage bucket create" + --object-lock-enabled is the object-lock enabled for the bucket ``` ### Options inherited from parent commands diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index b0a387572..ea10274db 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -21,12 +22,14 @@ import ( ) const ( - bucketNameArg = "BUCKET_NAME" + bucketNameArg = "BUCKET_NAME" + objectLockEnabledFlag = "object-lock-enabled" ) type inputModel struct { *globalflags.GlobalFlagModel - BucketName string + BucketName string + ObjectLockEnabled bool } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -39,6 +42,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { examples.NewExample( `Create an Object Storage bucket with name "my-bucket"`, "$ stackit object-storage bucket create my-bucket"), + examples.NewExample( + `Create an Object Storage bucket with enabled object-lock`, + `$ stackit object-storage bucket create my-bucket --object-lock-enabled`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -91,9 +97,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return outputResult(params.Printer, model.OutputFormat, model.Async, model.BucketName, resp) }, } + configureFlags(cmd) return cmd } +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Bool(objectLockEnabledFlag, false, "is the object-lock enabled for the bucket") +} + func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { bucketName := inputArgs[0] @@ -103,8 +114,9 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } model := inputModel{ - GlobalFlagModel: globalFlags, - BucketName: bucketName, + GlobalFlagModel: globalFlags, + BucketName: bucketName, + ObjectLockEnabled: flags.FlagToBoolValue(p, cmd, objectLockEnabledFlag), } p.DebugInputModel(model) @@ -112,7 +124,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu } func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiCreateBucketRequest { - req := apiClient.DefaultAPI.CreateBucket(ctx, model.ProjectId, model.Region, model.BucketName) + req := apiClient.DefaultAPI.CreateBucket(ctx, model.ProjectId, model.Region, model.BucketName).ObjectLockEnabled(model.ObjectLockEnabled) return req } diff --git a/internal/cmd/object-storage/bucket/create/create_test.go b/internal/cmd/object-storage/bucket/create/create_test.go index 905677814..2460b63c7 100644 --- a/internal/cmd/object-storage/bucket/create/create_test.go +++ b/internal/cmd/object-storage/bucket/create/create_test.go @@ -55,7 +55,8 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { Verbosity: globalflags.VerbosityDefault, Region: testRegion, }, - BucketName: testBucketName, + BucketName: testBucketName, + ObjectLockEnabled: false, } for _, mod := range mods { mod(model) @@ -63,10 +64,10 @@ func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { return model } -func fixtureRequest(mods ...func(request *objectstorage.ApiCreateBucketRequest)) objectstorage.ApiCreateBucketRequest { - request := testClient.DefaultAPI.CreateBucket(testCtx, testProjectId, testRegion, testBucketName) +func fixtureRequest(mods ...func(request objectstorage.ApiCreateBucketRequest) objectstorage.ApiCreateBucketRequest) objectstorage.ApiCreateBucketRequest { + request := testClient.DefaultAPI.CreateBucket(testCtx, testProjectId, testRegion, testBucketName).ObjectLockEnabled(false) for _, mod := range mods { - mod(&request) + request = mod(request) } return request } @@ -134,6 +135,17 @@ func TestParseInput(t *testing.T) { flagValues: fixtureFlagValues(), isValid: false, }, + { + description: "enable object-lock", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[objectLockEnabledFlag] = "true" + }), + expectedModel: fixtureInputModel(func(model *inputModel) { + model.ObjectLockEnabled = true + }), + isValid: true, + }, } for _, tt := range tests { @@ -154,6 +166,15 @@ func TestBuildRequest(t *testing.T) { model: fixtureInputModel(), expectedRequest: fixtureRequest(), }, + { + description: "object-lock enabled", + model: fixtureInputModel(func(model *inputModel) { + model.ObjectLockEnabled = true + }), + expectedRequest: fixtureRequest(func(request objectstorage.ApiCreateBucketRequest) objectstorage.ApiCreateBucketRequest { + return request.ObjectLockEnabled(true) + }), + }, } for _, tt := range tests { diff --git a/internal/cmd/object-storage/bucket/describe/describe.go b/internal/cmd/object-storage/bucket/describe/describe.go index de374c8d8..1375ff05a 100644 --- a/internal/cmd/object-storage/bucket/describe/describe.go +++ b/internal/cmd/object-storage/bucket/describe/describe.go @@ -103,6 +103,8 @@ func outputResult(p *print.Printer, outputFormat string, resp *objectstorage.Get table.AddSeparator() table.AddRow("URL (Virtual Hosted Style)", resp.Bucket.UrlVirtualHostedStyle) table.AddSeparator() + table.AddRow("Object Lock Enabled", resp.Bucket.ObjectLockEnabled) + table.AddSeparator() err := table.Display(p) if err != nil { return fmt.Errorf("render table: %w", err) diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index e26c926e5..ebb3c70a0 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -129,7 +129,7 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, buckets [ } table := tables.NewTable() - table.SetHeader("NAME", "REGION", "URL (PATH STYLE)", "URL (VIRTUAL HOSTED STYLE)") + table.SetHeader("NAME", "REGION", "URL (PATH STYLE)", "URL (VIRTUAL HOSTED STYLE)", "OBJECT LOCK ENABLED") for i := range buckets { bucket := buckets[i] table.AddRow( @@ -137,6 +137,7 @@ func outputResult(p *print.Printer, outputFormat, projectLabel string, buckets [ bucket.Region, bucket.UrlPathStyle, bucket.UrlVirtualHostedStyle, + bucket.ObjectLockEnabled, ) } err := table.Display(p) From a1729da619c2b26ec4bcde9867433e2c26adc999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ruben=20H=C3=B6nle?= Date: Thu, 26 Mar 2026 17:58:43 +0100 Subject: [PATCH 414/422] feat(objectstorage): onboard compliance lock cmd (#1351) relates to STACKITCLI-341 --- docs/stackit_object-storage.md | 1 + .../stackit_object-storage_compliance-lock.md | 36 ++++ ...object-storage_compliance-lock_describe.md | 40 ++++ ...kit_object-storage_compliance-lock_lock.md | 40 ++++ ...t_object-storage_compliance-lock_unlock.md | 40 ++++ .../compliance-lock/compliance-lock.go | 30 +++ .../compliance-lock/describe/describe.go | 111 +++++++++++ .../compliance-lock/describe/describe_test.go | 179 +++++++++++++++++ .../compliance-lock/lock/lock.go | 116 +++++++++++ .../compliance-lock/lock/lock_test.go | 180 ++++++++++++++++++ .../compliance-lock/unlock/unlock.go | 106 +++++++++++ .../compliance-lock/unlock/unlock_test.go | 128 +++++++++++++ internal/cmd/object-storage/object_storage.go | 2 + 13 files changed, 1009 insertions(+) create mode 100644 docs/stackit_object-storage_compliance-lock.md create mode 100644 docs/stackit_object-storage_compliance-lock_describe.md create mode 100644 docs/stackit_object-storage_compliance-lock_lock.md create mode 100644 docs/stackit_object-storage_compliance-lock_unlock.md create mode 100644 internal/cmd/object-storage/compliance-lock/compliance-lock.go create mode 100644 internal/cmd/object-storage/compliance-lock/describe/describe.go create mode 100644 internal/cmd/object-storage/compliance-lock/describe/describe_test.go create mode 100644 internal/cmd/object-storage/compliance-lock/lock/lock.go create mode 100644 internal/cmd/object-storage/compliance-lock/lock/lock_test.go create mode 100644 internal/cmd/object-storage/compliance-lock/unlock/unlock.go create mode 100644 internal/cmd/object-storage/compliance-lock/unlock/unlock_test.go diff --git a/docs/stackit_object-storage.md b/docs/stackit_object-storage.md index 5caa02380..bae7c2496 100644 --- a/docs/stackit_object-storage.md +++ b/docs/stackit_object-storage.md @@ -31,6 +31,7 @@ stackit object-storage [flags] * [stackit](./stackit.md) - Manage STACKIT resources using the command line * [stackit object-storage bucket](./stackit_object-storage_bucket.md) - Provides functionality for Object Storage buckets +* [stackit object-storage compliance-lock](./stackit_object-storage_compliance-lock.md) - Provides functionality to manage Object Storage compliance lock * [stackit object-storage credentials](./stackit_object-storage_credentials.md) - Provides functionality for Object Storage credentials * [stackit object-storage credentials-group](./stackit_object-storage_credentials-group.md) - Provides functionality for Object Storage credentials group * [stackit object-storage disable](./stackit_object-storage_disable.md) - Disables Object Storage for a project diff --git a/docs/stackit_object-storage_compliance-lock.md b/docs/stackit_object-storage_compliance-lock.md new file mode 100644 index 000000000..435807d29 --- /dev/null +++ b/docs/stackit_object-storage_compliance-lock.md @@ -0,0 +1,36 @@ +## stackit object-storage compliance-lock + +Provides functionality to manage Object Storage compliance lock + +### Synopsis + +Provides functionality to manage Object Storage compliance lock. + +``` +stackit object-storage compliance-lock [flags] +``` + +### Options + +``` + -h, --help Help for "stackit object-storage compliance-lock" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit object-storage](./stackit_object-storage.md) - Provides functionality for Object Storage +* [stackit object-storage compliance-lock describe](./stackit_object-storage_compliance-lock_describe.md) - Describe object storage compliance lock +* [stackit object-storage compliance-lock lock](./stackit_object-storage_compliance-lock_lock.md) - Create object storage compliance lock +* [stackit object-storage compliance-lock unlock](./stackit_object-storage_compliance-lock_unlock.md) - Delete object storage compliance lock + diff --git a/docs/stackit_object-storage_compliance-lock_describe.md b/docs/stackit_object-storage_compliance-lock_describe.md new file mode 100644 index 000000000..393b034da --- /dev/null +++ b/docs/stackit_object-storage_compliance-lock_describe.md @@ -0,0 +1,40 @@ +## stackit object-storage compliance-lock describe + +Describe object storage compliance lock + +### Synopsis + +Describe object storage compliance lock. + +``` +stackit object-storage compliance-lock describe [flags] +``` + +### Examples + +``` + Describe object storage compliance lock + $ stackit object-storage compliance-lock describe +``` + +### Options + +``` + -h, --help Help for "stackit object-storage compliance-lock describe" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit object-storage compliance-lock](./stackit_object-storage_compliance-lock.md) - Provides functionality to manage Object Storage compliance lock + diff --git a/docs/stackit_object-storage_compliance-lock_lock.md b/docs/stackit_object-storage_compliance-lock_lock.md new file mode 100644 index 000000000..98a55265d --- /dev/null +++ b/docs/stackit_object-storage_compliance-lock_lock.md @@ -0,0 +1,40 @@ +## stackit object-storage compliance-lock lock + +Create object storage compliance lock + +### Synopsis + +Create object storage compliance lock. + +``` +stackit object-storage compliance-lock lock [flags] +``` + +### Examples + +``` + Create object storage compliance lock + $ stackit object-storage compliance-lock lock +``` + +### Options + +``` + -h, --help Help for "stackit object-storage compliance-lock lock" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit object-storage compliance-lock](./stackit_object-storage_compliance-lock.md) - Provides functionality to manage Object Storage compliance lock + diff --git a/docs/stackit_object-storage_compliance-lock_unlock.md b/docs/stackit_object-storage_compliance-lock_unlock.md new file mode 100644 index 000000000..5666c3a40 --- /dev/null +++ b/docs/stackit_object-storage_compliance-lock_unlock.md @@ -0,0 +1,40 @@ +## stackit object-storage compliance-lock unlock + +Delete object storage compliance lock + +### Synopsis + +Delete object storage compliance lock. + +``` +stackit object-storage compliance-lock unlock [flags] +``` + +### Examples + +``` + Delete object storage compliance lock + $ stackit object-storage compliance-lock unlock +``` + +### Options + +``` + -h, --help Help for "stackit object-storage compliance-lock unlock" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit object-storage compliance-lock](./stackit_object-storage_compliance-lock.md) - Provides functionality to manage Object Storage compliance lock + diff --git a/internal/cmd/object-storage/compliance-lock/compliance-lock.go b/internal/cmd/object-storage/compliance-lock/compliance-lock.go new file mode 100644 index 000000000..49df4e178 --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/compliance-lock.go @@ -0,0 +1,30 @@ +package compliancelock + +import ( + "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/compliance-lock/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/compliance-lock/lock" + "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/compliance-lock/unlock" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + + "github.com/spf13/cobra" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "compliance-lock", + Short: "Provides functionality to manage Object Storage compliance lock", + Long: "Provides functionality to manage Object Storage compliance lock.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + cmd.AddCommand(lock.NewCmd(params)) + cmd.AddCommand(unlock.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) +} diff --git a/internal/cmd/object-storage/compliance-lock/describe/describe.go b/internal/cmd/object-storage/compliance-lock/describe/describe.go new file mode 100644 index 000000000..2aa3ea34a --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/describe/describe.go @@ -0,0 +1,111 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" + objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" +) + +type inputModel struct { + *globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "describe", + Short: "Describe object storage compliance lock", + Long: "Describe object storage compliance lock.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Describe object storage compliance lock`, + "$ stackit object-storage compliance-lock describe"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + // Check if the project is enabled before trying to describe + enabled, err := objectStorageUtils.ProjectEnabled(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region) + if err != nil { + return fmt.Errorf("check if Object Storage is enabled: %w", err) + } + if !enabled { + return &errors.ServiceDisabledError{ + Service: "object-storage", + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get object storage compliance lock: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiGetComplianceLockRequest { + req := apiClient.DefaultAPI.GetComplianceLock(ctx, model.ProjectId, model.Region) + return req +} + +func outputResult(p *print.Printer, outputFormat string, resp *objectstorage.ComplianceLockResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil { + return fmt.Errorf("response is empty") + } + + table := tables.NewTable() + table.AddRow("PROJECT ID", resp.Project) + table.AddSeparator() + table.AddRow("MAX RETENTION DAYS", resp.MaxRetentionDays) + table.AddSeparator() + + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/object-storage/compliance-lock/describe/describe_test.go b/internal/cmd/object-storage/compliance-lock/describe/describe_test.go new file mode 100644 index 000000000..1c92d7cdf --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/describe/describe_test.go @@ -0,0 +1,179 @@ +package describe + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} +var testProjectId = uuid.NewString() + +const ( + testRegion = "eu01" +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *objectstorage.ApiGetComplianceLockRequest)) objectstorage.ApiGetComplianceLockRequest { + request := testClient.DefaultAPI.GetComplianceLock(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest objectstorage.ApiGetComplianceLockRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + complianceLock *objectstorage.ComplianceLockResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{ + outputFormat: print.PrettyOutputFormat, + }, + wantErr: true, + }, + { + name: "set empty compliance lock", + args: args{ + outputFormat: print.PrettyOutputFormat, + complianceLock: &objectstorage.ComplianceLockResponse{}, + }, + wantErr: false, + }, + { + name: "set filled lock", + args: args{ + outputFormat: print.PrettyOutputFormat, + complianceLock: &objectstorage.ComplianceLockResponse{ + Project: uuid.New().String(), + MaxRetentionDays: int32(42), + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.complianceLock); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/object-storage/compliance-lock/lock/lock.go b/internal/cmd/object-storage/compliance-lock/lock/lock.go new file mode 100644 index 000000000..e179f7c26 --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/lock/lock.go @@ -0,0 +1,116 @@ +package lock + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" + + "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" +) + +type inputModel struct { + *globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "lock", + Short: "Create object storage compliance lock", + Long: "Create object storage compliance lock.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create object storage compliance lock`, + "$ stackit object-storage compliance-lock lock"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to create object storage compliance-lock for project %s?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Check if the project is enabled before trying to create + enabled, err := utils.ProjectEnabled(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region) + if err != nil { + return fmt.Errorf("check if Object Storage is enabled: %w", err) + } + if !enabled { + return &errors.ServiceDisabledError{ + Service: "object-storage", + } + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create object storage compliance lock: %w", err) + } + + return outputResult(params.Printer, model.OutputFormat, projectLabel, resp) + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiCreateComplianceLockRequest { + req := apiClient.DefaultAPI.CreateComplianceLock(ctx, model.ProjectId, model.Region) + return req +} + +func outputResult(p *print.Printer, outputFormat, projectLabel string, resp *objectstorage.ComplianceLockResponse) error { + return p.OutputResult(outputFormat, resp, func() error { + if resp == nil { + return fmt.Errorf("create compliance lock response is empty") + } + + p.Outputf("Created object storage compliance lock for project \"%s\" with maximum retention period of %d days.\n", projectLabel, resp.MaxRetentionDays) + return nil + }) +} diff --git a/internal/cmd/object-storage/compliance-lock/lock/lock_test.go b/internal/cmd/object-storage/compliance-lock/lock/lock_test.go new file mode 100644 index 000000000..48e39cb90 --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/lock/lock_test.go @@ -0,0 +1,180 @@ +package lock + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} +var testProjectId = uuid.NewString() + +const ( + testRegion = "eu01" +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *objectstorage.ApiCreateComplianceLockRequest)) objectstorage.ApiCreateComplianceLockRequest { + request := testClient.DefaultAPI.CreateComplianceLock(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest objectstorage.ApiCreateComplianceLockRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + complianceLock *objectstorage.ComplianceLockResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "empty", + args: args{ + outputFormat: print.PrettyOutputFormat, + }, + wantErr: true, + }, + { + name: "set empty compliance lock", + args: args{ + outputFormat: print.PrettyOutputFormat, + complianceLock: &objectstorage.ComplianceLockResponse{}, + }, + wantErr: false, + }, + { + name: "set filled lock", + args: args{ + outputFormat: print.PrettyOutputFormat, + complianceLock: &objectstorage.ComplianceLockResponse{ + Project: uuid.New().String(), + MaxRetentionDays: int32(42), + }, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.complianceLock); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/object-storage/compliance-lock/unlock/unlock.go b/internal/cmd/object-storage/compliance-lock/unlock/unlock.go new file mode 100644 index 000000000..ad9320c2a --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/unlock/unlock.go @@ -0,0 +1,106 @@ +package unlock + +import ( + "context" + "fmt" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" + + "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" +) + +type inputModel struct { + *globalflags.GlobalFlagModel +} + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "unlock", + Short: "Delete object storage compliance lock", + Long: "Delete object storage compliance lock.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Delete object storage compliance lock`, + "$ stackit object-storage compliance-lock unlock"), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(params.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(params.Printer, params.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, params.Printer, params.CliVersion, cmd) + if err != nil { + params.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } else if projectLabel == "" { + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to delete object storage compliance-lock for project %s?", projectLabel) + err = params.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Check if the project is enabled before trying to create + enabled, err := utils.ProjectEnabled(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region) + if err != nil { + return fmt.Errorf("check if Object Storage is enabled: %w", err) + } + if !enabled { + return &errors.ServiceDisabledError{ + Service: "object-storage", + } + } + + // Call API + _, err = buildRequest(ctx, model, apiClient).Execute() + if err != nil { + return fmt.Errorf("delete object storage compliance lock: %w", err) + } + + params.Printer.Outputf("Deleted object storage compliance lock for project \"%s\".\n", projectLabel) + + return nil + }, + } + return cmd +} + +func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &errors.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *objectstorage.APIClient) objectstorage.ApiDeleteComplianceLockRequest { + req := apiClient.DefaultAPI.DeleteComplianceLock(ctx, model.ProjectId, model.Region) + return req +} diff --git a/internal/cmd/object-storage/compliance-lock/unlock/unlock_test.go b/internal/cmd/object-storage/compliance-lock/unlock/unlock_test.go new file mode 100644 index 000000000..1df9eb3a9 --- /dev/null +++ b/internal/cmd/object-storage/compliance-lock/unlock/unlock_test.go @@ -0,0 +1,128 @@ +package unlock + +import ( + "context" + "testing" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" +) + +type testCtxKey struct{} + +var testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") +var testClient = &objectstorage.APIClient{DefaultAPI: &objectstorage.DefaultAPIService{}} +var testProjectId = uuid.NewString() + +const ( + testRegion = "eu01" +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *objectstorage.ApiDeleteComplianceLockRequest)) objectstorage.ApiDeleteComplianceLockRequest { + request := testClient.DefaultAPI.DeleteComplianceLock(testCtx, testProjectId, testRegion) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "project id invalid 1", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "" + }), + isValid: false, + }, + { + description: "project id invalid 2", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[globalflags.ProjectIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest objectstorage.ApiDeleteComplianceLockRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest, objectstorage.DefaultAPIService{}), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/object-storage/object_storage.go b/internal/cmd/object-storage/object_storage.go index 88358e0d8..1f4c11799 100644 --- a/internal/cmd/object-storage/object_storage.go +++ b/internal/cmd/object-storage/object_storage.go @@ -2,6 +2,7 @@ package objectstorage import ( "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/bucket" + complianceLock "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/compliance-lock" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials" credentialsGroup "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/credentials-group" "github.com/stackitcloud/stackit-cli/internal/cmd/object-storage/disable" @@ -31,4 +32,5 @@ func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(enable.NewCmd(params)) cmd.AddCommand(credentialsGroup.NewCmd(params)) cmd.AddCommand(credentials.NewCmd(params)) + cmd.AddCommand(complianceLock.NewCmd(params)) } From 5003626fd58401a56044cc5d7a6a6073ced92228 Mon Sep 17 00:00:00 2001 From: Sven Inter <102514411+s-inter@users.noreply.github.com> Date: Fri, 27 Mar 2026 11:17:52 +0100 Subject: [PATCH 415/422] feat: Add kms key options to secrets manager instance commands (#1347) * feat(secrets-manager): add KMS flags to create and update instance commands * feat(secrets-manager): implement request building with KMS key * feat(secrets-manager): enforce mutual exclusivity between ACL and KMS key flags * refactor(secrets-manager): refactor flag requirements to use cobra built-in validtion * feat(secrets-manager): add KMS key options examples for create and update commands * refactor(secrets-manager): change test data * feat(secrets-manager): add KMS key options to create and update instance tests * feat(secrets-manager): add KMS key details to instance output * feat(secrets-manager): add docs * fix(secrets-manager): include instance name in payload, as it is required * feat(secrets-manager): Support multiple API calls for instance update and ACL updates to align with create command * feat(secrets-manager): test new instance update features --- ...stackit_secrets-manager_instance_create.md | 13 +- ...stackit_secrets-manager_instance_update.md | 18 +- .../secrets-manager/instance/create/create.go | 45 +++- .../instance/create/create_test.go | 47 ++++ .../instance/describe/describe.go | 14 ++ .../instance/describe/describe_test.go | 16 ++ .../secrets-manager/instance/update/update.go | 110 ++++++-- .../instance/update/update_test.go | 238 ++++++++++++------ 8 files changed, 401 insertions(+), 100 deletions(-) diff --git a/docs/stackit_secrets-manager_instance_create.md b/docs/stackit_secrets-manager_instance_create.md index 379de7785..65108008a 100644 --- a/docs/stackit_secrets-manager_instance_create.md +++ b/docs/stackit_secrets-manager_instance_create.md @@ -18,14 +18,21 @@ stackit secrets-manager instance create [flags] Create a Secrets Manager instance with name "my-instance" and specify IP range which is allowed to access it $ stackit secrets-manager instance create --name my-instance --acl 1.2.3.0/24 + + Create a Secrets Manager instance with name "my-instance" and configure KMS key options + $ stackit secrets-manager instance create --name my-instance --kms-key-id key-id --kms-keyring-id keyring-id --kms-key-version 1 --kms-service-account-email my-service-account-1234567@sa.stackit.cloud ``` ### Options ``` - --acl strings List of IP networks in CIDR notation which are allowed to access this instance (default []) - -h, --help Help for "stackit secrets-manager instance create" - -n, --name string Instance name + --acl strings List of IP networks in CIDR notation which are allowed to access this instance (default []) + -h, --help Help for "stackit secrets-manager instance create" + --kms-key-id string ID of the KMS key to use for encryption + --kms-key-version int Version of the KMS key + --kms-keyring-id string ID of the KMS key ring + --kms-service-account-email string Service account email for KMS access + -n, --name string Instance name ``` ### Options inherited from parent commands diff --git a/docs/stackit_secrets-manager_instance_update.md b/docs/stackit_secrets-manager_instance_update.md index cf40d3c1a..c000c7cad 100644 --- a/docs/stackit_secrets-manager_instance_update.md +++ b/docs/stackit_secrets-manager_instance_update.md @@ -13,15 +13,29 @@ stackit secrets-manager instance update INSTANCE_ID [flags] ### Examples ``` + Update the name of a Secrets Manager instance with ID "xxx" + $ stackit secrets-manager instance update xxx --name my-new-name + Update the range of IPs allowed to access a Secrets Manager instance with ID "xxx" $ stackit secrets-manager instance update xxx --acl 1.2.3.0/24 + + Update the name and ACLs of a Secrets Manager instance with ID "xxx" + $ stackit secrets-manager instance update xxx --name my-new-name --acl 1.2.3.0/24 + + Update the KMS key settings of a Secrets Manager instance with ID "xxx" + $ stackit secrets-manager instance update xxx --name my-instance --kms-key-id key-id --kms-keyring-id keyring-id --kms-key-version 1 --kms-service-account-email my-service-account-1234567@sa.stackit.cloud ``` ### Options ``` - --acl strings List of IP networks in CIDR notation which are allowed to access this instance (default []) - -h, --help Help for "stackit secrets-manager instance update" + --acl strings List of IP networks in CIDR notation which are allowed to access this instance (default []) + -h, --help Help for "stackit secrets-manager instance update" + --kms-key-id string ID of the KMS key to use for encryption + --kms-key-version int Version of the KMS key + --kms-keyring-id string ID of the KMS key ring + --kms-service-account-email string Service account email for KMS access + -n, --name string Instance name ``` ### Options inherited from parent commands diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index 0c6d8420b..12e9b2099 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -23,6 +23,11 @@ import ( const ( instanceNameFlag = "name" aclFlag = "acl" + + kmsKeyIdFlag = "kms-key-id" + kmsKeyringIdFlag = "kms-keyring-id" + kmsKeyVersionFlag = "kms-key-version" + kmsServiceAccountEmailFlag = "kms-service-account-email" ) type inputModel struct { @@ -30,6 +35,11 @@ type inputModel struct { InstanceName *string Acls *[]string + + KmsKeyId *string + KmsKeyringId *string + KmsKeyVersion *int64 + KmsServiceAccountEmail *string } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -45,6 +55,9 @@ func NewCmd(params *types.CmdParams) *cobra.Command { examples.NewExample( `Create a Secrets Manager instance with name "my-instance" and specify IP range which is allowed to access it`, `$ stackit secrets-manager instance create --name my-instance --acl 1.2.3.0/24`), + examples.NewExample( + `Create a Secrets Manager instance with name "my-instance" and configure KMS key options`, + `$ stackit secrets-manager instance create --name my-instance --kms-key-id key-id --kms-keyring-id keyring-id --kms-key-version 1 --kms-service-account-email my-service-account-1234567@sa.stackit.cloud`), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -103,8 +116,15 @@ func configureFlags(cmd *cobra.Command) { cmd.Flags().StringP(instanceNameFlag, "n", "", "Instance name") cmd.Flags().Var(flags.CIDRSliceFlag(), aclFlag, "List of IP networks in CIDR notation which are allowed to access this instance") + cmd.Flags().String(kmsKeyIdFlag, "", "ID of the KMS key to use for encryption") + cmd.Flags().String(kmsKeyringIdFlag, "", "ID of the KMS key ring") + cmd.Flags().Int64(kmsKeyVersionFlag, 0, "Version of the KMS key") + cmd.Flags().String(kmsServiceAccountEmailFlag, "", "Service account email for KMS access") + err := flags.MarkFlagsRequired(cmd, instanceNameFlag) cobra.CheckErr(err) + + cmd.MarkFlagsRequiredTogether(kmsKeyIdFlag, kmsKeyringIdFlag, kmsKeyVersionFlag, kmsServiceAccountEmailFlag) } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { @@ -114,9 +134,13 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, } model := inputModel{ - GlobalFlagModel: globalFlags, - InstanceName: flags.FlagToStringPointer(p, cmd, instanceNameFlag), - Acls: flags.FlagToStringSlicePointer(p, cmd, aclFlag), + GlobalFlagModel: globalFlags, + InstanceName: flags.FlagToStringPointer(p, cmd, instanceNameFlag), + Acls: flags.FlagToStringSlicePointer(p, cmd, aclFlag), + KmsKeyId: flags.FlagToStringPointer(p, cmd, kmsKeyIdFlag), + KmsKeyringId: flags.FlagToStringPointer(p, cmd, kmsKeyringIdFlag), + KmsKeyVersion: flags.FlagToInt64Pointer(p, cmd, kmsKeyVersionFlag), + KmsServiceAccountEmail: flags.FlagToStringPointer(p, cmd, kmsServiceAccountEmailFlag), } p.DebugInputModel(model) @@ -126,9 +150,20 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, func buildCreateInstanceRequest(ctx context.Context, model *inputModel, apiClient *secretsmanager.APIClient) secretsmanager.ApiCreateInstanceRequest { req := apiClient.CreateInstance(ctx, model.ProjectId) - req = req.CreateInstancePayload(secretsmanager.CreateInstancePayload{ + payload := secretsmanager.CreateInstancePayload{ Name: model.InstanceName, - }) + } + + if model.KmsKeyId != nil { + payload.KmsKey = &secretsmanager.KmsKeyPayload{ + KeyId: model.KmsKeyId, + KeyRingId: model.KmsKeyringId, + KeyVersion: model.KmsKeyVersion, + ServiceAccountEmail: model.KmsServiceAccountEmail, + } + } + + req = req.CreateInstancePayload(payload) return req } diff --git a/internal/cmd/secrets-manager/instance/create/create_test.go b/internal/cmd/secrets-manager/instance/create/create_test.go index 4cef0d887..e4c6cedda 100644 --- a/internal/cmd/secrets-manager/instance/create/create_test.go +++ b/internal/cmd/secrets-manager/instance/create/create_test.go @@ -25,6 +25,13 @@ var testClient = &secretsmanager.APIClient{} var testProjectId = uuid.NewString() var testInstanceId = uuid.NewString() +const ( + testKmsKeyId = "key-id" + testKmsKeyringId = "keyring-id" + testKmsKeyVersion = int64(1) + testKmsServiceAccountEmail = "my-service-account-1234567@sa.stackit.cloud" +) + func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { flagValues := map[string]string{ projectIdFlag: testProjectId, @@ -162,6 +169,24 @@ func TestParseInput(t *testing.T) { *model.Acls = append(*model.Acls, "1.2.3.4/32") }), }, + { + description: "kms flags", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, aclFlag) + flagValues[kmsKeyIdFlag] = testKmsKeyId + flagValues[kmsKeyringIdFlag] = testKmsKeyringId + flagValues[kmsKeyVersionFlag] = "1" + flagValues[kmsServiceAccountEmailFlag] = testKmsServiceAccountEmail + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Acls = nil + model.KmsKeyId = utils.Ptr(testKmsKeyId) + model.KmsKeyringId = utils.Ptr(testKmsKeyringId) + model.KmsKeyVersion = utils.Ptr(testKmsKeyVersion) + model.KmsServiceAccountEmail = utils.Ptr(testKmsServiceAccountEmail) + }), + }, { description: "project id missing", flagValues: fixtureFlagValues(func(flagValues map[string]string) { @@ -205,6 +230,28 @@ func TestBuildCreateInstanceRequest(t *testing.T) { model: fixtureInputModel(), expectedRequest: fixtureRequest(), }, + { + description: "with kms", + model: fixtureInputModel(func(model *inputModel) { + model.Acls = nil + model.KmsKeyId = utils.Ptr(testKmsKeyId) + model.KmsKeyringId = utils.Ptr(testKmsKeyringId) + model.KmsKeyVersion = utils.Ptr(testKmsKeyVersion) + model.KmsServiceAccountEmail = utils.Ptr(testKmsServiceAccountEmail) + }), + expectedRequest: fixtureRequest(func(request *secretsmanager.ApiCreateInstanceRequest) { + payload := secretsmanager.CreateInstancePayload{ + Name: utils.Ptr("example"), + KmsKey: &secretsmanager.KmsKeyPayload{ + KeyId: utils.Ptr(testKmsKeyId), + KeyRingId: utils.Ptr(testKmsKeyringId), + KeyVersion: utils.Ptr(testKmsKeyVersion), + ServiceAccountEmail: utils.Ptr(testKmsServiceAccountEmail), + }, + } + *request = (*request).CreateInstancePayload(payload) + }), + }, } for _, tt := range tests { diff --git a/internal/cmd/secrets-manager/instance/describe/describe.go b/internal/cmd/secrets-manager/instance/describe/describe.go index bbd162bff..75c8cbd7c 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe.go +++ b/internal/cmd/secrets-manager/instance/describe/describe.go @@ -128,6 +128,17 @@ func outputResult(p *print.Printer, outputFormat string, instance *secretsmanage table.AddSeparator() table.AddRow("CREATION DATE", utils.PtrString(instance.CreationStartDate)) table.AddSeparator() + kmsKey := instance.KmsKey + showKms := kmsKey != nil && (kmsKey.KeyId != nil || kmsKey.KeyRingId != nil || kmsKey.KeyVersion != nil || kmsKey.ServiceAccountEmail != nil) + if showKms { + table.AddRow("KMS KEY ID", utils.PtrString(kmsKey.KeyId)) + table.AddSeparator() + table.AddRow("KMS KEYRING ID", utils.PtrString(kmsKey.KeyRingId)) + table.AddSeparator() + table.AddRow("KMS KEY VERSION", utils.PtrString(kmsKey.KeyVersion)) + table.AddSeparator() + table.AddRow("KMS SERVICE ACCOUNT EMAIL", utils.PtrString(kmsKey.ServiceAccountEmail)) + } // Only show ACL if it's present and not empty if aclList.Acls != nil && len(*aclList.Acls) > 0 { var cidrs []string @@ -136,6 +147,9 @@ func outputResult(p *print.Printer, outputFormat string, instance *secretsmanage cidrs = append(cidrs, *acl.Cidr) } + if showKms { + table.AddSeparator() + } table.AddRow("ACL", strings.Join(cidrs, ",")) } err := table.Display(p) diff --git a/internal/cmd/secrets-manager/instance/describe/describe_test.go b/internal/cmd/secrets-manager/instance/describe/describe_test.go index c1e3e0bb7..fb36f10bb 100644 --- a/internal/cmd/secrets-manager/instance/describe/describe_test.go +++ b/internal/cmd/secrets-manager/instance/describe/describe_test.go @@ -9,6 +9,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" @@ -247,6 +248,21 @@ func TestOutputResult(t *testing.T) { }, wantErr: false, }, + { + name: "instance with kms key", + args: args{ + instance: &secretsmanager.Instance{ + KmsKey: &secretsmanager.KmsKeyPayload{ + KeyId: utils.Ptr("key-id"), + KeyRingId: utils.Ptr("keyring-id"), + KeyVersion: utils.Ptr(int64(1)), + ServiceAccountEmail: utils.Ptr("my-service-account-1234567@sa.stackit.cloud"), + }, + }, + aclList: &secretsmanager.ListACLsResponse{}, + }, + wantErr: false, + }, } p := print.NewPrinter() p.Cmd = NewCmd(&types.CmdParams{Printer: p}) diff --git a/internal/cmd/secrets-manager/instance/update/update.go b/internal/cmd/secrets-manager/instance/update/update.go index 58786ffd6..0a066ec01 100644 --- a/internal/cmd/secrets-manager/instance/update/update.go +++ b/internal/cmd/secrets-manager/instance/update/update.go @@ -24,14 +24,26 @@ import ( const ( instanceIdArg = "INSTANCE_ID" - aclFlag = "acl" + instanceNameFlag = "name" + aclFlag = "acl" + + kmsKeyIdFlag = "kms-key-id" + kmsKeyringIdFlag = "kms-keyring-id" + kmsKeyVersionFlag = "kms-key-version" + kmsServiceAccountEmailFlag = "kms-service-account-email" ) type inputModel struct { *globalflags.GlobalFlagModel InstanceId string - Acls *[]string + InstanceName *string + Acls *[]string + + KmsKeyId *string + KmsKeyringId *string + KmsKeyVersion *int64 + KmsServiceAccountEmail *string } func NewCmd(params *types.CmdParams) *cobra.Command { @@ -41,9 +53,18 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Long: "Updates a Secrets Manager instance.", Args: args.SingleArg(instanceIdArg, utils.ValidateUUID), Example: examples.Build( + examples.NewExample( + `Update the name of a Secrets Manager instance with ID "xxx"`, + "$ stackit secrets-manager instance update xxx --name my-new-name"), examples.NewExample( `Update the range of IPs allowed to access a Secrets Manager instance with ID "xxx"`, "$ stackit secrets-manager instance update xxx --acl 1.2.3.0/24"), + examples.NewExample( + `Update the name and ACLs of a Secrets Manager instance with ID "xxx"`, + "$ stackit secrets-manager instance update xxx --name my-new-name --acl 1.2.3.0/24"), + examples.NewExample( + `Update the KMS key settings of a Secrets Manager instance with ID "xxx"`, + "$ stackit secrets-manager instance update xxx --name my-instance --kms-key-id key-id --kms-keyring-id keyring-id --kms-key-version 1 --kms-service-account-email my-service-account-1234567@sa.stackit.cloud"), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -58,26 +79,42 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return err } - instanceLabel, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) + existingInstanceName, err := secretsManagerUtils.GetInstanceName(ctx, apiClient, model.ProjectId, model.InstanceId) if err != nil { params.Printer.Debug(print.ErrorLevel, "get instance name: %v", err) - instanceLabel = model.InstanceId + existingInstanceName = model.InstanceId } - prompt := fmt.Sprintf("Are you sure you want to update instance %q?", instanceLabel) + prompt := fmt.Sprintf("Are you sure you want to update instance %q?", existingInstanceName) err = params.Printer.PromptForConfirmation(prompt) if err != nil { return err } - // Call API - req := buildRequest(ctx, model, apiClient) - err = req.Execute() - if err != nil { - return fmt.Errorf("update Secrets Manager instance: %w", err) + // Call API - execute UpdateInstance and/or UpdateACLs based on flags + if model.InstanceName != nil { + req := buildUpdateInstanceRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + return fmt.Errorf("update Secrets Manager instance: %w", err) + } } - params.Printer.Info("Updated instance %q\n", instanceLabel) + if model.Acls != nil { + req := buildUpdateACLsRequest(ctx, model, apiClient) + err = req.Execute() + if err != nil { + if model.InstanceName != nil { + return fmt.Errorf(`the Secrets Manager instance was successfully updated, but the configuration of the ACLs failed. + +If you want to retry configuring the ACLs, you can do it via: + $ stackit secrets-manager instance update %s --acl %s`, model.InstanceId, *model.Acls) + } + return fmt.Errorf("update Secrets Manager instance ACLs: %w", err) + } + } + + params.Printer.Info("Updated instance %q\n", existingInstanceName) return nil }, } @@ -86,7 +123,16 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } func configureFlags(cmd *cobra.Command) { + cmd.Flags().StringP(instanceNameFlag, "n", "", "Instance name") cmd.Flags().Var(flags.CIDRSliceFlag(), aclFlag, "List of IP networks in CIDR notation which are allowed to access this instance") + + cmd.Flags().String(kmsKeyIdFlag, "", "ID of the KMS key to use for encryption") + cmd.Flags().String(kmsKeyringIdFlag, "", "ID of the KMS key ring") + cmd.Flags().Int64(kmsKeyVersionFlag, 0, "Version of the KMS key") + cmd.Flags().String(kmsServiceAccountEmailFlag, "", "Service account email for KMS access") + + cmd.MarkFlagsRequiredTogether(kmsKeyIdFlag, kmsKeyringIdFlag, kmsKeyVersionFlag, kmsServiceAccountEmailFlag) + cmd.MarkFlagsOneRequired(aclFlag, instanceNameFlag) } func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { @@ -97,23 +143,47 @@ func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inpu return nil, &cliErr.ProjectIdError{} } - acls := flags.FlagToStringSlicePointer(p, cmd, aclFlag) - - if acls == nil { - return nil, &cliErr.EmptyUpdateError{} + model := inputModel{ + GlobalFlagModel: globalFlags, + InstanceId: instanceId, + InstanceName: flags.FlagToStringPointer(p, cmd, instanceNameFlag), + Acls: flags.FlagToStringSlicePointer(p, cmd, aclFlag), + KmsKeyId: flags.FlagToStringPointer(p, cmd, kmsKeyIdFlag), + KmsKeyringId: flags.FlagToStringPointer(p, cmd, kmsKeyringIdFlag), + KmsKeyVersion: flags.FlagToInt64Pointer(p, cmd, kmsKeyVersionFlag), + KmsServiceAccountEmail: flags.FlagToStringPointer(p, cmd, kmsServiceAccountEmailFlag), } - model := inputModel{ - GlobalFlagModel: globalFlags, - InstanceId: instanceId, - Acls: acls, + if model.KmsKeyId != nil && model.InstanceName == nil { + return nil, fmt.Errorf("--name is required when using KMS flags") } p.DebugInputModel(model) return &model, nil } -func buildRequest(ctx context.Context, model *inputModel, apiClient *secretsmanager.APIClient) secretsmanager.ApiUpdateACLsRequest { +func buildUpdateInstanceRequest(ctx context.Context, model *inputModel, apiClient *secretsmanager.APIClient) secretsmanager.ApiUpdateInstanceRequest { + req := apiClient.UpdateInstance(ctx, model.ProjectId, model.InstanceId) + + payload := secretsmanager.UpdateInstancePayload{ + Name: model.InstanceName, + } + + if model.KmsKeyId != nil { + payload.KmsKey = &secretsmanager.KmsKeyPayload{ + KeyId: model.KmsKeyId, + KeyRingId: model.KmsKeyringId, + KeyVersion: model.KmsKeyVersion, + ServiceAccountEmail: model.KmsServiceAccountEmail, + } + } + + req = req.UpdateInstancePayload(payload) + + return req +} + +func buildUpdateACLsRequest(ctx context.Context, model *inputModel, apiClient *secretsmanager.APIClient) secretsmanager.ApiUpdateACLsRequest { req := apiClient.UpdateACLs(ctx, model.ProjectId, model.InstanceId) cidrs := []secretsmanager.UpdateACLPayload{} diff --git a/internal/cmd/secrets-manager/instance/update/update_test.go b/internal/cmd/secrets-manager/instance/update/update_test.go index 24e14d1fb..02a2641b3 100644 --- a/internal/cmd/secrets-manager/instance/update/update_test.go +++ b/internal/cmd/secrets-manager/instance/update/update_test.go @@ -4,10 +4,8 @@ import ( "context" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp" @@ -33,6 +31,14 @@ var ( testInstanceId = uuid.NewString() ) +const ( + testInstanceName = "test-instance" + testKmsKeyId = "key-id" + testKmsKeyringId = "keyring-id" + testKmsKeyVersion = int64(1) + testKmsServiceAccountEmail = "my-service-account-1234567@sa.stackit.cloud" +) + func fixtureArgValues(mods ...func(argValues []string)) []string { argValues := []string{ testInstanceId, @@ -82,6 +88,24 @@ func fixtureRequest(mods ...func(request *secretsmanager.ApiUpdateACLsRequest)) return request } +func fixtureUpdateInstanceRequest(mods ...func(request *secretsmanager.ApiUpdateInstanceRequest)) secretsmanager.ApiUpdateInstanceRequest { + request := testClient.UpdateInstance(testCtx, testProjectId, testInstanceId) + request = request.UpdateInstancePayload(secretsmanager.UpdateInstancePayload{ + Name: utils.Ptr(testInstanceName), + KmsKey: &secretsmanager.KmsKeyPayload{ + KeyId: utils.Ptr(testKmsKeyId), + KeyRingId: utils.Ptr(testKmsKeyringId), + KeyVersion: utils.Ptr(testKmsKeyVersion), + ServiceAccountEmail: utils.Ptr(testKmsServiceAccountEmail), + }, + }) + + for _, mod := range mods { + mod(&request) + } + return request +} + func TestParseInput(t *testing.T) { tests := []struct { description string @@ -111,13 +135,7 @@ func TestParseInput(t *testing.T) { isValid: false, }, { - description: "no flag values", - argValues: fixtureArgValues(), - flagValues: map[string]string{}, - isValid: false, - }, - { - description: "required flags only (no values to update)", + description: "no update flags", argValues: fixtureArgValues(), flagValues: map[string]string{ projectIdFlag: testProjectId, @@ -172,6 +190,27 @@ func TestParseInput(t *testing.T) { flagValues: fixtureFlagValues(), isValid: false, }, + { + description: "kms key id without other required kms flags", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + projectIdFlag: testProjectId, + kmsKeyIdFlag: "key-id", + }, + isValid: false, + }, + { + description: "kms flags without name flag", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + projectIdFlag: testProjectId, + kmsKeyIdFlag: "key-id", + kmsKeyringIdFlag: "keyring-id", + kmsKeyVersionFlag: "1", + kmsServiceAccountEmailFlag: "my-service-account-1234567@sa.stackit.cloud", + }, + isValid: false, + }, { description: "repeated acl flags", argValues: fixtureArgValues(), @@ -195,72 +234,85 @@ func TestParseInput(t *testing.T) { ) }), }, + { + description: "name flag only", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + projectIdFlag: testProjectId, + instanceNameFlag: "updated-name", + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Acls = nil + model.InstanceName = utils.Ptr("updated-name") + }), + }, + { + description: "name and acl flags", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + projectIdFlag: testProjectId, + instanceNameFlag: testInstanceName, + aclFlag: testACL1, + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.InstanceName = utils.Ptr(testInstanceName) + }), + }, + { + description: "kms flags with name", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + projectIdFlag: testProjectId, + instanceNameFlag: testInstanceName, + kmsKeyIdFlag: testKmsKeyId, + kmsKeyringIdFlag: testKmsKeyringId, + kmsKeyVersionFlag: "1", + kmsServiceAccountEmailFlag: testKmsServiceAccountEmail, + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Acls = nil + model.InstanceName = utils.Ptr(testInstanceName) + model.KmsKeyId = utils.Ptr(testKmsKeyId) + model.KmsKeyringId = utils.Ptr(testKmsKeyringId) + model.KmsKeyVersion = utils.Ptr(testKmsKeyVersion) + model.KmsServiceAccountEmail = utils.Ptr(testKmsServiceAccountEmail) + }), + }, + { + description: "name, acl and kms flags together", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + projectIdFlag: testProjectId, + instanceNameFlag: testInstanceName, + aclFlag: testACL1, + kmsKeyIdFlag: testKmsKeyId, + kmsKeyringIdFlag: testKmsKeyringId, + kmsKeyVersionFlag: "1", + kmsServiceAccountEmailFlag: testKmsServiceAccountEmail, + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.InstanceName = utils.Ptr(testInstanceName) + model.KmsKeyId = utils.Ptr(testKmsKeyId) + model.KmsKeyringId = utils.Ptr(testKmsKeyringId) + model.KmsKeyVersion = utils.Ptr(testKmsKeyVersion) + model.KmsServiceAccountEmail = utils.Ptr(testKmsServiceAccountEmail) + }), + }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - p := print.NewPrinter() - cmd := NewCmd(&types.CmdParams{Printer: p}) - err := globalflags.Configure(cmd.Flags()) - if err != nil { - t.Fatalf("configure global flags: %v", err) - } - - for flag, value := range tt.flagValues { - err := cmd.Flags().Set(flag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", flag, value, err) - } - } - - for _, value := range tt.aclValues { - err := cmd.Flags().Set(aclFlag, value) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("setting flag --%s=%s: %v", aclFlag, value, err) - } - } - - err = cmd.ValidateArgs(tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating args: %v", err) - } - - err = cmd.ValidateRequiredFlags() - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error validating flags: %v", err) - } - - model, err := parseInput(p, cmd, tt.argValues) - if err != nil { - if !tt.isValid { - return - } - t.Fatalf("error parsing flags: %v", err) - } - - if !tt.isValid { - t.Fatalf("did not fail on invalid input") - } - diff := cmp.Diff(model, tt.expectedModel) - if diff != "" { - t.Fatalf("Data does not match: %s", diff) - } + testutils.TestParseInputWithAdditionalFlags(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, map[string][]string{ + aclFlag: tt.aclValues, + }, tt.isValid) }) } } -func TestBuildRequest(t *testing.T) { +func TestBuildUpdateACLsRequest(t *testing.T) { tests := []struct { description string model *inputModel @@ -286,7 +338,53 @@ func TestBuildRequest(t *testing.T) { for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { - request := buildRequest(testCtx, tt.model, testClient) + request := buildUpdateACLsRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestBuildUpdateInstanceRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest secretsmanager.ApiUpdateInstanceRequest + }{ + { + description: "with name only", + model: fixtureInputModel(func(model *inputModel) { + model.Acls = nil + model.InstanceName = utils.Ptr(testInstanceName) + }), + expectedRequest: testClient.UpdateInstance(testCtx, testProjectId, testInstanceId). + UpdateInstancePayload(secretsmanager.UpdateInstancePayload{ + Name: utils.Ptr(testInstanceName), + }), + }, + { + description: "with KMS settings", + model: fixtureInputModel(func(model *inputModel) { + model.Acls = nil + model.InstanceName = utils.Ptr(testInstanceName) + model.KmsKeyId = utils.Ptr(testKmsKeyId) + model.KmsKeyringId = utils.Ptr(testKmsKeyringId) + model.KmsKeyVersion = utils.Ptr(testKmsKeyVersion) + model.KmsServiceAccountEmail = utils.Ptr(testKmsServiceAccountEmail) + }), + expectedRequest: fixtureUpdateInstanceRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildUpdateInstanceRequest(testCtx, tt.model, testClient) diff := cmp.Diff(request, tt.expectedRequest, cmp.AllowUnexported(tt.expectedRequest), From 304da3629267c5118fb517be1b643ddc8e04ecee Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Fri, 27 Mar 2026 11:21:58 +0100 Subject: [PATCH 416/422] fix(cli) stop spinner on error (#1350) Most usages of spinner did not stop the spinner on error. Introduced helper functions Run and Run2 (result arity 2) to make correct spinner usage easier. Refactored spinner usages to use new helper funcs. relates to STACKITCLI-310 --- internal/cmd/beta/alb/create/create.go | 8 ++--- internal/cmd/beta/alb/update/update.go | 10 +++--- .../cmd/beta/edge/instance/create/create.go | 19 ++++++------ .../cmd/beta/edge/instance/delete/delete.go | 29 ++++++++--------- .../cmd/beta/edge/instance/update/update.go | 29 ++++++++--------- internal/cmd/beta/intake/create/create.go | 8 ++--- internal/cmd/beta/intake/delete/delete.go | 8 ++--- .../cmd/beta/intake/runner/create/create.go | 8 ++--- .../cmd/beta/intake/runner/delete/delete.go | 8 ++--- .../cmd/beta/intake/runner/update/update.go | 8 ++--- internal/cmd/beta/intake/update/update.go | 8 ++--- .../beta/sfs/resource-pool/create/create.go | 8 ++--- .../beta/sfs/resource-pool/delete/delete.go | 8 ++--- .../beta/sfs/resource-pool/update/update.go | 8 ++--- internal/cmd/beta/sfs/share/create/create.go | 8 ++--- internal/cmd/beta/sfs/share/delete/delete.go | 8 ++--- internal/cmd/beta/sfs/share/update/update.go | 8 ++--- .../sqlserverflex/database/create/create.go | 8 ++--- .../sqlserverflex/database/delete/delete.go | 9 +++--- .../sqlserverflex/instance/create/create.go | 8 ++--- .../sqlserverflex/instance/delete/delete.go | 8 ++--- .../sqlserverflex/instance/update/update.go | 8 ++--- internal/cmd/dns/record-set/create/create.go | 10 +++--- internal/cmd/dns/record-set/delete/delete.go | 8 ++--- internal/cmd/dns/record-set/update/update.go | 8 ++--- internal/cmd/dns/zone/clone/clone.go | 8 ++--- internal/cmd/dns/zone/create/create.go | 8 ++--- internal/cmd/dns/zone/delete/delete.go | 8 ++--- internal/cmd/dns/zone/update/update.go | 8 ++--- internal/cmd/git/instance/create/create.go | 8 ++--- internal/cmd/git/instance/delete/delete.go | 8 ++--- internal/cmd/kms/key/create/create.go | 8 ++--- internal/cmd/kms/keyring/create/create.go | 8 ++--- internal/cmd/kms/version/disable/disable.go | 8 ++--- internal/cmd/kms/version/enable/enable.go | 8 ++--- internal/cmd/kms/wrappingkey/create/create.go | 8 ++--- internal/cmd/load-balancer/create/create.go | 8 ++--- internal/cmd/load-balancer/delete/delete.go | 8 ++--- internal/cmd/logme/instance/create/create.go | 8 ++--- internal/cmd/logme/instance/delete/delete.go | 8 ++--- internal/cmd/logme/instance/update/update.go | 8 ++--- internal/cmd/logs/instance/create/create.go | 8 ++--- internal/cmd/logs/instance/delete/delete.go | 8 ++--- .../cmd/mariadb/instance/create/create.go | 8 ++--- .../cmd/mariadb/instance/delete/delete.go | 8 ++--- .../cmd/mariadb/instance/update/update.go | 8 ++--- .../cmd/mongodbflex/backup/restore/restore.go | 16 +++++----- .../cmd/mongodbflex/instance/create/create.go | 8 ++--- .../cmd/mongodbflex/instance/delete/delete.go | 8 ++--- .../cmd/mongodbflex/instance/update/update.go | 8 ++--- internal/cmd/network-area/create/create.go | 8 ++--- .../cmd/network-area/region/create/create.go | 8 ++--- .../cmd/network-area/region/delete/delete.go | 8 ++--- internal/cmd/network/create/create.go | 9 +++--- internal/cmd/network/delete/delete.go | 8 ++--- internal/cmd/network/update/update.go | 9 +++--- .../object-storage/bucket/create/create.go | 8 ++--- .../object-storage/bucket/delete/delete.go | 8 ++--- .../observability/instance/create/create.go | 8 ++--- .../observability/instance/delete/delete.go | 8 ++--- .../observability/instance/update/update.go | 8 ++--- .../scrape-config/create/create.go | 8 ++--- .../scrape-config/delete/delete.go | 8 ++--- .../cmd/opensearch/instance/create/create.go | 8 ++--- .../cmd/opensearch/instance/delete/delete.go | 8 ++--- .../cmd/opensearch/instance/update/update.go | 8 ++--- .../cmd/postgresflex/instance/clone/clone.go | 8 ++--- .../postgresflex/instance/create/create.go | 8 ++--- .../postgresflex/instance/delete/delete.go | 16 +++++----- .../postgresflex/instance/update/update.go | 8 ++--- .../cmd/rabbitmq/instance/create/create.go | 8 ++--- .../cmd/rabbitmq/instance/delete/delete.go | 8 ++--- .../cmd/rabbitmq/instance/update/update.go | 8 ++--- internal/cmd/redis/instance/create/create.go | 8 ++--- internal/cmd/redis/instance/delete/delete.go | 8 ++--- internal/cmd/redis/instance/update/update.go | 8 ++--- internal/cmd/server/create/create.go | 8 ++--- internal/cmd/server/deallocate/deallocate.go | 8 ++--- internal/cmd/server/delete/delete.go | 13 ++++---- internal/cmd/server/rescue/rescue.go | 8 ++--- internal/cmd/server/resize/resize.go | 8 ++--- internal/cmd/server/start/start.go | 8 ++--- internal/cmd/server/stop/stop.go | 8 ++--- internal/cmd/server/unrescue/unrescue.go | 8 ++--- internal/cmd/ske/cluster/create/create.go | 8 ++--- internal/cmd/ske/cluster/delete/delete.go | 8 ++--- .../cmd/ske/cluster/hibernate/hibernate.go | 10 +++--- .../ske/cluster/maintenance/maintenance.go | 8 ++--- .../cmd/ske/cluster/reconcile/reconcile.go | 8 ++--- internal/cmd/ske/cluster/update/update.go | 8 ++--- internal/cmd/ske/cluster/wakeup/wakeup.go | 8 ++--- .../complete-rotation/complete_rotation.go | 8 ++--- .../start-rotation/start_rotation.go | 8 ++--- internal/cmd/ske/disable/disable.go | 8 ++--- internal/cmd/ske/enable/enable.go | 8 ++--- internal/cmd/volume/backup/create/create.go | 7 ++--- internal/cmd/volume/backup/delete/delete.go | 8 ++--- internal/cmd/volume/backup/restore/restore.go | 8 ++--- internal/cmd/volume/create/create.go | 8 ++--- internal/cmd/volume/delete/delete.go | 8 ++--- internal/cmd/volume/snapshot/create/create.go | 7 ++--- internal/cmd/volume/snapshot/delete/delete.go | 8 ++--- internal/pkg/spinner/spinner.go | 31 ++++++++++++++++--- 103 files changed, 472 insertions(+), 456 deletions(-) diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index 2232d7aad..ddd1a1a0d 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -84,13 +84,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating loadbalancer") - _, err = wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Name).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating loadbalancer", func() error { + _, err := wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Name).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for loadbalancer creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 1221cba4f..910c78773 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -90,14 +90,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("updating loadbalancer") - _, err = wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Name). - WaitWithContext(ctx) + err := spinner.Run(params.Printer, "updating loadbalancer", func() error { + _, err = wait.CreateOrUpdateLoadbalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Name). + WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for loadbalancer update: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/edge/instance/create/create.go b/internal/cmd/beta/edge/instance/create/create.go index 72f7ec2d2..b6b3d4e7c 100755 --- a/internal/cmd/beta/edge/instance/create/create.go +++ b/internal/cmd/beta/edge/instance/create/create.go @@ -87,19 +87,18 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - // The waiter handler needs a concrete client type. We can safely cast here as the real implementation will always match. - client, ok := apiClient.(*edge.APIClient) - if !ok { - return fmt.Errorf("failed to configure API client") - } - _, err = wait.CreateOrUpdateInstanceWaitHandler(ctx, client, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) - + err := spinner.Run(params.Printer, "Creating instance", func() error { + // The waiter handler needs a concrete concreteClient type. We can safely cast here as the real implementation will always match. + concreteClient, ok := apiClient.(*edge.APIClient) + if !ok { + return fmt.Errorf("failed to configure API concreteClient") + } + _, err = wait.CreateOrUpdateInstanceWaitHandler(ctx, concreteClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for edge instance creation: %w", err) } - s.Stop() } // Handle output to printer diff --git a/internal/cmd/beta/edge/instance/delete/delete.go b/internal/cmd/beta/edge/instance/delete/delete.go index d6650e7e6..4bf5e44ad 100755 --- a/internal/cmd/beta/edge/instance/delete/delete.go +++ b/internal/cmd/beta/edge/instance/delete/delete.go @@ -110,25 +110,26 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled operationState := "Triggered deletion of" if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - // Determine identifier and waiter to use - waiterFactory, err := getWaiterFactory(ctx, model) - if err != nil { + err := spinner.Run(params.Printer, "Deleting instance", func() error { + // Determine identifier and waiter to use + waiterFactory, err := getWaiterFactory(ctx, model) + if err != nil { + return err + } + // The waiter factory needs a concrete concreteClient type. We can safely cast here as the real implementation will always match. + concreteClient, ok := apiClient.(*edge.APIClient) + if !ok { + return fmt.Errorf("failed to configure API concreteClient") + } + waiter := waiterFactory(concreteClient) + _, err = waiter.WaitWithContext(ctx) return err - } - // The waiter factory needs a concrete client type. We can safely cast here as the real implementation will always match. - client, ok := apiClient.(*edge.APIClient) - if !ok { - return fmt.Errorf("failed to configure API client") - } - waiter := waiterFactory(client) + }) - if _, err = waiter.WaitWithContext(ctx); err != nil { + if err != nil { return fmt.Errorf("wait for edge instance deletion: %w", err) } operationState = "Deleted" - s.Stop() } params.Printer.Info("%s instance with %q %q of project %q.\n", operationState, model.identifier.Flag, model.identifier.Value, projectLabel) diff --git a/internal/cmd/beta/edge/instance/update/update.go b/internal/cmd/beta/edge/instance/update/update.go index 28ec3437a..4faf512ef 100755 --- a/internal/cmd/beta/edge/instance/update/update.go +++ b/internal/cmd/beta/edge/instance/update/update.go @@ -120,25 +120,26 @@ func NewCmd(params *types.CmdParams) *cobra.Command { if !model.Async { // Wait for async operation, if async mode not enabled // Show spinner while waiting - s := spinner.New(params.Printer) - s.Start("Updating instance") - // Determine identifier and waiter to use - waiterFactory, err := getWaiterFactory(ctx, model) - if err != nil { + err := spinner.Run(params.Printer, "Updating instance", func() error { + // Determine identifier and waiter to use + waiterFactory, err := getWaiterFactory(ctx, model) + if err != nil { + return err + } + // The waiter handler needs a concrete concreteClient type. We can safely cast here as the real implementation will always match. + concreteClient, ok := apiClient.(*edge.APIClient) + if !ok { + return fmt.Errorf("failed to configure API concreteClient") + } + waiter := waiterFactory(concreteClient) + _, err = waiter.WaitWithContext(ctx) return err - } - // The waiter handler needs a concrete client type. We can safely cast here as the real implementation will always match. - client, ok := apiClient.(*edge.APIClient) - if !ok { - return fmt.Errorf("failed to configure API client") - } - waiter := waiterFactory(client) + }) - if _, err = waiter.WaitWithContext(ctx); err != nil { + if err != nil { return fmt.Errorf("wait for edge instance update: %w", err) } operationState = "Updated" - s.Stop() } params.Printer.Info("%s instance with %q %q of project %q.\n", operationState, model.identifier.Flag, model.identifier.Value, projectLabel) diff --git a/internal/cmd/beta/intake/create/create.go b/internal/cmd/beta/intake/create/create.go index 820e13b90..4ce75fd94 100644 --- a/internal/cmd/beta/intake/create/create.go +++ b/internal/cmd/beta/intake/create/create.go @@ -111,13 +111,13 @@ func NewCmd(p *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p.Printer) - s.Start("Creating STACKIT Intake instance") - _, err = wait.CreateOrUpdateIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resp.GetId()).WaitWithContext(ctx) + err := spinner.Run(p.Printer, "Creating STACKIT Intake instance", func() error { + _, err = wait.CreateOrUpdateIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resp.GetId()).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for STACKIT Instance creation: %w", err) } - s.Stop() } return outputResult(p.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/intake/delete/delete.go b/internal/cmd/beta/intake/delete/delete.go index b55d9997e..6aeb77ee2 100644 --- a/internal/cmd/beta/intake/delete/delete.go +++ b/internal/cmd/beta/intake/delete/delete.go @@ -68,13 +68,13 @@ func NewCmd(p *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p.Printer) - s.Start("Deleting STACKIT Intake instance") - _, err = wait.DeleteIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId).WaitWithContext(ctx) + err := spinner.Run(p.Printer, "Deleting STACKIT Intake instance", func() error { + _, err = wait.DeleteIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for STACKIT Instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/beta/intake/runner/create/create.go b/internal/cmd/beta/intake/runner/create/create.go index 72cff3b29..b64a116f9 100644 --- a/internal/cmd/beta/intake/runner/create/create.go +++ b/internal/cmd/beta/intake/runner/create/create.go @@ -88,13 +88,13 @@ func NewCmd(p *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p.Printer) - s.Start("Creating STACKIT Intake Runner") - _, err = wait.CreateOrUpdateIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resp.GetId()).WaitWithContext(ctx) + err := spinner.Run(p.Printer, "Creating STACKIT Intake Runner", func() error { + _, err = wait.CreateOrUpdateIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resp.GetId()).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for STACKIT Intake Runner creation: %w", err) } - s.Stop() } return outputResult(p.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/intake/runner/delete/delete.go b/internal/cmd/beta/intake/runner/delete/delete.go index 92d5b1acf..a8f3d6a88 100644 --- a/internal/cmd/beta/intake/runner/delete/delete.go +++ b/internal/cmd/beta/intake/runner/delete/delete.go @@ -68,13 +68,13 @@ func NewCmd(p *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p.Printer) - s.Start("Deleting STACKIT Intake Runner") - _, err = wait.DeleteIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.RunnerId).WaitWithContext(ctx) + err := spinner.Run(p.Printer, "Deleting STACKIT Intake Runner", func() error { + _, err = wait.DeleteIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.RunnerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for STACKIT Intake Runner deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/beta/intake/runner/update/update.go b/internal/cmd/beta/intake/runner/update/update.go index a5f5bb55a..bd2c637e9 100644 --- a/internal/cmd/beta/intake/runner/update/update.go +++ b/internal/cmd/beta/intake/runner/update/update.go @@ -86,13 +86,13 @@ func NewCmd(p *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p.Printer) - s.Start("Updating STACKIT Intake Runner") - _, err = wait.CreateOrUpdateIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.RunnerId).WaitWithContext(ctx) + err := spinner.Run(p.Printer, "Updating STACKIT Intake Runner", func() error { + _, err = wait.CreateOrUpdateIntakeRunnerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.RunnerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for STACKIT Intake Runner update: %w", err) } - s.Stop() } return outputResult(p.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/intake/update/update.go b/internal/cmd/beta/intake/update/update.go index e531e2c91..c21640e5d 100644 --- a/internal/cmd/beta/intake/update/update.go +++ b/internal/cmd/beta/intake/update/update.go @@ -106,13 +106,13 @@ func NewCmd(p *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(p.Printer) - s.Start("Updating STACKIT Intake Runner instance") - _, err = wait.CreateOrUpdateIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId).WaitWithContext(ctx) + err := spinner.Run(p.Printer, "Updating STACKIT Intake Runner instance", func() error { + _, err = wait.CreateOrUpdateIntakeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for STACKIT Instance creation: %w", err) } - s.Stop() } return outputResult(p.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/sfs/resource-pool/create/create.go b/internal/cmd/beta/sfs/resource-pool/create/create.go index 8df0145a2..526ef296f 100644 --- a/internal/cmd/beta/sfs/resource-pool/create/create.go +++ b/internal/cmd/beta/sfs/resource-pool/create/create.go @@ -100,13 +100,13 @@ The available performance class values can be obtained by running: // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Create resource pool") - _, err = wait.CreateResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resourcePoolId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Create resource pool", func() error { + _, err = wait.CreateResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, resourcePoolId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for resource pool creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete.go b/internal/cmd/beta/sfs/resource-pool/delete/delete.go index 105dd37af..17f8a6187 100644 --- a/internal/cmd/beta/sfs/resource-pool/delete/delete.go +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete.go @@ -73,13 +73,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Delete resource pool") - _, err = wait.DeleteResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Delete resource pool", func() error { + _, err = wait.DeleteResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for resource pool deletion: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, resourcePoolName, resp) diff --git a/internal/cmd/beta/sfs/resource-pool/update/update.go b/internal/cmd/beta/sfs/resource-pool/update/update.go index 82d54f6cd..4c471440f 100644 --- a/internal/cmd/beta/sfs/resource-pool/update/update.go +++ b/internal/cmd/beta/sfs/resource-pool/update/update.go @@ -101,13 +101,13 @@ The available performance class values can be obtained by running: // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Update resource pool") - _, err = wait.UpdateResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Update resource pool", func() error { + _, err = wait.UpdateResourcePoolWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for resource pool update: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, resp) diff --git a/internal/cmd/beta/sfs/share/create/create.go b/internal/cmd/beta/sfs/share/create/create.go index c2b2246b8..b455f173d 100644 --- a/internal/cmd/beta/sfs/share/create/create.go +++ b/internal/cmd/beta/sfs/share/create/create.go @@ -91,13 +91,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating share") - _, err = wait.CreateShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, shareId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating share", func() error { + _, err = wait.CreateShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, shareId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("waiting for share creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, resourcePoolLabel, resp) diff --git a/internal/cmd/beta/sfs/share/delete/delete.go b/internal/cmd/beta/sfs/share/delete/delete.go index aed603d52..1b98b0473 100644 --- a/internal/cmd/beta/sfs/share/delete/delete.go +++ b/internal/cmd/beta/sfs/share/delete/delete.go @@ -80,13 +80,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting share") - _, err = wait.DeleteShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting share", func() error { + _, err = wait.DeleteShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("waiting for share deletion: %w", err) } - s.Stop() } operation := "Deleted" diff --git a/internal/cmd/beta/sfs/share/update/update.go b/internal/cmd/beta/sfs/share/update/update.go index 7f368fa3d..785d672cc 100644 --- a/internal/cmd/beta/sfs/share/update/update.go +++ b/internal/cmd/beta/sfs/share/update/update.go @@ -96,13 +96,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating share") - _, err = wait.UpdateShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating share", func() error { + _, err = wait.UpdateShareWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ResourcePoolId, model.ShareId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("waiting for share update: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, resourcePoolLabel, resp) diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index 9a2b8c2e0..00ae39bf2 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -68,14 +68,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Call API req := buildRequest(ctx, model, apiClient) - s := spinner.New(params.Printer) - s.Start("Creating database") - resp, err := req.Execute() + resp, err := spinner.Run2(params.Printer, "Creating database", func() (*sqlserverflex.CreateDatabaseResponse, error) { + return req.Execute() + }) if err != nil { - s.StopWithError() return fmt.Errorf("create SQLServer Flex database: %w", err) } - s.Stop() return outputResult(params.Printer, model.OutputFormat, model.DatabaseName, resp) }, diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete.go b/internal/cmd/beta/sqlserverflex/database/delete/delete.go index 3408cc85d..ae8148ec2 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete.go @@ -66,14 +66,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Call API req := buildRequest(ctx, model, apiClient) - s := spinner.New(params.Printer) - s.Start("Deleting database") - err = req.Execute() + err = spinner.Run(params.Printer, "Deleting database", func() error { + err := req.Execute() + return err + }) if err != nil { - s.StopWithError() return fmt.Errorf("delete SQLServer Flex database: %w", err) } - s.Stop() params.Printer.Info("Deleted database %q\n", model.DatabaseName) return nil diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create.go b/internal/cmd/beta/sqlserverflex/instance/create/create.go index 4cc0469e5..34499a3bc 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create.go @@ -122,13 +122,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SQLServer Flex instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, resp) diff --git a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go index 74840b4db..429dbb364 100644 --- a/internal/cmd/beta/sqlserverflex/instance/delete/delete.go +++ b/internal/cmd/beta/sqlserverflex/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SQLServer Flex instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update.go b/internal/cmd/beta/sqlserverflex/instance/update/update.go index 81a4b5008..3a5c497b8 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update.go @@ -113,13 +113,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SQLServer Flex instance update: %w", err) } - s.Stop() } return outputResult(params.Printer, model, instanceLabel, resp) diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index 2687b34da..ef20922b5 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/dns/wait" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" @@ -18,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/dns" - "github.com/stackitcloud/stackit-sdk-go/services/dns/wait" ) const ( @@ -89,13 +89,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating record set") - _, err = wait.CreateRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, recordSetId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating record set", func() error { + _, err = wait.CreateRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, recordSetId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS record set creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, zoneLabel, resp) diff --git a/internal/cmd/dns/record-set/delete/delete.go b/internal/cmd/dns/record-set/delete/delete.go index 09337b89e..ff1478ccc 100644 --- a/internal/cmd/dns/record-set/delete/delete.go +++ b/internal/cmd/dns/record-set/delete/delete.go @@ -88,13 +88,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting record set") - _, err = wait.DeleteRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting record set", func() error { + _, err = wait.DeleteRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS record set deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/dns/record-set/update/update.go b/internal/cmd/dns/record-set/update/update.go index b9fb0e942..6246ff58f 100644 --- a/internal/cmd/dns/record-set/update/update.go +++ b/internal/cmd/dns/record-set/update/update.go @@ -108,13 +108,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating record set") - _, err = wait.PartialUpdateRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating record set", func() error { + _, err = wait.PartialUpdateRecordSetWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId, model.RecordSetId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS record set update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/dns/zone/clone/clone.go b/internal/cmd/dns/zone/clone/clone.go index 6bc02546d..de171a2be 100644 --- a/internal/cmd/dns/zone/clone/clone.go +++ b/internal/cmd/dns/zone/clone/clone.go @@ -91,13 +91,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Cloning zone") - _, err = wait.CreateZoneWaitHandler(ctx, apiClient, model.ProjectId, zoneId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Cloning zone", func() error { + _, err = wait.CreateZoneWaitHandler(ctx, apiClient, model.ProjectId, zoneId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS zone cloning: %w", err) } - s.Stop() } return outputResult(params.Printer, model, zoneLabel, resp) diff --git a/internal/cmd/dns/zone/create/create.go b/internal/cmd/dns/zone/create/create.go index 75ef0a3e5..5b68f97b8 100644 --- a/internal/cmd/dns/zone/create/create.go +++ b/internal/cmd/dns/zone/create/create.go @@ -104,13 +104,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating zone") - _, err = wait.CreateZoneWaitHandler(ctx, apiClient, model.ProjectId, zoneId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating zone", func() error { + _, err = wait.CreateZoneWaitHandler(ctx, apiClient, model.ProjectId, zoneId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS zone creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, resp) diff --git a/internal/cmd/dns/zone/delete/delete.go b/internal/cmd/dns/zone/delete/delete.go index a204a5dbe..9945054ee 100644 --- a/internal/cmd/dns/zone/delete/delete.go +++ b/internal/cmd/dns/zone/delete/delete.go @@ -77,13 +77,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting zone") - _, err = wait.DeleteZoneWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting zone", func() error { + _, err = wait.DeleteZoneWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS zone deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/dns/zone/update/update.go b/internal/cmd/dns/zone/update/update.go index a3c31b097..c44ba724b 100644 --- a/internal/cmd/dns/zone/update/update.go +++ b/internal/cmd/dns/zone/update/update.go @@ -100,13 +100,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating zone") - _, err = wait.PartialUpdateZoneWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating zone", func() error { + _, err = wait.PartialUpdateZoneWaitHandler(ctx, apiClient, model.ProjectId, model.ZoneId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for DNS zone update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index ef4f5c5e8..70693a546 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -81,13 +81,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating stackit git instance") - _, err = wait.CreateGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, *result.Id).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating STACKIT git instance", func() error { + _, err = wait.CreateGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, *result.Id).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for stackit git Instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, model.Name, result) diff --git a/internal/cmd/git/instance/delete/delete.go b/internal/cmd/git/instance/delete/delete.go index 7c056829a..b1aee9a2c 100644 --- a/internal/cmd/git/instance/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -81,13 +81,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting stackit git instance") - _, err = wait.DeleteGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting STACKIT git instance", func() error { + _, err = wait.DeleteGitInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for stackit git instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/kms/key/create/create.go b/internal/cmd/kms/key/create/create.go index 01668fa75..801f389a1 100644 --- a/internal/cmd/kms/key/create/create.go +++ b/internal/cmd/kms/key/create/create.go @@ -97,13 +97,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating key") - _, err = wait.CreateOrUpdateKeyWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, *resp.Id).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating key", func() error { + _, err = wait.CreateOrUpdateKeyWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, *resp.Id).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for KMS key creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, resp) diff --git a/internal/cmd/kms/keyring/create/create.go b/internal/cmd/kms/keyring/create/create.go index b663cbfb2..e51822dff 100644 --- a/internal/cmd/kms/keyring/create/create.go +++ b/internal/cmd/kms/keyring/create/create.go @@ -84,13 +84,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating key ring") - _, err = wait.CreateKeyRingWaitHandler(ctx, apiClient, model.ProjectId, model.Region, keyRingId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating key ring", func() error { + _, err = wait.CreateKeyRingWaitHandler(ctx, apiClient, model.ProjectId, model.Region, keyRingId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for KMS key ring creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, keyRing) diff --git a/internal/cmd/kms/version/disable/disable.go b/internal/cmd/kms/version/disable/disable.go index 760b909c7..2a57afd36 100644 --- a/internal/cmd/kms/version/disable/disable.go +++ b/internal/cmd/kms/version/disable/disable.go @@ -70,13 +70,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Disabling key version") - _, err = wait.DisableKeyVersionWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Disabling key version", func() error { + _, err = wait.DisableKeyVersionWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for key version to be disabled: %w", err) } - s.Stop() } // Get the key version in its state afterwards diff --git a/internal/cmd/kms/version/enable/enable.go b/internal/cmd/kms/version/enable/enable.go index 711792a94..8f83cccb2 100644 --- a/internal/cmd/kms/version/enable/enable.go +++ b/internal/cmd/kms/version/enable/enable.go @@ -70,13 +70,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Enabling key version") - _, err = wait.EnableKeyVersionWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Enabling key version", func() error { + _, err = wait.EnableKeyVersionWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.KeyRingId, model.KeyId, model.VersionNumber).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for key version to be enabled: %w", err) } - s.Stop() } // Get the key version in its state afterwards diff --git a/internal/cmd/kms/wrappingkey/create/create.go b/internal/cmd/kms/wrappingkey/create/create.go index 1f43c6e67..3a751b59e 100644 --- a/internal/cmd/kms/wrappingkey/create/create.go +++ b/internal/cmd/kms/wrappingkey/create/create.go @@ -83,13 +83,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating wrapping key") - _, err = wait.CreateWrappingKeyWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *wrappingKey.KeyRingId, *wrappingKey.Id).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating wrapping key", func() error { + _, err = wait.CreateWrappingKeyWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *wrappingKey.KeyRingId, *wrappingKey.Id).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for KMS wrapping key creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, wrappingKey) diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index 31e74d9ba..fa7e8658f 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -93,13 +93,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating load balancer") - _, err = wait.CreateLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *model.Payload.Name).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating load balancer", func() error { + _, err = wait.CreateLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *model.Payload.Name).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for load balancer creation: %w", err) } - s.Stop() } operationState := "Created" diff --git a/internal/cmd/load-balancer/delete/delete.go b/internal/cmd/load-balancer/delete/delete.go index e1c3a33af..c60100607 100644 --- a/internal/cmd/load-balancer/delete/delete.go +++ b/internal/cmd/load-balancer/delete/delete.go @@ -66,13 +66,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting load balancer") - _, err = wait.DeleteLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.LoadBalancerName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting load balancer", func() error { + _, err = wait.DeleteLoadBalancerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.LoadBalancerName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for load balancer deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/logme/instance/create/create.go b/internal/cmd/logme/instance/create/create.go index c0b1fcd48..367c9cc60 100644 --- a/internal/cmd/logme/instance/create/create.go +++ b/internal/cmd/logme/instance/create/create.go @@ -114,13 +114,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for LogMe instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/logme/instance/delete/delete.go b/internal/cmd/logme/instance/delete/delete.go index 9cdfac9d0..0dc766e3b 100644 --- a/internal/cmd/logme/instance/delete/delete.go +++ b/internal/cmd/logme/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instacne", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for LogMe instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/logme/instance/update/update.go b/internal/cmd/logme/instance/update/update.go index 4cefddf26..9a16545ad 100644 --- a/internal/cmd/logme/instance/update/update.go +++ b/internal/cmd/logme/instance/update/update.go @@ -113,13 +113,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for LogMe instance update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/logs/instance/create/create.go b/internal/cmd/logs/instance/create/create.go index 30c45de7a..3ea20c774 100644 --- a/internal/cmd/logs/instance/create/create.go +++ b/internal/cmd/logs/instance/create/create.go @@ -102,13 +102,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateLogsInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateLogsInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for logs instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, resp) diff --git a/internal/cmd/logs/instance/delete/delete.go b/internal/cmd/logs/instance/delete/delete.go index 937239fc2..6b889e54d 100644 --- a/internal/cmd/logs/instance/delete/delete.go +++ b/internal/cmd/logs/instance/delete/delete.go @@ -85,13 +85,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteLogsInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceID).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteLogsInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceID).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Logs instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/mariadb/instance/create/create.go b/internal/cmd/mariadb/instance/create/create.go index 22a8a2b91..de4c22b70 100644 --- a/internal/cmd/mariadb/instance/create/create.go +++ b/internal/cmd/mariadb/instance/create/create.go @@ -114,13 +114,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MariaDB instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/mariadb/instance/delete/delete.go b/internal/cmd/mariadb/instance/delete/delete.go index 1cd809204..db499df05 100644 --- a/internal/cmd/mariadb/instance/delete/delete.go +++ b/internal/cmd/mariadb/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MariaDB instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/mariadb/instance/update/update.go b/internal/cmd/mariadb/instance/update/update.go index ebb48e315..94a7a871d 100644 --- a/internal/cmd/mariadb/instance/update/update.go +++ b/internal/cmd/mariadb/instance/update/update.go @@ -111,13 +111,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MariaDB instance update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/mongodbflex/backup/restore/restore.go b/internal/cmd/mongodbflex/backup/restore/restore.go index 44b611669..25171f7cb 100644 --- a/internal/cmd/mongodbflex/backup/restore/restore.go +++ b/internal/cmd/mongodbflex/backup/restore/restore.go @@ -99,13 +99,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } if !model.Async { - s := spinner.New(params.Printer) - s.Start("Restoring instance") - _, err = wait.RestoreInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.BackupId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Restoring instance", func() error { + _, err = wait.RestoreInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.BackupId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance restoration: %w", err) } - s.Stop() } operationState := "Restored" @@ -124,13 +124,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } if !model.Async { - s := spinner.New(params.Printer) - s.Start("Cloning instance") - _, err = wait.CloneInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Cloning instance", func() error { + _, err = wait.CloneInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance cloning: %w", err) } - s.Stop() } operationState := "Cloned" diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index e0239d2f5..17cce56a3 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -121,13 +121,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/mongodbflex/instance/delete/delete.go b/internal/cmd/mongodbflex/instance/delete/delete.go index cb4a2be9c..8c34e1533 100644 --- a/internal/cmd/mongodbflex/instance/delete/delete.go +++ b/internal/cmd/mongodbflex/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/mongodbflex/instance/update/update.go b/internal/cmd/mongodbflex/instance/update/update.go index bcd4bb894..e340f95d2 100644 --- a/internal/cmd/mongodbflex/instance/update/update.go +++ b/internal/cmd/mongodbflex/instance/update/update.go @@ -107,13 +107,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for MongoDB Flex instance update: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, instanceLabel, resp) diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index 078a6568c..a99fafb57 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -146,13 +146,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { return fmt.Errorf("create network area region: %w", err) } if !model.Async { - s := spinner.New(params.Printer) - s.Start("Create network area region") - _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, *resp.Id, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Create network area region", func() error { + _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, *resp.Id, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for creating network area region %w", err) } - s.Stop() } responses.RegionalArea = respNetworkArea } diff --git a/internal/cmd/network-area/region/create/create.go b/internal/cmd/network-area/region/create/create.go index 0b59fa852..41ec64c0d 100644 --- a/internal/cmd/network-area/region/create/create.go +++ b/internal/cmd/network-area/region/create/create.go @@ -108,13 +108,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } if !model.Async { - s := spinner.New(params.Printer) - s.Start("Create network area region") - _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Create network area region", func() error { + _, err = wait.CreateNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for network area region creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, model.Region, networkAreaLabel, *resp) diff --git a/internal/cmd/network-area/region/delete/delete.go b/internal/cmd/network-area/region/delete/delete.go index bbbd44262..9c8586a94 100644 --- a/internal/cmd/network-area/region/delete/delete.go +++ b/internal/cmd/network-area/region/delete/delete.go @@ -82,13 +82,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { } if !model.Async { - s := spinner.New(params.Printer) - s.Start("Delete network area region") - _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Delete network area region", func() error { + _, err = wait.DeleteNetworkAreaRegionWaitHandler(ctx, apiClient, model.OrganizationId, model.NetworkAreaId, model.Region).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for network area region deletion: %w", err) } - s.Stop() } params.Printer.Outputf("Delete regional network area %q for %q\n", model.Region, networkAreaName) diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index bb180a176..0c1f8d75d 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -134,15 +134,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating network") - _, err = wait.CreateNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, networkId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating network", func() error { + _, err = wait.CreateNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, networkId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for network creation: %w", err) } - s.Stop() } - return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) }, } diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index 1f3b00b95..998506a0a 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -81,13 +81,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting network") - _, err = wait.DeleteNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting network", func() error { + _, err = wait.DeleteNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.NetworkId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for network deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index ba496a3ec..b85b7e6ab 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -115,15 +115,14 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating network") - _, err = wait.UpdateNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, networkId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating network", func() error { + _, err = wait.UpdateNetworkWaitHandler(ctx, apiClient, model.ProjectId, model.Region, networkId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for network update: %w", err) } - s.Stop() } - operationState := "Updated" if model.Async { operationState = "Triggered update of" diff --git a/internal/cmd/object-storage/bucket/create/create.go b/internal/cmd/object-storage/bucket/create/create.go index ea10274db..577d244d0 100644 --- a/internal/cmd/object-storage/bucket/create/create.go +++ b/internal/cmd/object-storage/bucket/create/create.go @@ -85,13 +85,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating bucket") - _, err = wait.CreateBucketWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating bucket", func() error { + _, err = wait.CreateBucketWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Object Storage bucket creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, model.BucketName, resp) diff --git a/internal/cmd/object-storage/bucket/delete/delete.go b/internal/cmd/object-storage/bucket/delete/delete.go index 99a82da85..c6cc396f8 100644 --- a/internal/cmd/object-storage/bucket/delete/delete.go +++ b/internal/cmd/object-storage/bucket/delete/delete.go @@ -67,13 +67,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting bucket") - _, err = wait.DeleteBucketWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting bucket", func() error { + _, err = wait.DeleteBucketWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.BucketName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Object Storage bucket deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index c492902e5..769160b7b 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -94,13 +94,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Observability instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/observability/instance/delete/delete.go b/internal/cmd/observability/instance/delete/delete.go index 0aec201da..d9fc972ab 100644 --- a/internal/cmd/observability/instance/delete/delete.go +++ b/internal/cmd/observability/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.InstanceId, model.ProjectId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.InstanceId, model.ProjectId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Observability instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/observability/instance/update/update.go b/internal/cmd/observability/instance/update/update.go index 51d0b9f56..38b2fe693 100644 --- a/internal/cmd/observability/instance/update/update.go +++ b/internal/cmd/observability/instance/update/update.go @@ -100,13 +100,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.UpdateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.UpdateInstanceWaitHandler(ctx, apiClient, instanceId, model.ProjectId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Observability instance update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/observability/scrape-config/create/create.go b/internal/cmd/observability/scrape-config/create/create.go index f3e9a0515..87d206cfe 100644 --- a/internal/cmd/observability/scrape-config/create/create.go +++ b/internal/cmd/observability/scrape-config/create/create.go @@ -106,13 +106,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating scrape config") - _, err = wait.CreateScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, *jobName, model.ProjectId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating scrape config", func() error { + _, err = wait.CreateScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, *jobName, model.ProjectId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for scrape configuration creation: %w", err) } - s.Stop() } operationState := "Created" diff --git a/internal/cmd/observability/scrape-config/delete/delete.go b/internal/cmd/observability/scrape-config/delete/delete.go index 4cd15229b..7ec1e8ccf 100644 --- a/internal/cmd/observability/scrape-config/delete/delete.go +++ b/internal/cmd/observability/scrape-config/delete/delete.go @@ -78,13 +78,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting scrape config") - _, err = wait.DeleteScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, model.JobName, model.ProjectId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting scrape config", func() error { + _, err = wait.DeleteScrapeConfigWaitHandler(ctx, apiClient, model.InstanceId, model.JobName, model.ProjectId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for scrape config deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/opensearch/instance/create/create.go b/internal/cmd/opensearch/instance/create/create.go index bc03d82dd..776e6b86f 100644 --- a/internal/cmd/opensearch/instance/create/create.go +++ b/internal/cmd/opensearch/instance/create/create.go @@ -116,13 +116,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for OpenSearch instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, instanceId, resp) diff --git a/internal/cmd/opensearch/instance/delete/delete.go b/internal/cmd/opensearch/instance/delete/delete.go index e1cc328fb..58f4f59d1 100644 --- a/internal/cmd/opensearch/instance/delete/delete.go +++ b/internal/cmd/opensearch/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for OpenSearch instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/opensearch/instance/update/update.go b/internal/cmd/opensearch/instance/update/update.go index aa9b90eb5..557fb1712 100644 --- a/internal/cmd/opensearch/instance/update/update.go +++ b/internal/cmd/opensearch/instance/update/update.go @@ -114,13 +114,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for OpenSearch instance update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/postgresflex/instance/clone/clone.go b/internal/cmd/postgresflex/instance/clone/clone.go index d9a784d2a..facfdf105 100644 --- a/internal/cmd/postgresflex/instance/clone/clone.go +++ b/internal/cmd/postgresflex/instance/clone/clone.go @@ -97,13 +97,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Cloning instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Cloning instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for PostgreSQL Flex instance cloning: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, instanceLabel, instanceId, resp) diff --git a/internal/cmd/postgresflex/instance/create/create.go b/internal/cmd/postgresflex/instance/create/create.go index 8359ad2f7..7cad848d6 100644 --- a/internal/cmd/postgresflex/instance/create/create.go +++ b/internal/cmd/postgresflex/instance/create/create.go @@ -122,13 +122,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for PostgreSQL Flex instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, instanceId, resp) diff --git a/internal/cmd/postgresflex/instance/delete/delete.go b/internal/cmd/postgresflex/instance/delete/delete.go index 2108d31c3..3a8aa4cfe 100644 --- a/internal/cmd/postgresflex/instance/delete/delete.go +++ b/internal/cmd/postgresflex/instance/delete/delete.go @@ -92,13 +92,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for PostgreSQL Flex instance deletion: %w", err) } - s.Stop() } } @@ -112,13 +112,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Forcing deletion of instance") - _, err = wait.ForceDeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Forcing deletion of instance", func() error { + _, err = wait.ForceDeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for PostgreSQL Flex instance force deletion: %w", err) } - s.Stop() } } diff --git a/internal/cmd/postgresflex/instance/update/update.go b/internal/cmd/postgresflex/instance/update/update.go index 8623a78f4..74a3a402d 100644 --- a/internal/cmd/postgresflex/instance/update/update.go +++ b/internal/cmd/postgresflex/instance/update/update.go @@ -107,13 +107,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.Region, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for PostgreSQL Flex instance update: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, instanceLabel, resp) diff --git a/internal/cmd/rabbitmq/instance/create/create.go b/internal/cmd/rabbitmq/instance/create/create.go index 1ac8e7cc2..cb2bf470a 100644 --- a/internal/cmd/rabbitmq/instance/create/create.go +++ b/internal/cmd/rabbitmq/instance/create/create.go @@ -116,13 +116,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for RabbitMQ instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, instanceId, resp) diff --git a/internal/cmd/rabbitmq/instance/delete/delete.go b/internal/cmd/rabbitmq/instance/delete/delete.go index 766ced827..ec5c35104 100644 --- a/internal/cmd/rabbitmq/instance/delete/delete.go +++ b/internal/cmd/rabbitmq/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for RabbitMQ instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/rabbitmq/instance/update/update.go b/internal/cmd/rabbitmq/instance/update/update.go index d3cf53603..b58590a6e 100644 --- a/internal/cmd/rabbitmq/instance/update/update.go +++ b/internal/cmd/rabbitmq/instance/update/update.go @@ -114,13 +114,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for RabbitMQ instance update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/redis/instance/create/create.go b/internal/cmd/redis/instance/create/create.go index 8993b98ca..817a769ce 100644 --- a/internal/cmd/redis/instance/create/create.go +++ b/internal/cmd/redis/instance/create/create.go @@ -114,13 +114,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating instance") - _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating instance", func() error { + _, err = wait.CreateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Redis instance creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, instanceId, resp) diff --git a/internal/cmd/redis/instance/delete/delete.go b/internal/cmd/redis/instance/delete/delete.go index 0c8124906..f54412008 100644 --- a/internal/cmd/redis/instance/delete/delete.go +++ b/internal/cmd/redis/instance/delete/delete.go @@ -75,13 +75,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting instance") - _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting instance", func() error { + _, err = wait.DeleteInstanceWaitHandler(ctx, apiClient, model.ProjectId, model.InstanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Redis instance deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/redis/instance/update/update.go b/internal/cmd/redis/instance/update/update.go index 3fcc2e7b4..ca078eb82 100644 --- a/internal/cmd/redis/instance/update/update.go +++ b/internal/cmd/redis/instance/update/update.go @@ -111,13 +111,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating instance") - _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating instance", func() error { + _, err = wait.PartialUpdateInstanceWaitHandler(ctx, apiClient, model.ProjectId, instanceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for Redis instance update: %w", err) } - s.Stop() } operationState := "Updated" diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index ab5253af0..c4f0450d9 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -144,13 +144,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating server") - _, err = wait.CreateServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, serverId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating server", func() error { + _, err = wait.CreateServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, serverId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index bed42bf7a..f10fb670b 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -78,13 +78,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deallocating server") - _, err = wait.DeallocateServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deallocating server", func() error { + _, err = wait.DeallocateServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server deallocating: %w", err) } - s.Stop() } operationState := "Deallocated" diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index 412c099dc..d24acf388 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -5,7 +5,9 @@ import ( "fmt" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/spf13/cobra" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,9 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" - - "github.com/spf13/cobra" ) const ( @@ -81,13 +80,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting server") - _, err = wait.DeleteServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting server", func() error { + _, err = wait.DeleteServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index dd77e4625..ee5d9b68c 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -82,13 +82,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Rescuing server") - _, err = wait.RescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Rescuing server", func() error { + _, err = wait.RescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server rescuing: %w", err) } - s.Stop() } operationState := "Rescued" diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index 804dbce1a..34eb1bddb 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -82,13 +82,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Resizing server") - _, err = wait.ResizeServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Resizing server", func() error { + _, err = wait.ResizeServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server resizing: %w", err) } - s.Stop() } operationState := "Resized" diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index 3dc23ff31..9d0c3e056 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -72,13 +72,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Starting server") - _, err = wait.StartServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Starting server", func() error { + _, err = wait.StartServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server starting: %w", err) } - s.Stop() } operationState := "Started" diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index a7a9b4604..936d2ae6c 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -78,13 +78,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Stopping server") - _, err = wait.StopServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Stopping server", func() error { + _, err = wait.StopServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server stopping: %w", err) } - s.Stop() } operationState := "Stopped" diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index f47ef6794..16f9d5351 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -78,13 +78,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Unrescuing server") - _, err = wait.UnrescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Unrescuing server", func() error { + _, err = wait.UnrescueServerWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.ServerId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for server unrescuing: %w", err) } - s.Stop() } operationState := "Unrescued" diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index faca273bb..38263ec9e 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -133,13 +133,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating cluster") - _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, name).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating cluster", func() error { + _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, name).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, projectLabel, resp) diff --git a/internal/cmd/ske/cluster/delete/delete.go b/internal/cmd/ske/cluster/delete/delete.go index f172b495b..f8833c202 100644 --- a/internal/cmd/ske/cluster/delete/delete.go +++ b/internal/cmd/ske/cluster/delete/delete.go @@ -67,13 +67,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting cluster") - _, err = wait.DeleteClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting cluster", func() error { + _, err = wait.DeleteClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go index 259ae868f..a409c4890 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -16,7 +16,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" + "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( @@ -72,13 +72,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Hibernating cluster") - _, err = wait.TriggerClusterHibernationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Hibernating cluster", func() error { + _, err = wait.TriggerClusterHibernationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster hibernation: %w", err) } - s.Stop() } operationState := "Hibernated" diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go index 8fda38bb6..444e22117 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -72,13 +72,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Performing cluster maintenance") - _, err = wait.TriggerClusterMaintenanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Performing cluster maintenance", func() error { + _, err = wait.TriggerClusterMaintenanceWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster maintenance to complete: %w", err) } - s.Stop() } operationState := "Performed maintenance for" diff --git a/internal/cmd/ske/cluster/reconcile/reconcile.go b/internal/cmd/ske/cluster/reconcile/reconcile.go index faf3e6da5..00bc11a9e 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile.go @@ -60,13 +60,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Performing cluster reconciliation") - _, err = wait.TriggerClusterReconciliationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Performing cluster reconciliation", func() error { + _, err = wait.TriggerClusterReconciliationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster reconciliation: %w", err) } - s.Stop() } operationState := "Performed reconciliation for" diff --git a/internal/cmd/ske/cluster/update/update.go b/internal/cmd/ske/cluster/update/update.go index 7abd56eb1..bd1facd7a 100644 --- a/internal/cmd/ske/cluster/update/update.go +++ b/internal/cmd/ske/cluster/update/update.go @@ -95,13 +95,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Updating cluster") - _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, name).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Updating cluster", func() error { + _, err = wait.CreateOrUpdateClusterWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, name).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster update: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, model.ClusterName, resp) diff --git a/internal/cmd/ske/cluster/wakeup/wakeup.go b/internal/cmd/ske/cluster/wakeup/wakeup.go index 44b1d976f..b53077ef3 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup.go @@ -60,13 +60,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Performing cluster wakeup") - _, err = wait.TriggerClusterWakeupWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Performing cluster wakeup", func() error { + _, err = wait.TriggerClusterWakeupWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE cluster wakeup: %w", err) } - s.Stop() } operationState := "Performed wakeup of" diff --git a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go index a4a5d53af..734a89735 100644 --- a/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go +++ b/internal/cmd/ske/credentials/complete-rotation/complete_rotation.go @@ -84,13 +84,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Completing credentials rotation") - _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Completing credentials rotation", func() error { + _, err = wait.CompleteCredentialsRotationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for completing SKE credentials rotation %w", err) } - s.Stop() } operationState := "Rotation of credentials is completed" diff --git a/internal/cmd/ske/credentials/start-rotation/start_rotation.go b/internal/cmd/ske/credentials/start-rotation/start_rotation.go index b2daa7c87..ea2933fab 100644 --- a/internal/cmd/ske/credentials/start-rotation/start_rotation.go +++ b/internal/cmd/ske/credentials/start-rotation/start_rotation.go @@ -87,13 +87,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Starting credentials rotation") - _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Starting credentials rotation", func() error { + _, err = wait.StartCredentialsRotationWaitHandler(ctx, apiClient.DefaultAPI, model.ProjectId, model.Region, model.ClusterName).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for start SKE credentials rotation %w", err) } - s.Stop() } operationState := "Rotation of credentials is ready to be completed" diff --git a/internal/cmd/ske/disable/disable.go b/internal/cmd/ske/disable/disable.go index 075711b1a..43c103e7b 100644 --- a/internal/cmd/ske/disable/disable.go +++ b/internal/cmd/ske/disable/disable.go @@ -70,13 +70,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Disabling SKE") - _, err = wait.DisableServiceWaitHandler(ctx, apiClient, model.Region, model.ProjectId, utils.SKEServiceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Disabling SKE", func() error { + _, err = wait.DisableServiceWaitHandler(ctx, apiClient, model.Region, model.ProjectId, utils.SKEServiceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE disabling: %w", err) } - s.Stop() } operationState := "Disabled" diff --git a/internal/cmd/ske/enable/enable.go b/internal/cmd/ske/enable/enable.go index 366f8d5f2..ea83a337b 100644 --- a/internal/cmd/ske/enable/enable.go +++ b/internal/cmd/ske/enable/enable.go @@ -70,13 +70,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Enabling SKE") - _, err = wait.EnableServiceWaitHandler(ctx, apiClient, model.Region, model.ProjectId, utils.SKEServiceId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Enabling SKE", func() error { + _, err = wait.EnableServiceWaitHandler(ctx, apiClient, model.Region, model.ProjectId, utils.SKEServiceId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for SKE enabling: %w", err) } - s.Stop() } operationState := "Enabled" diff --git a/internal/cmd/volume/backup/create/create.go b/internal/cmd/volume/backup/create/create.go index fc9e0b3cd..c2211a3ad 100644 --- a/internal/cmd/volume/backup/create/create.go +++ b/internal/cmd/volume/backup/create/create.go @@ -115,13 +115,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating backup") - resp, err = wait.CreateBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, volumeId).WaitWithContext(ctx) + resp, err = spinner.Run2(params.Printer, "Creating backup", func() (*iaas.Backup, error) { + return wait.CreateBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, volumeId).WaitWithContext(ctx) + }) if err != nil { return fmt.Errorf("wait for backup creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model.OutputFormat, model.Async, sourceLabel, projectLabel, resp) diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go index 9c9717427..e5b113075 100644 --- a/internal/cmd/volume/backup/delete/delete.go +++ b/internal/cmd/volume/backup/delete/delete.go @@ -73,13 +73,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting backup") - _, err = wait.DeleteBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BackupId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting backup", func() error { + _, err = wait.DeleteBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BackupId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for backup deletion: %w", err) } - s.Stop() } if model.Async { diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go index 63fc0d915..ebcb5f917 100644 --- a/internal/cmd/volume/backup/restore/restore.go +++ b/internal/cmd/volume/backup/restore/restore.go @@ -86,13 +86,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Restoring backup") - _, err = wait.RestoreBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BackupId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Restoring backup", func() error { + _, err = wait.RestoreBackupWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.BackupId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for backup restore: %w", err) } - s.Stop() } if model.Async { diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index f82725de6..5b7a21ffd 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -104,13 +104,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating volume") - _, err = wait.CreateVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, volumeId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Creating volume", func() error { + _, err = wait.CreateVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, volumeId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for volume creation: %w", err) } - s.Stop() } return outputResult(params.Printer, model, projectLabel, resp) diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index 599f3bf56..abf99a53f 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -79,13 +79,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting volume") - _, err = wait.DeleteVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting volume", func() error { + _, err = wait.DeleteVolumeWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.VolumeId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for volume deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index f63a38b16..da209bf7b 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -94,13 +94,12 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Creating snapshot") - resp, err = wait.CreateSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Id).WaitWithContext(ctx) + resp, err = spinner.Run2(params.Printer, "Creating snapshot", func() (*iaas.Snapshot, error) { + return wait.CreateSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *resp.Id).WaitWithContext(ctx) + }) if err != nil { return fmt.Errorf("wait for snapshot creation: %w", err) } - s.Stop() } operationState := "Created" diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go index 7334cac51..fca923a29 100644 --- a/internal/cmd/volume/snapshot/delete/delete.go +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -76,13 +76,13 @@ func NewCmd(params *types.CmdParams) *cobra.Command { // Wait for async operation, if async mode not enabled if !model.Async { - s := spinner.New(params.Printer) - s.Start("Deleting snapshot") - _, err = wait.DeleteSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.SnapshotId).WaitWithContext(ctx) + err := spinner.Run(params.Printer, "Deleting snapshot", func() error { + _, err = wait.DeleteSnapshotWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.SnapshotId).WaitWithContext(ctx) + return err + }) if err != nil { return fmt.Errorf("wait for snapshot deletion: %w", err) } - s.Stop() } operationState := "Deleted" diff --git a/internal/pkg/spinner/spinner.go b/internal/pkg/spinner/spinner.go index 9c530f1ca..fa76ef2b8 100644 --- a/internal/pkg/spinner/spinner.go +++ b/internal/pkg/spinner/spinner.go @@ -15,7 +15,30 @@ type Spinner struct { done chan bool } -func New(p *print.Printer) *Spinner { +// Run starts a spinner and stops it when f completes +func Run(p *print.Printer, message string, f func() error) error { + _, err := Run2(p, message, func() (struct{}, error) { + err := f() + return struct{}{}, err + }) + return err +} + +// Run2 starts a spinner and stops it when f (result arity 2) completes. +func Run2[T any](p *print.Printer, message string, f func() (T, error)) (T, error) { + var r T + spinner := newSpinner(p) + spinner.start(message) + r, err := f() + if err != nil { + spinner.stopWithError() + return r, err + } + spinner.stop() + return r, nil +} + +func newSpinner(p *print.Printer) *Spinner { return &Spinner{ printer: p, states: []string{"|", "/", "-", "\\"}, @@ -25,18 +48,18 @@ func New(p *print.Printer) *Spinner { } } -func (s *Spinner) Start(message string) { +func (s *Spinner) start(message string) { s.message = message go s.animate() } -func (s *Spinner) Stop() { +func (s *Spinner) stop() { s.done <- true close(s.done) s.printer.Info("\r%s ✓ \n", s.message) } -func (s *Spinner) StopWithError() { +func (s *Spinner) stopWithError() { s.done <- true close(s.done) s.printer.Info("\r%s ✗ \n", s.message) From 58bb40600d2a6610443b0b39886b27eff9f1db2c Mon Sep 17 00:00:00 2001 From: Robert Gogolok Date: Fri, 27 Mar 2026 11:26:18 +0100 Subject: [PATCH 417/422] fix(auth): support opening auth url on FreeBSD (#1243) --- internal/pkg/auth/user_login.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index eb021d92e..9024c4f7d 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -342,7 +342,7 @@ func cleanup(server *http.Server) { func openBrowser(pageUrl string) error { var err error switch runtime.GOOS { - case "linux": + case "freebsd", "linux": // We need to use the windows way on WSL, otherwise we do not pass query // parameters correctly. https://github.com/microsoft/WSL/issues/3832 if _, ok := os.LookupEnv("WSL_DISTRO_NAME"); !ok { From 4fd4a532a5107426fb85f9cbca50e6a4a68e464f Mon Sep 17 00:00:00 2001 From: BipBopBipBop Date: Mon, 30 Mar 2026 15:24:44 +0200 Subject: [PATCH 418/422] feat(intake): add subcommands to manage users (#1293) Co-authored-by: Yago Carlos Fernandez Gou --- docs/stackit_beta_intake.md | 1 + docs/stackit_beta_intake_user.md | 38 +++ docs/stackit_beta_intake_user_create.md | 49 +++ docs/stackit_beta_intake_user_delete.md | 41 +++ docs/stackit_beta_intake_user_describe.md | 44 +++ docs/stackit_beta_intake_user_list.md | 48 +++ docs/stackit_beta_intake_user_update.md | 49 +++ internal/cmd/beta/intake/intake.go | 2 + internal/cmd/beta/intake/runner/runner.go | 8 +- .../cmd/beta/intake/user/create/create.go | 173 +++++++++++ .../beta/intake/user/create/create_test.go | 293 ++++++++++++++++++ .../cmd/beta/intake/user/delete/delete.go | 125 ++++++++ .../beta/intake/user/delete/delete_test.go | 174 +++++++++++ .../cmd/beta/intake/user/describe/describe.go | 134 ++++++++ .../intake/user/describe/describe_test.go | 211 +++++++++++++ internal/cmd/beta/intake/user/list/list.go | 157 ++++++++++ .../cmd/beta/intake/user/list/list_test.go | 225 ++++++++++++++ .../cmd/beta/intake/user/update/update.go | 169 ++++++++++ .../beta/intake/user/update/update_test.go | 259 ++++++++++++++++ internal/cmd/beta/intake/user/user.go | 35 +++ 20 files changed, 2233 insertions(+), 2 deletions(-) create mode 100644 docs/stackit_beta_intake_user.md create mode 100644 docs/stackit_beta_intake_user_create.md create mode 100644 docs/stackit_beta_intake_user_delete.md create mode 100644 docs/stackit_beta_intake_user_describe.md create mode 100644 docs/stackit_beta_intake_user_list.md create mode 100644 docs/stackit_beta_intake_user_update.md create mode 100644 internal/cmd/beta/intake/user/create/create.go create mode 100644 internal/cmd/beta/intake/user/create/create_test.go create mode 100644 internal/cmd/beta/intake/user/delete/delete.go create mode 100644 internal/cmd/beta/intake/user/delete/delete_test.go create mode 100644 internal/cmd/beta/intake/user/describe/describe.go create mode 100644 internal/cmd/beta/intake/user/describe/describe_test.go create mode 100644 internal/cmd/beta/intake/user/list/list.go create mode 100644 internal/cmd/beta/intake/user/list/list_test.go create mode 100644 internal/cmd/beta/intake/user/update/update.go create mode 100644 internal/cmd/beta/intake/user/update/update_test.go create mode 100644 internal/cmd/beta/intake/user/user.go diff --git a/docs/stackit_beta_intake.md b/docs/stackit_beta_intake.md index 9a3672fb8..fa29e493f 100644 --- a/docs/stackit_beta_intake.md +++ b/docs/stackit_beta_intake.md @@ -36,4 +36,5 @@ stackit beta intake [flags] * [stackit beta intake list](./stackit_beta_intake_list.md) - Lists all Intakes * [stackit beta intake runner](./stackit_beta_intake_runner.md) - Provides functionality for Intake Runners * [stackit beta intake update](./stackit_beta_intake_update.md) - Updates an Intake +* [stackit beta intake user](./stackit_beta_intake_user.md) - Provides functionality for Intake Users diff --git a/docs/stackit_beta_intake_user.md b/docs/stackit_beta_intake_user.md new file mode 100644 index 000000000..a09b51fb1 --- /dev/null +++ b/docs/stackit_beta_intake_user.md @@ -0,0 +1,38 @@ +## stackit beta intake user + +Provides functionality for Intake Users + +### Synopsis + +Provides functionality for Intake Users. + +``` +stackit beta intake user [flags] +``` + +### Options + +``` + -h, --help Help for "stackit beta intake user" +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake](./stackit_beta_intake.md) - Provides functionality for intake +* [stackit beta intake user create](./stackit_beta_intake_user_create.md) - Creates a new Intake User +* [stackit beta intake user delete](./stackit_beta_intake_user_delete.md) - Deletes an Intake User +* [stackit beta intake user describe](./stackit_beta_intake_user_describe.md) - Shows details of an Intake User +* [stackit beta intake user list](./stackit_beta_intake_user_list.md) - Lists all Intake Users +* [stackit beta intake user update](./stackit_beta_intake_user_update.md) - Updates an Intake User + diff --git a/docs/stackit_beta_intake_user_create.md b/docs/stackit_beta_intake_user_create.md new file mode 100644 index 000000000..84ec49bdf --- /dev/null +++ b/docs/stackit_beta_intake_user_create.md @@ -0,0 +1,49 @@ +## stackit beta intake user create + +Creates a new Intake User + +### Synopsis + +Creates a new Intake User for a specific Intake. + +``` +stackit beta intake user create [flags] +``` + +### Examples + +``` + Create a new Intake User with required parameters + $ stackit beta intake user create --display-name intake-user --intake-id xxx --password "SuperSafepass123\!" + + Create a new Intake User for the dead-letter queue with labels + $ stackit beta intake user create --display-name dlq-user --intake-id xxx --password "SuperSafepass123\!" --type dead-letter --labels "env=prod" +``` + +### Options + +``` + --description string Description + --display-name string Display name + -h, --help Help for "stackit beta intake user create" + --intake-id string The UUID of the Intake to associate the user with + --labels stringToString Labels in key=value format, separated by commas (default []) + --password string Password for the user. Must contain lower, upper, number, and special characters (min 12 chars) + --type string Type of user. One of 'intake' (default) or 'dead-letter' (default "intake") +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake user](./stackit_beta_intake_user.md) - Provides functionality for Intake Users + diff --git a/docs/stackit_beta_intake_user_delete.md b/docs/stackit_beta_intake_user_delete.md new file mode 100644 index 000000000..cf6fad990 --- /dev/null +++ b/docs/stackit_beta_intake_user_delete.md @@ -0,0 +1,41 @@ +## stackit beta intake user delete + +Deletes an Intake User + +### Synopsis + +Deletes an Intake User. + +``` +stackit beta intake user delete USER_ID [flags] +``` + +### Examples + +``` + Delete an Intake User with ID "xxx" for Intake "yyy" + $ stackit beta intake user delete xxx --intake-id yyy +``` + +### Options + +``` + -h, --help Help for "stackit beta intake user delete" + --intake-id string Intake ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake user](./stackit_beta_intake_user.md) - Provides functionality for Intake Users + diff --git a/docs/stackit_beta_intake_user_describe.md b/docs/stackit_beta_intake_user_describe.md new file mode 100644 index 000000000..18f04e693 --- /dev/null +++ b/docs/stackit_beta_intake_user_describe.md @@ -0,0 +1,44 @@ +## stackit beta intake user describe + +Shows details of an Intake User + +### Synopsis + +Shows details of an Intake User. + +``` +stackit beta intake user describe USER_ID [flags] +``` + +### Examples + +``` + Get details of an Intake User with ID "xxx" for Intake "yyy" + $ stackit beta intake user describe xxx --intake-id yyy + + Get details of an Intake User with ID "xxx" in JSON format + $ stackit beta intake user describe xxx --intake-id yyy --output-format json +``` + +### Options + +``` + -h, --help Help for "stackit beta intake user describe" + --intake-id string Intake ID +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake user](./stackit_beta_intake_user.md) - Provides functionality for Intake Users + diff --git a/docs/stackit_beta_intake_user_list.md b/docs/stackit_beta_intake_user_list.md new file mode 100644 index 000000000..b1a25a14a --- /dev/null +++ b/docs/stackit_beta_intake_user_list.md @@ -0,0 +1,48 @@ +## stackit beta intake user list + +Lists all Intake Users + +### Synopsis + +Lists all Intake Users for a specific Intake. + +``` +stackit beta intake user list [flags] +``` + +### Examples + +``` + List all users for an Intake + $ stackit beta intake user list --intake-id xxx + + List all users for an Intake in JSON format + $ stackit beta intake user list --intake-id xxx --output-format json + + List up to 5 users for an Intake + $ stackit beta intake user list --intake-id xxx --limit 5 +``` + +### Options + +``` + -h, --help Help for "stackit beta intake user list" + --intake-id string Intake ID + --limit int Maximum number of entries to list +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake user](./stackit_beta_intake_user.md) - Provides functionality for Intake Users + diff --git a/docs/stackit_beta_intake_user_update.md b/docs/stackit_beta_intake_user_update.md new file mode 100644 index 000000000..93c591a15 --- /dev/null +++ b/docs/stackit_beta_intake_user_update.md @@ -0,0 +1,49 @@ +## stackit beta intake user update + +Updates an Intake User + +### Synopsis + +Updates an Intake User. Only the specified fields are updated. + +``` +stackit beta intake user update USER_ID [flags] +``` + +### Examples + +``` + Update the display name of an Intake User + $ stackit beta intake user update xxx --intake-id yyy --display-name "new-user-name" + + Update the password and description for an Intake User + $ stackit beta intake user update xxx --intake-id yyy --password "NewSecret123\!" --description "Updated description" +``` + +### Options + +``` + --description string Description + --display-name string Display name + -h, --help Help for "stackit beta intake user update" + --intake-id string Intake ID + --labels stringToString Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2". (default []) + --password string Password for the user. Must contain lower, upper, number, and special characters (min 12 chars) + --type string Type of user. One of 'intake' or 'dead-letter' +``` + +### Options inherited from parent commands + +``` + -y, --assume-yes If set, skips all confirmation prompts + --async If set, runs the command asynchronously + -o, --output-format string Output format, one of ["json" "pretty" "none" "yaml"] + -p, --project-id string Project ID + --region string Target region for region-specific requests + --verbosity string Verbosity of the CLI, one of ["debug" "info" "warning" "error"] (default "info") +``` + +### SEE ALSO + +* [stackit beta intake user](./stackit_beta_intake_user.md) - Provides functionality for Intake Users + diff --git a/internal/cmd/beta/intake/intake.go b/internal/cmd/beta/intake/intake.go index 528a9e392..0a38cb9e1 100644 --- a/internal/cmd/beta/intake/intake.go +++ b/internal/cmd/beta/intake/intake.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/list" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/update" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" @@ -28,6 +29,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { cmd.AddCommand(runner.NewCmd(params)) + cmd.AddCommand(user.NewCmd(params)) // Intake instance subcommands cmd.AddCommand(create.NewCmd(params)) diff --git a/internal/cmd/beta/intake/runner/runner.go b/internal/cmd/beta/intake/runner/runner.go index f923d96ff..dcb610d95 100644 --- a/internal/cmd/beta/intake/runner/runner.go +++ b/internal/cmd/beta/intake/runner/runner.go @@ -20,12 +20,16 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Args: args.NoArgs, Run: utils.CmdHelp, } + + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { // Pass the params down to each action command cmd.AddCommand(create.NewCmd(params)) cmd.AddCommand(delete.NewCmd(params)) cmd.AddCommand(describe.NewCmd(params)) cmd.AddCommand(list.NewCmd(params)) cmd.AddCommand(update.NewCmd(params)) - - return cmd } diff --git a/internal/cmd/beta/intake/user/create/create.go b/internal/cmd/beta/intake/user/create/create.go new file mode 100644 index 000000000..23175487f --- /dev/null +++ b/internal/cmd/beta/intake/user/create/create.go @@ -0,0 +1,173 @@ +package create + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" +) + +const ( + displayNameFlag = "display-name" + intakeIdFlag = "intake-id" + passwordFlag = "password" + userTypeFlag = "type" + descriptionFlag = "description" + labelsFlag = "labels" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + DisplayName *string + IntakeId *string + Password *string + UserType *string + Description *string + Labels *map[string]string +} + +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "create", + Short: "Creates a new Intake User", + Long: "Creates a new Intake User for a specific Intake.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `Create a new Intake User with required parameters`, + `$ stackit beta intake user create --display-name intake-user --intake-id xxx --password "SuperSafepass123\!"`), + examples.NewExample( + `Create a new Intake User for the dead-letter queue with labels`, + `$ stackit beta intake user create --display-name dlq-user --intake-id xxx --password "SuperSafepass123\!" --type dead-letter --labels "env=prod"`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + projectLabel, err := projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + projectLabel = model.ProjectId + } + + prompt := fmt.Sprintf("Are you sure you want to create an Intake User for project %q?", projectLabel) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("create Intake User: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + err := spinner.Run(p.Printer, "Creating STACKIT Intake User", func() error { + _, err = wait.CreateOrUpdateIntakeUserWaitHandler(ctx, apiClient, model.ProjectId, model.Region, *model.IntakeId, resp.GetId()).WaitWithContext(ctx) + return err + }) + if err != nil { + return fmt.Errorf("wait for STACKIT Intake User creation: %w", err) + } + } + + return outputResult(p.Printer, model, projectLabel, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().Var(flags.UUIDFlag(), intakeIdFlag, "The UUID of the Intake to associate the user with") + cmd.Flags().String(passwordFlag, "", "Password for the user. Must contain lower, upper, number, and special characters (min 12 chars)") + cmd.Flags().String(userTypeFlag, string(intake.USERTYPE_INTAKE), "Type of user. One of 'intake' (default) or 'dead-letter'") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().StringToString(labelsFlag, nil, "Labels in key=value format, separated by commas") + + err := flags.MarkFlagsRequired(cmd, displayNameFlag, intakeIdFlag, passwordFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + IntakeId: flags.FlagToStringPointer(p, cmd, intakeIdFlag), + Password: flags.FlagToStringPointer(p, cmd, passwordFlag), + UserType: flags.FlagToStringPointer(p, cmd, userTypeFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag), + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiCreateIntakeUserRequest { + req := apiClient.CreateIntakeUser(ctx, model.ProjectId, model.Region, *model.IntakeId) + + var userType *intake.UserType + if model.UserType != nil { + userType = utils.Ptr(intake.UserType(*model.UserType)) + } + + payload := intake.CreateIntakeUserPayload{ + DisplayName: model.DisplayName, + Password: model.Password, + Type: userType, + Description: model.Description, + Labels: model.Labels, + } + + req = req.CreateIntakeUserPayload(payload) + return req +} + +func outputResult(p *print.Printer, model *inputModel, projectLabel string, resp *intake.IntakeUserResponse) error { + return p.OutputResult(model.OutputFormat, resp, func() error { + if resp == nil { + p.Outputf("Triggered creation of Intake User for project %q, but no user ID was returned.\n", projectLabel) + return nil + } + + operationState := "Created" + if model.Async { + operationState = "Triggered creation of" + } + p.Outputf("%s Intake User for project %q. User ID: %s\n", operationState, projectLabel, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/intake/user/create/create_test.go b/internal/cmd/beta/intake/user/create/create_test.go new file mode 100644 index 000000000..4ddcaaee4 --- /dev/null +++ b/internal/cmd/beta/intake/user/create/create_test.go @@ -0,0 +1,293 @@ +package create + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// Define a unique key for the context to avoid collisions +type testCtxKey struct{} + +const ( + testRegion = "eu01" + testDisplayName = "testuser" + testPassword = "Secret12345!" + testUserType = "intake" + testDescription = "This is a test user" + testLabelsString = "env=test,team=dev" +) + +var ( + // testCtx dummy context for testing purposes + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + // testClient mock API client + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() + + testLabels = map[string]string{"env": "test", "team": "dev"} +) + +// fixtureFlagValues generates a map of flag values for tests +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + intakeIdFlag: testIntakeId, + passwordFlag: testPassword, + userTypeFlag: testUserType, + descriptionFlag: testDescription, + labelsFlag: testLabelsString, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// fixtureInputModel generates an input model for tests +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + DisplayName: utils.Ptr(testDisplayName), + IntakeId: utils.Ptr(testIntakeId), + Password: utils.Ptr(testPassword), + UserType: utils.Ptr(testUserType), + Description: utils.Ptr(testDescription), + Labels: utils.Ptr(testLabels), + } + for _, mod := range mods { + mod(model) + } + return model +} + +// fixtureCreatePayload generates a CreateIntakeUserPayload for tests +func fixtureCreatePayload(mods ...func(payload *intake.CreateIntakeUserPayload)) intake.CreateIntakeUserPayload { + userType := intake.UserType(testUserType) + payload := intake.CreateIntakeUserPayload{ + DisplayName: utils.Ptr(testDisplayName), + Password: utils.Ptr(testPassword), + Type: &userType, + Description: utils.Ptr(testDescription), + Labels: utils.Ptr(testLabels), + } + for _, mod := range mods { + mod(&payload) + } + return payload +} + +// fixtureRequest generates an API request for tests +func fixtureRequest(mods ...func(request *intake.ApiCreateIntakeUserRequest)) intake.ApiCreateIntakeUserRequest { + request := testClient.CreateIntakeUser(testCtx, testProjectId, testRegion, testIntakeId) + request = request.CreateIntakeUserPayload(fixtureCreatePayload()) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no values", + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, intakeIdFlag) + }), + isValid: false, + }, + { + description: "display name missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, displayNameFlag) + }), + isValid: false, + }, + { + description: "password missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, passwordFlag) + }), + isValid: false, + }, + { + description: "required fields only", + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + displayNameFlag: testDisplayName, + intakeIdFlag: testIntakeId, + passwordFlag: testPassword, + userTypeFlag: testUserType, + }, + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.Labels = nil + // UserType has a default value in the command definition, so it should still be populated + model.UserType = utils.Ptr(string(intake.USERTYPE_INTAKE)) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiCreateIntakeUserRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + { + description: "no optionals", + model: fixtureInputModel(func(model *inputModel) { + model.Description = nil + model.Labels = nil + model.UserType = nil + }), + expectedRequest: fixtureRequest(func(request *intake.ApiCreateIntakeUserRequest) { + *request = (*request).CreateIntakeUserPayload(fixtureCreatePayload(func(payload *intake.CreateIntakeUserPayload) { + payload.Description = nil + payload.Labels = nil + payload.Type = nil + })) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + model *inputModel + projectLabel string + resp *intake.IntakeUserResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{ + model: fixtureInputModel(), + projectLabel: "my-project", + resp: &intake.IntakeUserResponse{Id: utils.Ptr("user-id-123")}, + }, + wantErr: false, + }, + { + name: "default output - async", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.Async = true + }), + projectLabel: "my-project", + resp: &intake.IntakeUserResponse{Id: utils.Ptr("user-id-123")}, + }, + wantErr: false, + }, + { + name: "json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: &intake.IntakeUserResponse{Id: utils.Ptr("user-id-123")}, + }, + wantErr: false, + }, + { + name: "nil response - default output", + args: args{ + model: fixtureInputModel(), + resp: nil, + }, + wantErr: false, + }, + { + name: "nil response - json output", + args: args{ + model: fixtureInputModel(func(model *inputModel) { + model.OutputFormat = print.JSONOutputFormat + }), + resp: nil, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.model, tt.args.projectLabel, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/user/delete/delete.go b/internal/cmd/beta/intake/user/delete/delete.go new file mode 100644 index 000000000..3dbb5670d --- /dev/null +++ b/internal/cmd/beta/intake/user/delete/delete.go @@ -0,0 +1,125 @@ +package delete + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" +) + +const ( + userIdArg = "USER_ID" + intakeIdFlag = "intake-id" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + IntakeId string + UserId string +} + +// NewCmd creates a new cobra command for deleting an Intake User +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("delete %s", userIdArg), + Short: "Deletes an Intake User", + Long: "Deletes an Intake User.", + Args: args.SingleArg(userIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Delete an Intake User with ID "xxx" for Intake "yyy"`, + `$ stackit beta intake user delete xxx --intake-id yyy`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + prompt := fmt.Sprintf("Are you sure you want to delete Intake User %q?", model.UserId) + err = p.Printer.PromptForConfirmation(prompt) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + if err = req.Execute(); err != nil { + return fmt.Errorf("delete Intake User: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + err := spinner.Run(p.Printer, "Deleting STACKIT Intake User", func() error { + _, err = wait.DeleteIntakeUserWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId, model.UserId).WaitWithContext(ctx) + return err + }) + if err != nil { + return fmt.Errorf("wait for STACKIT Intake User deletion: %w", err) + } + } + + operationState := "Deleted" + if model.Async { + operationState = "Triggered deletion of" + } + p.Printer.Outputf("%s STACKIT Intake User %s\n", operationState, model.UserId) + + return nil + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), intakeIdFlag, "Intake ID") + + err := flags.MarkFlagsRequired(cmd, intakeIdFlag) + cobra.CheckErr(err) +} + +// parseInput parses the command arguments and flags into a standardized model +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + userId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: flags.FlagToStringValue(p, cmd, intakeIdFlag), + UserId: userId, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to delete an Intake User +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiDeleteIntakeUserRequest { + req := apiClient.DeleteIntakeUser(ctx, model.ProjectId, model.Region, model.IntakeId, model.UserId) + return req +} diff --git a/internal/cmd/beta/intake/user/delete/delete_test.go b/internal/cmd/beta/intake/user/delete/delete_test.go new file mode 100644 index 000000000..714678bb1 --- /dev/null +++ b/internal/cmd/beta/intake/user/delete/delete_test.go @@ -0,0 +1,174 @@ +package delete + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +// Define a unique key for the context to avoid collisions +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + // testCtx is a dummy context for testing purposes + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + // testClient is a mock API client + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() + testUserId = uuid.NewString() +) + +// fixtureArgValues generates a slice of arguments for tests +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testUserId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +// fixtureFlagValues generates a map of flag values for tests +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + intakeIdFlag: testIntakeId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +// fixtureInputModel generates an input model for tests +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: testIntakeId, + UserId: testUserId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +// fixtureRequest generates an API request for tests +func fixtureRequest(mods ...func(request *intake.ApiDeleteIntakeUserRequest)) intake.ApiDeleteIntakeUserRequest { + request := testClient.DeleteIntakeUser(testCtx, testProjectId, testRegion, testIntakeId, testUserId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, intakeIdFlag) + }), + isValid: false, + }, + { + description: "intake id invalid", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[intakeIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "user id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiDeleteIntakeUserRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} diff --git a/internal/cmd/beta/intake/user/describe/describe.go b/internal/cmd/beta/intake/user/describe/describe.go new file mode 100644 index 000000000..7a6cae10c --- /dev/null +++ b/internal/cmd/beta/intake/user/describe/describe.go @@ -0,0 +1,134 @@ +package describe + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +const ( + userIdArg = "USER_ID" + intakeIdFlag = "intake-id" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + IntakeId string + UserId string +} + +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("describe %s", userIdArg), + Short: "Shows details of an Intake User", + Long: "Shows details of an Intake User.", + Args: args.SingleArg(userIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Get details of an Intake User with ID "xxx" for Intake "yyy"`, + `$ stackit beta intake user describe xxx --intake-id yyy`), + examples.NewExample( + `Get details of an Intake User with ID "xxx" in JSON format`, + `$ stackit beta intake user describe xxx --intake-id yyy --output-format json`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("get Intake User: %w", err) + } + + return outputResult(p.Printer, model.OutputFormat, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), intakeIdFlag, "Intake ID") + + err := flags.MarkFlagsRequired(cmd, intakeIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + userId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: flags.FlagToStringValue(p, cmd, intakeIdFlag), + UserId: userId, + } + + p.DebugInputModel(model) + return &model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiGetIntakeUserRequest { + req := apiClient.GetIntakeUser(ctx, model.ProjectId, model.Region, model.IntakeId, model.UserId) + return req +} + +func outputResult(p *print.Printer, outputFormat string, user *intake.IntakeUserResponse) error { + if user == nil { + return fmt.Errorf("received nil response, could not display details") + } + + return p.OutputResult(outputFormat, user, func() error { + table := tables.NewTable() + table.SetHeader("Attribute", "Value") + + table.AddRow("ID", user.GetId()) + table.AddRow("Name", user.GetDisplayName()) + table.AddRow("State", user.GetState()) + + if user.Type != nil { + table.AddRow("Type", *user.Type) + } + + table.AddRow("Username", user.GetUser()) + table.AddRow("Created", user.GetCreateTime()) + table.AddRow("Labels", user.GetLabels()) + + if description := user.GetDescription(); description != "" { + table.AddRow("Description", description) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + + return nil + }) +} diff --git a/internal/cmd/beta/intake/user/describe/describe_test.go b/internal/cmd/beta/intake/user/describe/describe_test.go new file mode 100644 index 000000000..2e2628c2e --- /dev/null +++ b/internal/cmd/beta/intake/user/describe/describe_test.go @@ -0,0 +1,211 @@ +package describe + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() + testUserId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{ + testUserId, + } + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + intakeIdFlag: testIntakeId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: testIntakeId, + UserId: testUserId, + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiGetIntakeUserRequest)) intake.ApiGetIntakeUserRequest { + request := testClient.GetIntakeUser(testCtx, testProjectId, testRegion, testIntakeId, testUserId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no arg values", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "no flag values", + argValues: fixtureArgValues(), + flagValues: map[string]string{}, + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, intakeIdFlag) + }), + isValid: false, + }, + { + description: "intake id invalid", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[intakeIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "user id invalid", + argValues: []string{"invalid-uuid"}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiGetIntakeUserRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + user *intake.IntakeUserResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", user: &intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, user: &intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "yaml output", + args: args{outputFormat: print.YAMLOutputFormat, user: &intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "nil user", + args: args{user: nil}, + wantErr: true, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.user); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/user/list/list.go b/internal/cmd/beta/intake/user/list/list.go new file mode 100644 index 000000000..cb6d56ca8 --- /dev/null +++ b/internal/cmd/beta/intake/user/list/list.go @@ -0,0 +1,157 @@ +package list + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/tables" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +const ( + intakeIdFlag = "intake-id" + limitFlag = "limit" +) + +// inputModel struct holds all the input parameters for the command +type inputModel struct { + *globalflags.GlobalFlagModel + IntakeId *string + Limit *int64 +} + +// NewCmd creates a new cobra command for listing Intake Users +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "list", + Short: "Lists all Intake Users", + Long: "Lists all Intake Users for a specific Intake.", + Args: args.NoArgs, + Example: examples.Build( + examples.NewExample( + `List all users for an Intake`, + `$ stackit beta intake user list --intake-id xxx`), + examples.NewExample( + `List all users for an Intake in JSON format`, + `$ stackit beta intake user list --intake-id xxx --output-format json`), + examples.NewExample( + `List up to 5 users for an Intake`, + `$ stackit beta intake user list --intake-id xxx --limit 5`), + ), + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("list Intake Users: %w", err) + } + users := resp.GetIntakeUsers() + + // Truncate output + if model.Limit != nil && len(users) > int(*model.Limit) { + users = users[:*model.Limit] + } + + projectLabel := model.ProjectId + if len(users) == 0 { + projectLabel, err = projectname.GetProjectName(ctx, p.Printer, p.CliVersion, cmd) + if err != nil { + p.Printer.Debug(print.ErrorLevel, "get project name: %v", err) + } + } + + return outputResult(p.Printer, model.OutputFormat, projectLabel, *model.IntakeId, users) + }, + } + configureFlags(cmd) + return cmd +} + +// configureFlags adds the flags to the command +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), intakeIdFlag, "Intake ID") + cmd.Flags().Int64(limitFlag, 0, "Maximum number of entries to list") + + err := flags.MarkFlagsRequired(cmd, intakeIdFlag) + cobra.CheckErr(err) +} + +// parseInput parses the command flags into a standardized model +func parseInput(p *print.Printer, cmd *cobra.Command) (*inputModel, error) { + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + limit := flags.FlagToInt64Pointer(p, cmd, limitFlag) + if limit != nil && *limit < 1 { + return nil, &cliErr.FlagValidationError{ + Flag: limitFlag, + Details: "must be greater than 0", + } + } + + model := inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: flags.FlagToStringPointer(p, cmd, intakeIdFlag), + Limit: limit, + } + + p.DebugInputModel(model) + return &model, nil +} + +// buildRequest creates the API request to list Intake Users +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiListIntakeUsersRequest { + req := apiClient.ListIntakeUsers(ctx, model.ProjectId, model.Region, *model.IntakeId) + return req +} + +// outputResult formats the API response and prints it to the console +func outputResult(p *print.Printer, outputFormat, projectLabel, intakeId string, users []intake.IntakeUserResponse) error { + return p.OutputResult(outputFormat, users, func() error { + if len(users) == 0 { + p.Outputf("No intake users found for intake %q in project %q\n", intakeId, projectLabel) + return nil + } + + table := tables.NewTable() + table.SetHeader("ID", "DISPLAY NAME", "TYPE", "STATE") + for _, user := range users { + table.AddRow( + user.GetId(), + user.GetDisplayName(), + utils.PtrString(user.Type), + user.GetState(), + ) + } + err := table.Display(p) + if err != nil { + return fmt.Errorf("render table: %w", err) + } + return nil + }) +} diff --git a/internal/cmd/beta/intake/user/list/list_test.go b/internal/cmd/beta/intake/user/list/list_test.go new file mode 100644 index 000000000..9d60462c1 --- /dev/null +++ b/internal/cmd/beta/intake/user/list/list_test.go @@ -0,0 +1,225 @@ +package list + +import ( + "context" + "strconv" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() + testLimit = int64(5) +) + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + intakeIdFlag: testIntakeId, + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: utils.Ptr(testIntakeId), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiListIntakeUsersRequest)) intake.ApiListIntakeUsersRequest { + request := testClient.ListIntakeUsers(testCtx, testProjectId, testRegion, testIntakeId) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "with limit", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = strconv.FormatInt(testLimit, 10) + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Limit = utils.Ptr(testLimit) + }), + }, + { + description: "project id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake id missing", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, intakeIdFlag) + }), + isValid: false, + }, + { + description: "intake id invalid", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[intakeIdFlag] = "invalid-uuid" + }), + isValid: false, + }, + { + description: "limit is zero", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "0" + }), + isValid: false, + }, + { + description: "limit is negative", + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[limitFlag] = "-1" + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, func(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { + return parseInput(p, cmd) + }, tt.expectedModel, nil, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedRequest intake.ApiListIntakeUsersRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedRequest: fixtureRequest(), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(request, tt.expectedRequest, + cmp.AllowUnexported(tt.expectedRequest), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + intakeId string + users []intake.IntakeUserResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", intakeId: testIntakeId, users: []intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, intakeId: testIntakeId, users: []intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "empty slice", + args: args{intakeId: testIntakeId, users: []intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "nil slice", + args: args{intakeId: testIntakeId, users: nil}, + wantErr: false, + }, + { + name: "empty user in slice", + args: args{ + intakeId: testIntakeId, + users: []intake.IntakeUserResponse{{}}, + }, + wantErr: false, + }, + { + name: "with project label", + args: args{ + projectLabel: "my-project", + intakeId: testIntakeId, + users: []intake.IntakeUserResponse{}, + }, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, tt.args.outputFormat, tt.args.projectLabel, tt.args.intakeId, tt.args.users); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/user/update/update.go b/internal/cmd/beta/intake/user/update/update.go new file mode 100644 index 000000000..ba57c4a22 --- /dev/null +++ b/internal/cmd/beta/intake/user/update/update.go @@ -0,0 +1,169 @@ +package update + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" +) + +const ( + userIdArg = "USER_ID" + + intakeIdFlag = "intake-id" + displayNameFlag = "display-name" + descriptionFlag = "description" + passwordFlag = "password" + userTypeFlag = "type" + labelsFlag = "labels" +) + +type inputModel struct { + *globalflags.GlobalFlagModel + IntakeId string + UserId string + DisplayName *string + Description *string + Password *string + UserType *string + Labels *map[string]string +} + +func NewCmd(p *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: fmt.Sprintf("update %s", userIdArg), + Short: "Updates an Intake User", + Long: "Updates an Intake User. Only the specified fields are updated.", + Args: args.SingleArg(userIdArg, utils.ValidateUUID), + Example: examples.Build( + examples.NewExample( + `Update the display name of an Intake User`, + `$ stackit beta intake user update xxx --intake-id yyy --display-name "new-user-name"`), + examples.NewExample( + `Update the password and description for an Intake User`, + `$ stackit beta intake user update xxx --intake-id yyy --password "NewSecret123\!" --description "Updated description"`), + ), + RunE: func(cmd *cobra.Command, args []string) error { + ctx := context.Background() + model, err := parseInput(p.Printer, cmd, args) + if err != nil { + return err + } + + // Configure API client + apiClient, err := client.ConfigureClient(p.Printer, p.CliVersion) + if err != nil { + return err + } + + // Call API + req := buildRequest(ctx, model, apiClient) + resp, err := req.Execute() + if err != nil { + return fmt.Errorf("update Intake User: %w", err) + } + + // Wait for async operation, if async mode not enabled + if !model.Async { + err := spinner.Run(p.Printer, "Updating STACKIT Intake User", func() error { + _, err = wait.CreateOrUpdateIntakeUserWaitHandler(ctx, apiClient, model.ProjectId, model.Region, model.IntakeId, model.UserId).WaitWithContext(ctx) + return err + }) + + if err != nil { + return fmt.Errorf("wait for STACKIT Intake User update: %w", err) + } + } + + return outputResult(p.Printer, model, resp) + }, + } + configureFlags(cmd) + return cmd +} + +func configureFlags(cmd *cobra.Command) { + cmd.Flags().Var(flags.UUIDFlag(), intakeIdFlag, "Intake ID") + cmd.Flags().String(displayNameFlag, "", "Display name") + cmd.Flags().String(descriptionFlag, "", "Description") + cmd.Flags().String(passwordFlag, "", "Password for the user. Must contain lower, upper, number, and special characters (min 12 chars)") + cmd.Flags().String(userTypeFlag, "", "Type of user. One of 'intake' or 'dead-letter'") + cmd.Flags().StringToString(labelsFlag, nil, `Labels in key=value format, separated by commas. Example: --labels "key1=value1,key2=value2".`) + + err := flags.MarkFlagsRequired(cmd, intakeIdFlag) + cobra.CheckErr(err) +} + +func parseInput(p *print.Printer, cmd *cobra.Command, inputArgs []string) (*inputModel, error) { + userId := inputArgs[0] + + globalFlags := globalflags.Parse(p, cmd) + if globalFlags.ProjectId == "" { + return nil, &cliErr.ProjectIdError{} + } + + model := &inputModel{ + GlobalFlagModel: globalFlags, + IntakeId: flags.FlagToStringValue(p, cmd, intakeIdFlag), + UserId: userId, + DisplayName: flags.FlagToStringPointer(p, cmd, displayNameFlag), + Description: flags.FlagToStringPointer(p, cmd, descriptionFlag), + Password: flags.FlagToStringPointer(p, cmd, passwordFlag), + UserType: flags.FlagToStringPointer(p, cmd, userTypeFlag), + Labels: flags.FlagToStringToStringPointer(p, cmd, labelsFlag), + } + + if model.DisplayName == nil && model.Description == nil && model.Password == nil && model.UserType == nil && model.Labels == nil { + return nil, &cliErr.EmptyUpdateError{} + } + + p.DebugInputModel(model) + return model, nil +} + +func buildRequest(ctx context.Context, model *inputModel, apiClient *intake.APIClient) intake.ApiUpdateIntakeUserRequest { + req := apiClient.UpdateIntakeUser(ctx, model.ProjectId, model.Region, model.IntakeId, model.UserId) + + payload := intake.UpdateIntakeUserPayload{ + DisplayName: model.DisplayName, + Description: model.Description, + Password: model.Password, + Labels: model.Labels, + } + + if model.UserType != nil { + userType := intake.UserType(*model.UserType) + payload.Type = &userType + } + + req = req.UpdateIntakeUserPayload(payload) + return req +} + +func outputResult(p *print.Printer, model *inputModel, resp *intake.IntakeUserResponse) error { + return p.OutputResult(model.OutputFormat, resp, func() error { + if resp == nil { + p.Outputf("Triggered update of Intake User for intake %q, but no user ID was returned.\n", model.IntakeId) + return nil + } + + operationState := "Updated" + if model.Async { + operationState = "Triggered update of" + } + p.Outputf("%s Intake User for intake %q. User ID: %s\n", operationState, model.IntakeId, utils.PtrString(resp.Id)) + return nil + }) +} diff --git a/internal/cmd/beta/intake/user/update/update_test.go b/internal/cmd/beta/intake/user/update/update_test.go new file mode 100644 index 000000000..cd95b5bde --- /dev/null +++ b/internal/cmd/beta/intake/user/update/update_test.go @@ -0,0 +1,259 @@ +package update + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/intake" +) + +type testCtxKey struct{} + +const ( + testRegion = "eu01" +) + +var ( + testCtx = context.WithValue(context.Background(), testCtxKey{}, "foo") + testClient = &intake.APIClient{} + testProjectId = uuid.NewString() + testIntakeId = uuid.NewString() + testUserId = uuid.NewString() +) + +func fixtureArgValues(mods ...func(argValues []string)) []string { + argValues := []string{testUserId} + for _, mod := range mods { + mod(argValues) + } + return argValues +} + +func fixtureFlagValues(mods ...func(flagValues map[string]string)) map[string]string { + flagValues := map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + intakeIdFlag: testIntakeId, + displayNameFlag: "new-display-name", + } + for _, mod := range mods { + mod(flagValues) + } + return flagValues +} + +func fixtureInputModel(mods ...func(model *inputModel)) *inputModel { + model := &inputModel{ + GlobalFlagModel: &globalflags.GlobalFlagModel{ + ProjectId: testProjectId, + Region: testRegion, + Verbosity: globalflags.VerbosityDefault, + }, + IntakeId: testIntakeId, + UserId: testUserId, + DisplayName: utils.Ptr("new-display-name"), + } + for _, mod := range mods { + mod(model) + } + return model +} + +func fixtureRequest(mods ...func(request *intake.ApiUpdateIntakeUserRequest)) intake.ApiUpdateIntakeUserRequest { + request := testClient.UpdateIntakeUser(testCtx, testProjectId, testRegion, testIntakeId, testUserId) + payload := intake.UpdateIntakeUserPayload{ + DisplayName: utils.Ptr("new-display-name"), + } + request = request.UpdateIntakeUserPayload(payload) + for _, mod := range mods { + mod(&request) + } + return request +} + +func TestParseInput(t *testing.T) { + tests := []struct { + description string + argValues []string + flagValues map[string]string + isValid bool + expectedModel *inputModel + }{ + { + description: "base", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(), + isValid: true, + expectedModel: fixtureInputModel(), + }, + { + description: "no optional flags provided", + argValues: fixtureArgValues(), + flagValues: map[string]string{ + globalflags.ProjectIdFlag: testProjectId, + globalflags.RegionFlag: testRegion, + intakeIdFlag: testIntakeId, + }, + isValid: false, + }, + { + description: "update all fields", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + flagValues[descriptionFlag] = "new description" + flagValues[labelsFlag] = "env=prod,team=sre" + flagValues[userTypeFlag] = "dead-letter" + flagValues[passwordFlag] = "NewSecret123!" + }), + isValid: true, + expectedModel: fixtureInputModel(func(model *inputModel) { + model.Description = utils.Ptr("new description") + model.Labels = utils.Ptr(map[string]string{"env": "prod", "team": "sre"}) + model.UserType = utils.Ptr("dead-letter") + model.Password = utils.Ptr("NewSecret123!") + }), + }, + { + description: "no args", + argValues: []string{}, + flagValues: fixtureFlagValues(), + isValid: false, + }, + { + description: "project id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, globalflags.ProjectIdFlag) + }), + isValid: false, + }, + { + description: "intake-id missing", + argValues: fixtureArgValues(), + flagValues: fixtureFlagValues(func(flagValues map[string]string) { + delete(flagValues, intakeIdFlag) + }), + isValid: false, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + testutils.TestParseInput(t, NewCmd, parseInput, tt.expectedModel, tt.argValues, tt.flagValues, tt.isValid) + }) + } +} + +func TestBuildRequest(t *testing.T) { + tests := []struct { + description string + model *inputModel + expectedReq intake.ApiUpdateIntakeUserRequest + }{ + { + description: "base", + model: fixtureInputModel(), + expectedReq: fixtureRequest(), + }, + { + description: "update description", + model: fixtureInputModel(func(model *inputModel) { + model.DisplayName = nil + model.Description = utils.Ptr("new-desc") + }), + expectedReq: fixtureRequest(func(request *intake.ApiUpdateIntakeUserRequest) { + payload := intake.UpdateIntakeUserPayload{ + Description: utils.Ptr("new-desc"), + } + *request = (*request).UpdateIntakeUserPayload(payload) + }), + }, + { + description: "update all fields", + model: fixtureInputModel(func(model *inputModel) { + model.DisplayName = utils.Ptr("another-name") + model.Description = utils.Ptr("final-desc") + model.Labels = utils.Ptr(map[string]string{"a": "b"}) + model.UserType = utils.Ptr("dead-letter") + model.Password = utils.Ptr("Secret123!") + }), + expectedReq: fixtureRequest(func(request *intake.ApiUpdateIntakeUserRequest) { + userType := intake.UserType("dead-letter") + payload := intake.UpdateIntakeUserPayload{ + DisplayName: utils.Ptr("another-name"), + Description: utils.Ptr("final-desc"), + Labels: utils.Ptr(map[string]string{"a": "b"}), + Type: &userType, + Password: utils.Ptr("Secret123!"), + } + *request = (*request).UpdateIntakeUserPayload(payload) + }), + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + request := buildRequest(testCtx, tt.model, testClient) + + diff := cmp.Diff(tt.expectedReq, request, + cmp.AllowUnexported(request), + cmpopts.EquateComparable(testCtx), + ) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + +func TestOutputResult(t *testing.T) { + type args struct { + outputFormat string + projectLabel string + intakeId string + resp *intake.IntakeUserResponse + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "default output", + args: args{outputFormat: "default", projectLabel: "my-project", intakeId: "intake-id-123", resp: &intake.IntakeUserResponse{}}, + wantErr: false, + }, + { + name: "json output", + args: args{outputFormat: print.JSONOutputFormat, resp: &intake.IntakeUserResponse{Id: utils.Ptr("user-id-123")}}, + wantErr: false, + }, + { + name: "nil response", + args: args{outputFormat: print.JSONOutputFormat, resp: nil}, + wantErr: false, + }, + { + name: "nil response - default output", + args: args{outputFormat: "default", resp: nil}, + wantErr: false, + }, + } + p := print.NewPrinter() + p.Cmd = NewCmd(&types.CmdParams{Printer: p}) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := outputResult(p, &inputModel{GlobalFlagModel: &globalflags.GlobalFlagModel{OutputFormat: tt.args.outputFormat}, IntakeId: tt.args.intakeId}, tt.args.resp); (err != nil) != tt.wantErr { + t.Errorf("outputResult() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/internal/cmd/beta/intake/user/user.go b/internal/cmd/beta/intake/user/user.go new file mode 100644 index 000000000..79ad83d79 --- /dev/null +++ b/internal/cmd/beta/intake/user/user.go @@ -0,0 +1,35 @@ +package user + +import ( + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/create" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/delete" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/describe" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/list" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/update" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" +) + +func NewCmd(params *types.CmdParams) *cobra.Command { + cmd := &cobra.Command{ + Use: "user", + Short: "Provides functionality for Intake Users", + Long: "Provides functionality for Intake Users.", + Args: args.NoArgs, + Run: utils.CmdHelp, + } + + addSubcommands(cmd, params) + return cmd +} + +func addSubcommands(cmd *cobra.Command, params *types.CmdParams) { + // Pass the params down to each action command + cmd.AddCommand(create.NewCmd(params)) + cmd.AddCommand(delete.NewCmd(params)) + cmd.AddCommand(describe.NewCmd(params)) + cmd.AddCommand(list.NewCmd(params)) + cmd.AddCommand(update.NewCmd(params)) +} From c8bf58951665bcaefea12a2bb5f212273fa03a62 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:06:48 +0200 Subject: [PATCH 419/422] bump github.com/stackitcloud/stackit-sdk-go/services/ske (#1352) --- go.mod | 2 +- go.sum | 4 +- .../cmd/ske/cluster/create/create_test.go | 40 +++++++++++++------ .../cmd/ske/cluster/update/update_test.go | 40 +++++++++++++------ 4 files changed, 57 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 8d49310e1..3c1c07cf6 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/stackitcloud/stackit-sdk-go/services/serverupdate v1.2.6 github.com/stackitcloud/stackit-sdk-go/services/serviceaccount v0.12.0 github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 - github.com/stackitcloud/stackit-sdk-go/services/ske v1.9.0 + github.com/stackitcloud/stackit-sdk-go/services/ske v1.11.0 github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 github.com/zalando/go-keyring v0.2.6 golang.org/x/mod v0.33.0 diff --git a/go.sum b/go.sum index ad605a10d..23665a67e 100644 --- a/go.sum +++ b/go.sum @@ -654,8 +654,8 @@ github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7 h1:M2PY github.com/stackitcloud/stackit-sdk-go/services/serviceenablement v1.2.7/go.mod h1:jitkQuP2K/SH63Qor0C4pcqz1GDCy/lK2H4t8/VDse4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0 h1:ofdGO2dGH6ywKbIVxaxRVal3jWX9WlcHSm5BTud5bC4= github.com/stackitcloud/stackit-sdk-go/services/sfs v0.4.0/go.mod h1:r5lBwzJpJe2xBIYctkVIIpaZ41Y6vUEpkmsWR2VoQJs= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.9.0 h1:pNEIQdUJMP5oMsBV/U9ENGBbzsFedb/3ZRC+Mw7bcYc= -github.com/stackitcloud/stackit-sdk-go/services/ske v1.9.0/go.mod h1:VW6csYWkytVufoiDMquVEdyF0amYICzOzSe6ynRRDsI= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.11.0 h1:QoKyQPe8FqDqJLNgE5uRlZ/y1c1GUxjV1DDLu5QEBD8= +github.com/stackitcloud/stackit-sdk-go/services/ske v1.11.0/go.mod h1:KhVYCR58wETqdI7Quwhe3OR3BhB2T/b7DzaMsfDnr8g= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3 h1:AQrcr+qeIuZob+3TT2q1L4WOPtpsu5SEpkTnOUHDqfE= github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex v1.4.3/go.mod h1:8BBGC69WFXWWmKgzSjgE4HvsI7pEgO0RN2cASwuPJ18= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= diff --git a/internal/cmd/ske/cluster/create/create_test.go b/internal/cmd/ske/cluster/create/create_test.go index 1dd6b233a..896e9421a 100644 --- a/internal/cmd/ske/cluster/create/create_test.go +++ b/internal/cmd/ske/cluster/create/create_test.go @@ -32,45 +32,59 @@ const testRegion = "eu01" var testPayload = &ske.CreateOrUpdateClusterPayload{ Kubernetes: ske.Kubernetes{ - Version: "1.25.15", + Version: "1.25.15", + AdditionalProperties: map[string]any{}, }, Nodepools: []ske.Nodepool{ { Name: "np-name", Machine: ske.Machine{ Image: ske.Image{ - Name: "flatcar", - Version: "3760.2.1", + Name: "flatcar", + Version: "3760.2.1", + AdditionalProperties: map[string]any{}, }, - Type: "b1.2", + Type: "b1.2", + AdditionalProperties: map[string]any{}, }, Minimum: int32(1), Maximum: int32(2), MaxSurge: utils.Ptr(int32(1)), Volume: ske.Volume{ - Type: utils.Ptr("storage_premium_perf0"), - Size: int32(40), + Type: utils.Ptr("storage_premium_perf0"), + Size: int32(40), + AdditionalProperties: map[string]any{}, }, AvailabilityZones: []string{"eu01-3"}, - Cri: &ske.CRI{Name: utils.Ptr("containerd")}, + Cri: &ske.CRI{ + Name: utils.Ptr("containerd"), + AdditionalProperties: map[string]any{}, + }, + AdditionalProperties: map[string]any{}, }, }, Extensions: &ske.Extension{ Acl: &ske.ACL{ - Enabled: true, - AllowedCidrs: []string{"0.0.0.0/0"}, + Enabled: true, + AllowedCidrs: []string{"0.0.0.0/0"}, + AdditionalProperties: map[string]any{}, }, + AdditionalProperties: map[string]any{}, }, Maintenance: &ske.Maintenance{ AutoUpdate: ske.MaintenanceAutoUpdate{ - KubernetesVersion: utils.Ptr(true), - MachineImageVersion: utils.Ptr(true), + KubernetesVersion: utils.Ptr(true), + MachineImageVersion: utils.Ptr(true), + AdditionalProperties: map[string]any{}, }, TimeWindow: ske.TimeWindow{ - End: time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), - Start: time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + End: time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + Start: time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + AdditionalProperties: map[string]any{}, }, + AdditionalProperties: map[string]any{}, }, + AdditionalProperties: map[string]any{}, } func fixtureArgValues(mods ...func(argValues []string)) []string { diff --git a/internal/cmd/ske/cluster/update/update_test.go b/internal/cmd/ske/cluster/update/update_test.go index 4b06392ff..e4cad4e35 100644 --- a/internal/cmd/ske/cluster/update/update_test.go +++ b/internal/cmd/ske/cluster/update/update_test.go @@ -31,45 +31,59 @@ const testRegion = "eu01" var testPayload = ske.CreateOrUpdateClusterPayload{ Kubernetes: ske.Kubernetes{ - Version: "1.25.15", + Version: "1.25.15", + AdditionalProperties: map[string]any{}, }, Nodepools: []ske.Nodepool{ { Name: "np-name", Machine: ske.Machine{ Image: ske.Image{ - Name: "flatcar", - Version: "3760.2.1", + Name: "flatcar", + Version: "3760.2.1", + AdditionalProperties: map[string]any{}, }, - Type: "b1.2", + Type: "b1.2", + AdditionalProperties: map[string]any{}, }, Minimum: int32(1), Maximum: int32(2), MaxSurge: utils.Ptr(int32(1)), Volume: ske.Volume{ - Type: utils.Ptr("storage_premium_perf0"), - Size: int32(40), + Type: utils.Ptr("storage_premium_perf0"), + Size: int32(40), + AdditionalProperties: map[string]any{}, }, AvailabilityZones: []string{"eu01-3"}, - Cri: &ske.CRI{Name: utils.Ptr("containerd")}, + Cri: &ske.CRI{ + Name: utils.Ptr("containerd"), + AdditionalProperties: map[string]any{}, + }, + AdditionalProperties: map[string]any{}, }, }, Extensions: &ske.Extension{ Acl: &ske.ACL{ - Enabled: true, - AllowedCidrs: []string{"0.0.0.0/0"}, + Enabled: true, + AllowedCidrs: []string{"0.0.0.0/0"}, + AdditionalProperties: map[string]any{}, }, + AdditionalProperties: map[string]any{}, }, Maintenance: &ske.Maintenance{ AutoUpdate: ske.MaintenanceAutoUpdate{ - KubernetesVersion: utils.Ptr(true), - MachineImageVersion: utils.Ptr(true), + KubernetesVersion: utils.Ptr(true), + MachineImageVersion: utils.Ptr(true), + AdditionalProperties: map[string]any{}, }, TimeWindow: ske.TimeWindow{ - End: time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), - Start: time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + End: time.Date(0, 1, 1, 5, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + Start: time.Date(0, 1, 1, 3, 0, 0, 0, time.FixedZone("test-zone", 2*60*60)), + AdditionalProperties: map[string]any{}, }, + AdditionalProperties: map[string]any{}, }, + AdditionalProperties: map[string]any{}, } func fixtureArgValues(mods ...func(argValues []string)) []string { From 72e503b593b1f99cdc2bc18ae5e23e44d883809c Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Wed, 1 Apr 2026 15:23:27 +0200 Subject: [PATCH 420/422] fix(lint) disable rangeValCopy gocritic rule (#1355) Short running process, memory pressure does not matter here. --- golang-ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/golang-ci.yaml b/golang-ci.yaml index 0a367d55a..914c48614 100644 --- a/golang-ci.yaml +++ b/golang-ci.yaml @@ -32,6 +32,7 @@ linters: - typeDefFirst - ifElseChain - dupImport # https://github.com/go-critic/go-critic/issues/845 + - rangeValCopy enabled-tags: - performance - style From 29a5cc3a6f50d7a4f62a75870d057794c9ccb022 Mon Sep 17 00:00:00 2001 From: cgoetz-inovex Date: Thu, 2 Apr 2026 11:54:19 +0200 Subject: [PATCH 421/422] chore(fmt) configure local prefixes for goimports (#1357) * chore(fmt) configure local prefixes for goimports * fix(fmt) use goimports in `make fmt` via golangci-lint --- Makefile | 2 +- golang-ci.yaml | 5 +++++ internal/cmd/affinity-groups/affinity-groups.go | 1 + internal/cmd/affinity-groups/create/create.go | 3 ++- internal/cmd/affinity-groups/create/create_test.go | 3 ++- internal/cmd/affinity-groups/delete/delete.go | 3 ++- internal/cmd/affinity-groups/delete/delete_test.go | 3 ++- internal/cmd/affinity-groups/describe/describe.go | 3 ++- internal/cmd/affinity-groups/describe/describe_test.go | 3 ++- internal/cmd/affinity-groups/list/list.go | 3 ++- internal/cmd/affinity-groups/list/list_test.go | 3 ++- .../activate-service-account/activate_service_account.go | 1 + .../activate_service_account_test.go | 3 ++- internal/cmd/auth/get-access-token/get_access_token.go | 1 + internal/cmd/beta/alb/create/create.go | 1 + internal/cmd/beta/alb/create/create_test.go | 3 ++- internal/cmd/beta/alb/list/list.go | 3 ++- internal/cmd/beta/alb/list/list_test.go | 1 + .../alb/observability-credentials/delete/delete_test.go | 3 ++- .../observability-credentials/observability-credentials.go | 1 + internal/cmd/beta/alb/plans/plans.go | 3 ++- internal/cmd/beta/alb/pool/update/update.go | 1 + internal/cmd/beta/alb/pool/update/update_test.go | 3 ++- internal/cmd/beta/alb/quotas/quotas.go | 3 ++- internal/cmd/beta/alb/template/template.go | 3 ++- internal/cmd/beta/alb/update/update.go | 1 + internal/cmd/beta/alb/update/update_test.go | 3 ++- internal/cmd/beta/cdn/cdn.go | 1 + internal/cmd/beta/cdn/distribution/create/create.go | 5 +++-- internal/cmd/beta/cdn/distribution/create/create_test.go | 7 ++++--- internal/cmd/beta/cdn/distribution/delete/delete.go | 3 ++- internal/cmd/beta/cdn/distribution/delete/delete_test.go | 3 ++- internal/cmd/beta/cdn/distribution/describe/describe.go | 5 +++-- .../cmd/beta/cdn/distribution/describe/describe_test.go | 3 ++- internal/cmd/beta/cdn/distribution/distribution.go | 1 + internal/cmd/beta/cdn/distribution/list/list.go | 5 +++-- internal/cmd/beta/cdn/distribution/list/list_test.go | 5 +++-- internal/cmd/beta/cdn/distribution/update/update.go | 5 +++-- internal/cmd/beta/cdn/distribution/update/update_test.go | 5 +++-- internal/cmd/beta/edge/edge.go | 1 + internal/cmd/beta/edge/instance/create/create.go | 5 +++-- internal/cmd/beta/edge/instance/create/create_test.go | 3 ++- internal/cmd/beta/edge/instance/delete/delete.go | 5 +++-- internal/cmd/beta/edge/instance/delete/delete_test.go | 5 +++-- internal/cmd/beta/edge/instance/describe/describe.go | 3 ++- internal/cmd/beta/edge/instance/describe/describe_test.go | 5 +++-- internal/cmd/beta/edge/instance/list/list.go | 3 ++- internal/cmd/beta/edge/instance/list/list_test.go | 3 ++- internal/cmd/beta/edge/instance/update/update.go | 4 +++- internal/cmd/beta/edge/instance/update/update_test.go | 5 +++-- internal/cmd/beta/edge/kubeconfig/create/create.go | 7 ++++--- internal/cmd/beta/edge/kubeconfig/create/create_test.go | 5 +++-- internal/cmd/beta/edge/plans/list/list.go | 3 ++- internal/cmd/beta/edge/plans/list/list_test.go | 3 ++- internal/cmd/beta/edge/token/create/create.go | 7 ++++--- internal/cmd/beta/edge/token/create/create_test.go | 5 +++-- internal/cmd/beta/intake/create/create.go | 5 +++-- internal/cmd/beta/intake/create/create_test.go | 3 ++- internal/cmd/beta/intake/delete/delete.go | 3 ++- internal/cmd/beta/intake/delete/delete_test.go | 3 ++- internal/cmd/beta/intake/describe/describe_test.go | 3 ++- internal/cmd/beta/intake/intake.go | 1 + internal/cmd/beta/intake/list/list_test.go | 3 ++- internal/cmd/beta/intake/runner/create/create_test.go | 3 ++- internal/cmd/beta/intake/runner/delete/delete.go | 5 +++-- internal/cmd/beta/intake/runner/delete/delete_test.go | 3 ++- internal/cmd/beta/intake/runner/describe/describe_test.go | 3 ++- internal/cmd/beta/intake/runner/list/list.go | 3 ++- internal/cmd/beta/intake/runner/list/list_test.go | 3 ++- internal/cmd/beta/intake/runner/runner.go | 1 + internal/cmd/beta/intake/runner/update/update.go | 5 +++-- internal/cmd/beta/intake/runner/update/update_test.go | 3 ++- internal/cmd/beta/intake/update/update_test.go | 3 ++- internal/cmd/beta/intake/user/create/create.go | 5 +++-- internal/cmd/beta/intake/user/create/create_test.go | 3 ++- internal/cmd/beta/intake/user/delete/delete.go | 5 +++-- internal/cmd/beta/intake/user/delete/delete_test.go | 3 ++- internal/cmd/beta/intake/user/describe/describe.go | 3 ++- internal/cmd/beta/intake/user/describe/describe_test.go | 3 ++- internal/cmd/beta/intake/user/list/list.go | 3 ++- internal/cmd/beta/intake/user/list/list_test.go | 3 ++- internal/cmd/beta/intake/user/update/update.go | 5 +++-- internal/cmd/beta/intake/user/update/update_test.go | 3 ++- internal/cmd/beta/intake/user/user.go | 1 + internal/cmd/beta/sfs/export-policy/create/create.go | 3 ++- internal/cmd/beta/sfs/export-policy/create/create_test.go | 3 ++- internal/cmd/beta/sfs/export-policy/delete/delete.go | 3 ++- internal/cmd/beta/sfs/export-policy/delete/delete_test.go | 3 ++- internal/cmd/beta/sfs/export-policy/describe/describe.go | 3 ++- .../cmd/beta/sfs/export-policy/describe/describe_test.go | 3 ++- internal/cmd/beta/sfs/export-policy/list/list.go | 3 ++- internal/cmd/beta/sfs/export-policy/list/list_test.go | 3 ++- internal/cmd/beta/sfs/export-policy/update/update.go | 3 ++- internal/cmd/beta/sfs/export-policy/update/update_test.go | 3 ++- internal/cmd/beta/sfs/performance-class/list/list.go | 3 ++- internal/cmd/beta/sfs/performance-class/list/list_test.go | 3 ++- internal/cmd/beta/sfs/resource-pool/create/create.go | 5 +++-- internal/cmd/beta/sfs/resource-pool/create/create_test.go | 3 ++- internal/cmd/beta/sfs/resource-pool/delete/delete.go | 5 +++-- internal/cmd/beta/sfs/resource-pool/delete/delete_test.go | 3 ++- internal/cmd/beta/sfs/resource-pool/describe/describe.go | 3 ++- .../cmd/beta/sfs/resource-pool/describe/describe_test.go | 3 ++- internal/cmd/beta/sfs/resource-pool/list/list.go | 3 ++- internal/cmd/beta/sfs/resource-pool/list/list_test.go | 3 ++- internal/cmd/beta/sfs/resource-pool/update/update.go | 5 +++-- internal/cmd/beta/sfs/resource-pool/update/update_test.go | 3 ++- internal/cmd/beta/sfs/share/create/create.go | 5 +++-- internal/cmd/beta/sfs/share/create/create_test.go | 3 ++- internal/cmd/beta/sfs/share/delete/delete.go | 5 +++-- internal/cmd/beta/sfs/share/delete/delete_test.go | 3 ++- internal/cmd/beta/sfs/share/describe/describe.go | 3 ++- internal/cmd/beta/sfs/share/describe/describe_test.go | 3 ++- internal/cmd/beta/sfs/share/list/list.go | 3 ++- internal/cmd/beta/sfs/share/list/list_test.go | 3 ++- internal/cmd/beta/sfs/share/update/update.go | 5 +++-- internal/cmd/beta/sfs/share/update/update_test.go | 3 ++- internal/cmd/beta/sfs/snapshot/create/create.go | 3 ++- internal/cmd/beta/sfs/snapshot/create/create_test.go | 3 ++- internal/cmd/beta/sfs/snapshot/delete/delete.go | 3 ++- internal/cmd/beta/sfs/snapshot/delete/delete_test.go | 3 ++- internal/cmd/beta/sfs/snapshot/describe/describe.go | 3 ++- internal/cmd/beta/sfs/snapshot/describe/describe_test.go | 3 ++- internal/cmd/beta/sfs/snapshot/list/list.go | 3 ++- internal/cmd/beta/sfs/snapshot/list/list_test.go | 3 ++- internal/cmd/beta/sqlserverflex/database/create/create.go | 3 ++- .../cmd/beta/sqlserverflex/database/create/create_test.go | 3 ++- .../cmd/beta/sqlserverflex/database/delete/delete_test.go | 3 ++- .../cmd/beta/sqlserverflex/database/describe/describe.go | 3 ++- .../beta/sqlserverflex/database/describe/describe_test.go | 3 ++- internal/cmd/beta/sqlserverflex/database/list/list.go | 3 ++- internal/cmd/beta/sqlserverflex/database/list/list_test.go | 3 ++- .../cmd/beta/sqlserverflex/instance/create/create_test.go | 3 ++- .../beta/sqlserverflex/instance/describe/describe_test.go | 3 ++- internal/cmd/beta/sqlserverflex/instance/list/list.go | 3 ++- internal/cmd/beta/sqlserverflex/instance/list/list_test.go | 3 ++- .../cmd/beta/sqlserverflex/instance/update/update_test.go | 3 ++- internal/cmd/beta/sqlserverflex/options/options_test.go | 3 ++- internal/cmd/beta/sqlserverflex/user/create/create.go | 3 ++- internal/cmd/beta/sqlserverflex/user/create/create_test.go | 3 ++- .../cmd/beta/sqlserverflex/user/describe/describe_test.go | 3 ++- internal/cmd/beta/sqlserverflex/user/list/list.go | 3 ++- internal/cmd/beta/sqlserverflex/user/list/list_test.go | 3 ++- .../user/reset-password/reset_password_test.go | 3 ++- internal/cmd/config/list/list.go | 1 + internal/cmd/config/profile/import/import.go | 1 + internal/cmd/curl/curl_test.go | 1 + internal/cmd/dns/record-set/create/create.go | 6 ++++-- internal/cmd/dns/record-set/create/create_test.go | 3 ++- internal/cmd/dns/record-set/describe/describe_test.go | 3 ++- internal/cmd/dns/record-set/list/list.go | 3 ++- internal/cmd/dns/record-set/list/list_test.go | 5 +++-- internal/cmd/dns/zone/clone/clone_test.go | 3 ++- internal/cmd/dns/zone/create/create_test.go | 3 ++- internal/cmd/dns/zone/describe/describe_test.go | 3 ++- internal/cmd/dns/zone/list/list_test.go | 5 +++-- internal/cmd/git/flavor/list/list.go | 3 ++- internal/cmd/git/flavor/list/list_test.go | 3 ++- internal/cmd/git/instance/create/create.go | 5 +++-- internal/cmd/git/instance/create/create_test.go | 3 ++- internal/cmd/git/instance/delete/delete.go | 5 +++-- internal/cmd/git/instance/describe/describe.go | 3 ++- internal/cmd/git/instance/describe/describe_test.go | 3 ++- internal/cmd/git/instance/list/list.go | 3 ++- internal/cmd/git/instance/list/list_test.go | 3 ++- internal/cmd/image/create/create.go | 3 ++- internal/cmd/image/create/create_test.go | 3 ++- internal/cmd/image/delete/delete.go | 3 ++- internal/cmd/image/describe/describe.go | 3 ++- internal/cmd/image/list/list.go | 3 ++- internal/cmd/image/update/update.go | 3 ++- internal/cmd/key-pair/delete/delete_test.go | 3 ++- internal/cmd/key-pair/key-pair.go | 1 + internal/cmd/kms/key/create/create.go | 6 ++++-- internal/cmd/kms/key/create/create_test.go | 3 ++- internal/cmd/kms/key/delete/delete.go | 4 +++- internal/cmd/kms/key/delete/delete_test.go | 3 ++- internal/cmd/kms/key/describe/describe.go | 3 ++- internal/cmd/kms/key/describe/describe_test.go | 3 ++- internal/cmd/kms/key/importKey/importKey.go | 4 +++- internal/cmd/kms/key/importKey/importKey_test.go | 3 ++- internal/cmd/kms/key/list/list.go | 3 ++- internal/cmd/kms/key/list/list_test.go | 3 ++- internal/cmd/kms/key/restore/restore.go | 4 +++- internal/cmd/kms/key/restore/restore_test.go | 3 ++- internal/cmd/kms/key/rotate/rotate.go | 4 +++- internal/cmd/kms/key/rotate/rotate_test.go | 3 ++- internal/cmd/kms/keyring/create/create.go | 6 ++++-- internal/cmd/kms/keyring/create/create_test.go | 3 ++- internal/cmd/kms/keyring/delete/delete.go | 4 +++- internal/cmd/kms/keyring/delete/delete_test.go | 3 ++- internal/cmd/kms/keyring/describe/describe.go | 3 ++- internal/cmd/kms/keyring/describe/describe_test.go | 3 ++- internal/cmd/kms/keyring/list/list.go | 3 ++- internal/cmd/kms/keyring/list/list_test.go | 3 ++- internal/cmd/kms/version/destroy/destroy.go | 3 ++- internal/cmd/kms/version/destroy/destroy_test.go | 3 ++- internal/cmd/kms/version/disable/disable.go | 5 +++-- internal/cmd/kms/version/disable/disable_test.go | 3 ++- internal/cmd/kms/version/enable/enable.go | 5 +++-- internal/cmd/kms/version/enable/enable_test.go | 3 ++- internal/cmd/kms/version/list/list.go | 3 ++- internal/cmd/kms/version/list/list_test.go | 3 ++- internal/cmd/kms/version/restore/restore.go | 3 ++- internal/cmd/kms/version/restore/restore_test.go | 3 ++- internal/cmd/kms/wrappingkey/create/create.go | 6 ++++-- internal/cmd/kms/wrappingkey/create/create_test.go | 3 ++- internal/cmd/kms/wrappingkey/delete/delete.go | 4 +++- internal/cmd/kms/wrappingkey/delete/delete_test.go | 3 ++- internal/cmd/kms/wrappingkey/describe/describe.go | 3 ++- internal/cmd/kms/wrappingkey/describe/describe_test.go | 3 ++- internal/cmd/kms/wrappingkey/list/list.go | 3 ++- internal/cmd/kms/wrappingkey/list/list_test.go | 3 ++- internal/cmd/load-balancer/create/create.go | 5 +++-- internal/cmd/load-balancer/describe/describe_test.go | 3 ++- .../cmd/load-balancer/generate-payload/generate_payload.go | 3 ++- .../generate-payload/generate_payload_test.go | 3 ++- internal/cmd/load-balancer/list/list_test.go | 3 ++- .../cmd/load-balancer/observability-credentials/add/add.go | 1 + .../observability-credentials/add/add_test.go | 3 ++- .../observability-credentials/cleanup/cleanup_test.go | 3 ++- .../observability-credentials/delete/delete_test.go | 3 ++- .../observability-credentials/describe/describe_test.go | 3 ++- .../load-balancer/observability-credentials/list/list.go | 3 ++- .../observability-credentials/list/list_test.go | 3 ++- internal/cmd/load-balancer/quota/quota_test.go | 3 ++- .../cmd/load-balancer/target-pool/add-target/add_target.go | 3 ++- .../target-pool/add-target/add_target_test.go | 3 ++- .../cmd/load-balancer/target-pool/describe/describe.go | 3 ++- .../load-balancer/target-pool/describe/describe_test.go | 3 ++- .../target-pool/remove-target/remove_target.go | 3 ++- .../target-pool/remove-target/remove_target_test.go | 3 ++- internal/cmd/logme/credentials/create/create.go | 3 ++- internal/cmd/logme/instance/list/list.go | 3 ++- internal/cmd/logme/plans/plans.go | 3 ++- internal/cmd/logs/access_token/create/create.go | 3 ++- internal/cmd/logs/access_token/delete/delete.go | 3 ++- internal/cmd/logs/access_token/delete_all/delete_all.go | 3 ++- .../access_token/delete_all_expired/delete_all_expired.go | 3 ++- internal/cmd/logs/access_token/describe/describe.go | 3 ++- internal/cmd/logs/access_token/list/list.go | 3 ++- internal/cmd/logs/access_token/update/update.go | 3 ++- internal/cmd/logs/instance/create/create.go | 7 +++++-- internal/cmd/logs/instance/create/create_test.go | 4 +++- internal/cmd/logs/instance/delete/delete.go | 7 +++++-- internal/cmd/logs/instance/delete/delete_test.go | 3 ++- internal/cmd/logs/instance/describe/describe.go | 4 +++- internal/cmd/logs/instance/describe/describe_test.go | 3 ++- internal/cmd/logs/instance/list/list.go | 3 ++- internal/cmd/logs/instance/update/update_test.go | 3 ++- internal/cmd/mariadb/credentials/list/list.go | 3 ++- internal/cmd/mariadb/instance/list/list.go | 3 ++- internal/cmd/mariadb/plans/plans.go | 3 ++- internal/cmd/mongodbflex/backup/describe/describe.go | 3 ++- .../cmd/mongodbflex/backup/restore-jobs/restore_jobs.go | 3 ++- internal/cmd/mongodbflex/backup/schedule/schedule.go | 3 ++- .../mongodbflex/backup/update-schedule/update_schedule.go | 3 ++- internal/cmd/mongodbflex/instance/create/create.go | 5 +++-- internal/cmd/mongodbflex/options/options.go | 3 ++- internal/cmd/mongodbflex/user/create/create.go | 3 ++- internal/cmd/network-area/create/create.go | 5 +++-- internal/cmd/network-area/delete/delete.go | 5 +++-- internal/cmd/network-area/describe/describe.go | 3 ++- internal/cmd/network-area/list/list.go | 3 ++- internal/cmd/network-area/network-range/create/create.go | 3 ++- internal/cmd/network-area/network-range/delete/delete.go | 3 ++- .../cmd/network-area/network-range/describe/describe.go | 3 ++- internal/cmd/network-area/network-range/list/list.go | 3 ++- internal/cmd/network-area/region/create/create.go | 5 +++-- internal/cmd/network-area/region/create/create_test.go | 3 ++- internal/cmd/network-area/region/delete/delete.go | 5 +++-- internal/cmd/network-area/region/delete/delete_test.go | 3 ++- internal/cmd/network-area/region/describe/describe.go | 3 ++- internal/cmd/network-area/region/describe/describe_test.go | 3 ++- internal/cmd/network-area/region/list/list.go | 3 ++- internal/cmd/network-area/region/list/list_test.go | 3 ++- internal/cmd/network-area/region/update/update.go | 3 ++- internal/cmd/network-area/region/update/update_test.go | 3 ++- internal/cmd/network-area/route/create/create.go | 3 ++- internal/cmd/network-area/route/delete/delete.go | 3 ++- internal/cmd/network-area/route/describe/describe.go | 3 ++- internal/cmd/network-area/route/list/list.go | 3 ++- internal/cmd/network-area/route/update/update.go | 3 ++- internal/cmd/network-area/route/update/update_test.go | 3 ++- internal/cmd/network-area/routingtable/create/create.go | 3 ++- .../cmd/network-area/routingtable/create/create_test.go | 3 ++- internal/cmd/network-area/routingtable/delete/delete.go | 1 + .../cmd/network-area/routingtable/delete/delete_test.go | 1 + .../cmd/network-area/routingtable/describe/describe.go | 3 ++- .../network-area/routingtable/describe/describe_test.go | 3 ++- internal/cmd/network-area/routingtable/list/list.go | 3 ++- internal/cmd/network-area/routingtable/list/list_test.go | 3 ++- .../cmd/network-area/routingtable/route/create/create.go | 3 ++- .../network-area/routingtable/route/create/create_test.go | 3 ++- .../cmd/network-area/routingtable/route/delete/delete.go | 1 + .../network-area/routingtable/route/delete/delete_test.go | 1 + .../network-area/routingtable/route/describe/describe.go | 3 ++- .../routingtable/route/describe/describe_test.go | 3 ++- internal/cmd/network-area/routingtable/route/list/list.go | 3 ++- .../cmd/network-area/routingtable/route/list/list_test.go | 3 ++- internal/cmd/network-area/routingtable/route/route.go | 1 + .../cmd/network-area/routingtable/route/update/update.go | 3 ++- .../network-area/routingtable/route/update/update_test.go | 3 ++- internal/cmd/network-area/routingtable/routingtable.go | 1 + internal/cmd/network-area/routingtable/update/update.go | 3 ++- .../cmd/network-area/routingtable/update/update_test.go | 3 ++- internal/cmd/network-area/update/update.go | 3 ++- internal/cmd/network-interface/create/create.go | 3 ++- internal/cmd/network-interface/create/create_test.go | 3 ++- internal/cmd/network-interface/delete/delete.go | 3 ++- internal/cmd/network-interface/delete/delete_test.go | 3 ++- internal/cmd/network-interface/describe/describe.go | 3 ++- internal/cmd/network-interface/describe/describe_test.go | 3 ++- internal/cmd/network-interface/list/list.go | 3 ++- internal/cmd/network-interface/network-interface.go | 1 + internal/cmd/network-interface/update/update.go | 3 ++- internal/cmd/network/create/create.go | 5 +++-- internal/cmd/network/delete/delete.go | 5 +++-- internal/cmd/network/describe/describe.go | 3 ++- internal/cmd/network/list/list.go | 3 ++- internal/cmd/network/update/update.go | 5 +++-- internal/cmd/object-storage/bucket/list/list.go | 3 ++- .../cmd/object-storage/credentials-group/create/create.go | 3 ++- .../object-storage/credentials-group/create/create_test.go | 3 ++- internal/cmd/object-storage/credentials-group/list/list.go | 3 ++- internal/cmd/object-storage/credentials/create/create.go | 3 ++- internal/cmd/object-storage/credentials/delete/delete.go | 3 ++- internal/cmd/object-storage/credentials/list/list.go | 3 ++- internal/cmd/observability/credentials/create/create.go | 3 ++- .../cmd/observability/credentials/create/create_test.go | 3 ++- .../grafana/public-read-access/disable/disable.go | 3 ++- .../grafana/public-read-access/disable/disable_test.go | 3 ++- .../grafana/public-read-access/enable/enable.go | 3 ++- .../grafana/public-read-access/enable/enable_test.go | 3 ++- .../grafana/single-sign-on/disable/disable.go | 3 ++- .../grafana/single-sign-on/disable/disable_test.go | 3 ++- internal/cmd/observability/instance/create/create.go | 3 ++- internal/cmd/observability/instance/list/list.go | 3 ++- .../cmd/observability/scrape-config/describe/describe.go | 3 ++- internal/cmd/opensearch/credentials/create/create.go | 3 ++- internal/cmd/opensearch/credentials/create/create_test.go | 3 ++- internal/cmd/opensearch/instance/list/list.go | 3 ++- internal/cmd/opensearch/plans/plans.go | 3 ++- internal/cmd/organization/describe/describe.go | 3 ++- internal/cmd/organization/list/list.go | 3 ++- internal/cmd/organization/member/add/add.go | 3 ++- internal/cmd/organization/member/list/list.go | 3 ++- internal/cmd/organization/role/list/list.go | 3 ++- internal/cmd/postgresflex/backup/describe/describe.go | 3 ++- internal/cmd/postgresflex/backup/describe/describe_test.go | 3 ++- internal/cmd/postgresflex/backup/list/list_test.go | 3 ++- .../postgresflex/backup/update-schedule/update_schedule.go | 3 ++- internal/cmd/postgresflex/instance/clone/clone_test.go | 3 ++- internal/cmd/postgresflex/instance/create/create_test.go | 3 ++- internal/cmd/postgresflex/instance/describe/describe.go | 5 +++-- .../cmd/postgresflex/instance/describe/describe_test.go | 3 ++- internal/cmd/postgresflex/instance/list/list.go | 7 ++++--- internal/cmd/postgresflex/instance/list/list_test.go | 3 ++- internal/cmd/postgresflex/instance/update/update_test.go | 3 ++- internal/cmd/postgresflex/options/options.go | 3 ++- internal/cmd/postgresflex/options/options_test.go | 3 ++- internal/cmd/postgresflex/user/create/create.go | 3 ++- internal/cmd/postgresflex/user/create/create_test.go | 3 ++- internal/cmd/postgresflex/user/describe/describe.go | 3 ++- internal/cmd/postgresflex/user/describe/describe_test.go | 3 ++- internal/cmd/postgresflex/user/list/list.go | 3 ++- internal/cmd/postgresflex/user/list/list_test.go | 3 ++- .../cmd/postgresflex/user/reset-password/reset_password.go | 3 ++- .../user/reset-password/reset_password_test.go | 3 ++- internal/cmd/project/create/create_test.go | 5 +++-- internal/cmd/project/describe/describe_test.go | 3 ++- internal/cmd/project/list/list.go | 3 ++- internal/cmd/project/list/list_test.go | 7 ++++--- internal/cmd/project/member/list/list.go | 3 ++- internal/cmd/project/member/list/list_test.go | 3 ++- internal/cmd/project/role/list/list.go | 3 ++- internal/cmd/project/role/list/list_test.go | 3 ++- internal/cmd/public-ip/associate/associate.go | 3 ++- internal/cmd/public-ip/associate/associate_test.go | 3 ++- internal/cmd/public-ip/create/create.go | 3 ++- internal/cmd/public-ip/delete/delete.go | 3 ++- internal/cmd/public-ip/describe/describe.go | 3 ++- internal/cmd/public-ip/disassociate/disassociate.go | 3 ++- internal/cmd/public-ip/disassociate/disassociate_test.go | 3 ++- internal/cmd/public-ip/list/list.go | 3 ++- internal/cmd/public-ip/ranges/list/list.go | 3 ++- internal/cmd/public-ip/ranges/list/list_test.go | 3 ++- internal/cmd/public-ip/update/update.go | 3 ++- internal/cmd/quota/list/list.go | 3 ++- internal/cmd/rabbitmq/credentials/create/create.go | 3 ++- internal/cmd/rabbitmq/credentials/create/create_test.go | 3 ++- .../cmd/rabbitmq/credentials/describe/describe_test.go | 3 ++- internal/cmd/rabbitmq/credentials/list/list.go | 3 ++- internal/cmd/rabbitmq/credentials/list/list_test.go | 3 ++- internal/cmd/rabbitmq/instance/create/create_test.go | 3 ++- internal/cmd/rabbitmq/instance/describe/describe_test.go | 3 ++- internal/cmd/rabbitmq/instance/list/list.go | 3 ++- internal/cmd/rabbitmq/instance/list/list_test.go | 3 ++- internal/cmd/rabbitmq/plans/plans_test.go | 3 ++- internal/cmd/redis/credentials/create/create_test.go | 3 ++- internal/cmd/redis/credentials/describe/describe_test.go | 3 ++- internal/cmd/redis/credentials/list/list.go | 3 ++- internal/cmd/redis/credentials/list/list_test.go | 3 ++- internal/cmd/redis/instance/create/create_test.go | 3 ++- internal/cmd/redis/instance/describe/describe_test.go | 3 ++- internal/cmd/redis/instance/list/list.go | 3 ++- internal/cmd/redis/instance/list/list_test.go | 3 ++- internal/cmd/redis/plans/plans.go | 3 ++- internal/cmd/redis/plans/plans_test.go | 3 ++- internal/cmd/root_test.go | 1 + internal/cmd/secrets-manager/instance/create/create.go | 3 ++- .../cmd/secrets-manager/instance/create/create_test.go | 3 ++- internal/cmd/secrets-manager/instance/delete/delete.go | 3 ++- internal/cmd/secrets-manager/instance/list/list.go | 3 ++- internal/cmd/secrets-manager/user/list/list.go | 3 ++- internal/cmd/secrets-manager/user/user.go | 1 + internal/cmd/security-group/create/create.go | 3 ++- internal/cmd/security-group/create/create_test.go | 3 ++- internal/cmd/security-group/delete/delete.go | 3 ++- internal/cmd/security-group/describe/describe_test.go | 3 ++- internal/cmd/security-group/list/list.go | 3 ++- internal/cmd/security-group/list/list_test.go | 3 ++- internal/cmd/security-group/rule/create/create.go | 3 ++- internal/cmd/security-group/rule/create/create_test.go | 3 ++- internal/cmd/security-group/rule/delete/delete.go | 3 ++- internal/cmd/security-group/rule/delete/delete_test.go | 3 ++- internal/cmd/security-group/rule/describe/describe.go | 3 ++- internal/cmd/security-group/rule/describe/describe_test.go | 3 ++- internal/cmd/security-group/rule/list/list_test.go | 3 ++- internal/cmd/security-group/update/update.go | 3 ++- internal/cmd/server/backup/list/list.go | 3 ++- .../cmd/server/backup/schedule/describe/describe_test.go | 3 ++- internal/cmd/server/backup/schedule/list/list.go | 3 ++- internal/cmd/server/command/create/create.go | 3 ++- internal/cmd/server/command/describe/describe.go | 3 ++- internal/cmd/server/command/list/list.go | 3 ++- internal/cmd/server/command/template/describe/describe.go | 3 ++- internal/cmd/server/command/template/list/list.go | 3 ++- internal/cmd/server/console/console.go | 3 ++- internal/cmd/server/create/create.go | 5 +++-- internal/cmd/server/deallocate/deallocate.go | 5 +++-- internal/cmd/server/delete/delete.go | 6 ++++-- internal/cmd/server/log/log.go | 3 ++- internal/cmd/server/machine-type/describe/describe.go | 3 ++- internal/cmd/server/network-interface/attach/attach.go | 3 ++- internal/cmd/server/network-interface/detach/detach.go | 3 ++- internal/cmd/server/network-interface/list/list.go | 3 ++- internal/cmd/server/os-update/describe/describe.go | 3 ++- .../cmd/server/os-update/schedule/describe/describe.go | 3 ++- internal/cmd/server/os-update/schedule/list/list.go | 3 ++- internal/cmd/server/os-update/schedule/update/update.go | 3 ++- internal/cmd/server/public-ip/attach/attach.go | 3 ++- internal/cmd/server/public-ip/attach/attach_test.go | 3 ++- internal/cmd/server/public-ip/detach/detach.go | 3 ++- internal/cmd/server/reboot/reboot.go | 3 ++- internal/cmd/server/rescue/rescue.go | 5 +++-- internal/cmd/server/resize/resize.go | 5 +++-- internal/cmd/server/security-group/attach/attach.go | 3 ++- internal/cmd/server/security-group/attach/attach_test.go | 3 ++- internal/cmd/server/security-group/detach/detach.go | 3 ++- internal/cmd/server/security-group/detach/detach_test.go | 3 ++- internal/cmd/server/service-account/attach/attach_test.go | 3 ++- internal/cmd/server/service-account/detach/detach_test.go | 3 ++- internal/cmd/server/service-account/service-account.go | 1 + internal/cmd/server/start/start.go | 5 +++-- internal/cmd/server/stop/stop.go | 5 +++-- internal/cmd/server/unrescue/unrescue.go | 5 +++-- internal/cmd/server/update/update.go | 3 ++- internal/cmd/server/volume/attach/attach.go | 3 ++- internal/cmd/server/volume/describe/describe.go | 3 ++- internal/cmd/server/volume/describe/describe_test.go | 3 ++- internal/cmd/server/volume/detach/detach.go | 3 ++- internal/cmd/server/volume/detach/detach_test.go | 3 ++- internal/cmd/server/volume/list/list.go | 3 ++- internal/cmd/server/volume/list/list_test.go | 3 ++- internal/cmd/server/volume/update/update.go | 3 ++- internal/cmd/service-account/key/list/list.go | 3 ++- internal/cmd/service-account/list/list.go | 3 ++- internal/cmd/service-account/token/create/create.go | 3 ++- internal/cmd/ske/cluster/create/create.go | 5 +++-- internal/cmd/ske/cluster/describe/describe.go | 3 ++- internal/cmd/ske/cluster/hibernate/hibernate.go | 5 +++-- internal/cmd/ske/cluster/hibernate/hibernate_test.go | 3 ++- internal/cmd/ske/cluster/maintenance/maintenance.go | 5 +++-- internal/cmd/ske/cluster/maintenance/maintenance_test.go | 3 ++- internal/cmd/ske/cluster/reconcile/reconcile.go | 5 +++-- internal/cmd/ske/cluster/reconcile/reconcile_test.go | 3 ++- internal/cmd/ske/cluster/wakeup/wakeup.go | 5 +++-- internal/cmd/ske/cluster/wakeup/wakeup_test.go | 3 ++- internal/cmd/ske/describe/describe.go | 3 ++- internal/cmd/ske/describe/describe_test.go | 3 ++- internal/cmd/ske/kubeconfig/create/create.go | 1 + internal/cmd/ske/kubeconfig/create/create_test.go | 3 ++- internal/cmd/ske/kubeconfig/login/login.go | 3 ++- internal/cmd/ske/kubeconfig/login/login_test.go | 3 ++- .../ske/options/availability_zones/availability_zones.go | 3 ++- .../ske/options/kubernetes_versions/kubernetes_versions.go | 3 ++- internal/cmd/ske/options/machine_images/machine_images.go | 3 ++- internal/cmd/ske/options/machine_types/machine_types.go | 3 ++- internal/cmd/ske/options/options.go | 3 ++- internal/cmd/ske/options/volume_types/volume_types.go | 3 ++- internal/cmd/volume/backup/delete/delete.go | 4 +++- internal/cmd/volume/backup/describe/describe.go | 1 + internal/cmd/volume/backup/list/list.go | 3 ++- internal/cmd/volume/backup/restore/restore.go | 4 +++- internal/cmd/volume/backup/update/update.go | 1 + internal/cmd/volume/create/create.go | 5 +++-- internal/cmd/volume/create/create_test.go | 3 ++- internal/cmd/volume/delete/delete.go | 5 +++-- internal/cmd/volume/describe/describe.go | 3 ++- internal/cmd/volume/describe/describe_test.go | 3 ++- internal/cmd/volume/list/list.go | 3 ++- internal/cmd/volume/list/list_test.go | 3 ++- internal/cmd/volume/performance-class/describe/describe.go | 3 ++- .../cmd/volume/performance-class/describe/describe_test.go | 3 ++- internal/cmd/volume/performance-class/list/list.go | 3 ++- internal/cmd/volume/performance-class/list/list_test.go | 3 ++- internal/cmd/volume/resize/resize.go | 3 ++- internal/cmd/volume/snapshot/create/create.go | 1 + internal/cmd/volume/snapshot/create/create_test.go | 3 ++- internal/cmd/volume/snapshot/delete/delete.go | 1 + internal/cmd/volume/snapshot/describe/describe.go | 1 + internal/cmd/volume/snapshot/list/list.go | 4 +++- internal/cmd/volume/snapshot/snapshot.go | 1 + internal/cmd/volume/snapshot/update/update.go | 1 + internal/cmd/volume/update/update.go | 3 ++- internal/cmd/volume/update/update_test.go | 3 ++- internal/pkg/auth/auth_test.go | 3 ++- internal/pkg/auth/storage_test.go | 3 ++- internal/pkg/auth/user_login.go | 3 ++- internal/pkg/auth/user_token_flow.go | 1 + internal/pkg/auth/user_token_flow_test.go | 3 ++- internal/pkg/auth/utils.go | 1 + internal/pkg/auth/utils_test.go | 3 ++- internal/pkg/cache/cache_test.go | 1 + internal/pkg/config/profiles.go | 1 + internal/pkg/flags/flag_to_value.go | 1 + internal/pkg/flags/flag_to_value_test.go | 1 + internal/pkg/generic-client/generic_client.go | 3 ++- internal/pkg/projectname/project_name_test.go | 1 + internal/pkg/services/cdn/client/client.go | 3 ++- internal/pkg/services/dns/utils/utils.go | 3 ++- internal/pkg/services/dns/utils/utils_test.go | 3 ++- internal/pkg/services/edge/client/client.go | 3 ++- .../pkg/services/edge/common/kubeconfig/kubeconfig_test.go | 3 ++- internal/pkg/services/edge/common/validation/input.go | 1 + internal/pkg/services/edge/common/validation/input_test.go | 1 + internal/pkg/services/git/utils/utils_test.go | 3 ++- internal/pkg/services/iaas/utils/utils_test.go | 3 ++- internal/pkg/services/intake/client/client.go | 3 ++- internal/pkg/services/logs/client/client.go | 3 ++- internal/pkg/services/logs/utils/utils_test.go | 3 ++- internal/pkg/services/mongodbflex/client/client.go | 3 ++- internal/pkg/services/mongodbflex/utils/utils.go | 3 ++- .../pkg/services/network-area/routing-table/utils/utils.go | 3 ++- .../network-area/routing-table/utils/utils_test.go | 3 ++- internal/pkg/services/object-storage/utils/utils_test.go | 3 ++- internal/pkg/services/observability/client/client.go | 3 ++- internal/pkg/services/observability/utils/utils.go | 3 ++- internal/pkg/services/resourcemanager/utils/utils_test.go | 3 ++- internal/pkg/services/secrets-manager/utils/utils_test.go | 3 ++- internal/pkg/services/service-enablement/client/client.go | 1 + internal/pkg/services/sfs/client/client.go | 3 ++- internal/pkg/services/sfs/utils/utils_test.go | 3 ++- internal/pkg/services/ske/utils/utils.go | 3 ++- internal/pkg/services/ske/utils/utils_test.go | 3 ++- internal/pkg/testutils/parse_input.go | 1 + internal/pkg/testutils/parse_input_test.go | 1 + internal/pkg/testutils/testutils.go | 1 + internal/pkg/utils/utils.go | 3 ++- internal/pkg/utils/utils_test.go | 1 + 570 files changed, 1185 insertions(+), 591 deletions(-) diff --git a/Makefile b/Makefile index 836e41ad4..436a40a80 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ build: fmt: @gofmt -s -w . - @go tool goimports -w . + @go tool golangci-lint fmt --config=${GOLANG_CI_YAML_PATH} # Lint lint-golangci-lint: diff --git a/golang-ci.yaml b/golang-ci.yaml index 914c48614..3026ce631 100644 --- a/golang-ci.yaml +++ b/golang-ci.yaml @@ -76,6 +76,11 @@ formatters: enable: - gofmt - goimports + settings: + goimports: + # put imports beginning with prefix after 3rd-party packages; + # it's a comma-separated list of prefixes + local-prefixes: github.com/stackitcloud/stackit-cli exclusions: generated: lax paths: diff --git a/internal/cmd/affinity-groups/affinity-groups.go b/internal/cmd/affinity-groups/affinity-groups.go index f8fe78433..0287d8713 100644 --- a/internal/cmd/affinity-groups/affinity-groups.go +++ b/internal/cmd/affinity-groups/affinity-groups.go @@ -2,6 +2,7 @@ package affinity_groups import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/create" "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/affinity-groups/describe" diff --git a/internal/cmd/affinity-groups/create/create.go b/internal/cmd/affinity-groups/create/create.go index d8b0d5a1b..0a38cd35f 100644 --- a/internal/cmd/affinity-groups/create/create.go +++ b/internal/cmd/affinity-groups/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/affinity-groups/create/create_test.go b/internal/cmd/affinity-groups/create/create_test.go index 82dd23ef4..8cdba240a 100644 --- a/internal/cmd/affinity-groups/create/create_test.go +++ b/internal/cmd/affinity-groups/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/affinity-groups/delete/delete.go b/internal/cmd/affinity-groups/delete/delete.go index ba3f83efc..d37005653 100644 --- a/internal/cmd/affinity-groups/delete/delete.go +++ b/internal/cmd/affinity-groups/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/affinity-groups/delete/delete_test.go b/internal/cmd/affinity-groups/delete/delete_test.go index b059eb50c..00cb16756 100644 --- a/internal/cmd/affinity-groups/delete/delete_test.go +++ b/internal/cmd/affinity-groups/delete/delete_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/affinity-groups/describe/describe.go b/internal/cmd/affinity-groups/describe/describe.go index 52465a976..7fda51352 100644 --- a/internal/cmd/affinity-groups/describe/describe.go +++ b/internal/cmd/affinity-groups/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/affinity-groups/describe/describe_test.go b/internal/cmd/affinity-groups/describe/describe_test.go index ac751003b..966df5964 100644 --- a/internal/cmd/affinity-groups/describe/describe_test.go +++ b/internal/cmd/affinity-groups/describe/describe_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/affinity-groups/list/list.go b/internal/cmd/affinity-groups/list/list.go index 0a2e3013f..fe9abad60 100644 --- a/internal/cmd/affinity-groups/list/list.go +++ b/internal/cmd/affinity-groups/list/list.go @@ -10,6 +10,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/affinity-groups/list/list_test.go b/internal/cmd/affinity-groups/list/list_test.go index 432640085..c872f4b45 100644 --- a/internal/cmd/affinity-groups/list/list_test.go +++ b/internal/cmd/affinity-groups/list/list_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/auth/activate-service-account/activate_service_account.go b/internal/cmd/auth/activate-service-account/activate_service_account.go index 3b87d23f5..b69de90d7 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" diff --git a/internal/cmd/auth/activate-service-account/activate_service_account_test.go b/internal/cmd/auth/activate-service-account/activate_service_account_test.go index 026ba8dce..22a777ac4 100644 --- a/internal/cmd/auth/activate-service-account/activate_service_account_test.go +++ b/internal/cmd/auth/activate-service-account/activate_service_account_test.go @@ -6,9 +6,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/spf13/viper" + "github.com/zalando/go-keyring" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" - "github.com/zalando/go-keyring" ) var testTokenCustomEndpoint = "token_url" diff --git a/internal/cmd/auth/get-access-token/get_access_token.go b/internal/cmd/auth/get-access-token/get_access_token.go index a3c1246e6..bf97df4ec 100644 --- a/internal/cmd/auth/get-access-token/get_access_token.go +++ b/internal/cmd/auth/get-access-token/get_access_token.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" diff --git a/internal/cmd/beta/alb/create/create.go b/internal/cmd/beta/alb/create/create.go index ddd1a1a0d..5e7989f4e 100644 --- a/internal/cmd/beta/alb/create/create.go +++ b/internal/cmd/beta/alb/create/create.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/beta/alb/create/create_test.go b/internal/cmd/beta/alb/create/create_test.go index c99f4a859..6641a2fc2 100644 --- a/internal/cmd/beta/alb/create/create_test.go +++ b/internal/cmd/beta/alb/create/create_test.go @@ -12,11 +12,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) //go:embed testdata/testconfig.json diff --git a/internal/cmd/beta/alb/list/list.go b/internal/cmd/beta/alb/list/list.go index bfeb711c6..1967f706e 100644 --- a/internal/cmd/beta/alb/list/list.go +++ b/internal/cmd/beta/alb/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) type inputModel struct { diff --git a/internal/cmd/beta/alb/list/list_test.go b/internal/cmd/beta/alb/list/list_test.go index b579d45a6..b0524705a 100644 --- a/internal/cmd/beta/alb/list/list_test.go +++ b/internal/cmd/beta/alb/list/list_test.go @@ -10,6 +10,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" diff --git a/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go b/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go index 951846c66..20d9e9b51 100644 --- a/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go +++ b/internal/cmd/beta/alb/observability-credentials/delete/delete_test.go @@ -6,9 +6,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/alb" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/beta/alb/observability-credentials/observability-credentials.go b/internal/cmd/beta/alb/observability-credentials/observability-credentials.go index 0e05ae183..2c0b7d461 100644 --- a/internal/cmd/beta/alb/observability-credentials/observability-credentials.go +++ b/internal/cmd/beta/alb/observability-credentials/observability-credentials.go @@ -2,6 +2,7 @@ package credentials import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" add "github.com/stackitcloud/stackit-cli/internal/cmd/beta/alb/observability-credentials/add" diff --git a/internal/cmd/beta/alb/plans/plans.go b/internal/cmd/beta/alb/plans/plans.go index c38dd9b70..bd672fd23 100644 --- a/internal/cmd/beta/alb/plans/plans.go +++ b/internal/cmd/beta/alb/plans/plans.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) type inputModel struct { diff --git a/internal/cmd/beta/alb/pool/update/update.go b/internal/cmd/beta/alb/pool/update/update.go index a98d5f822..c20aac785 100644 --- a/internal/cmd/beta/alb/pool/update/update.go +++ b/internal/cmd/beta/alb/pool/update/update.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/beta/alb/pool/update/update_test.go b/internal/cmd/beta/alb/pool/update/update_test.go index 771cf6ce1..09af0fc92 100644 --- a/internal/cmd/beta/alb/pool/update/update_test.go +++ b/internal/cmd/beta/alb/pool/update/update_test.go @@ -12,11 +12,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) //go:embed testdata/testconfig.json diff --git a/internal/cmd/beta/alb/quotas/quotas.go b/internal/cmd/beta/alb/quotas/quotas.go index 29f1c3bfd..3f77bbaa0 100644 --- a/internal/cmd/beta/alb/quotas/quotas.go +++ b/internal/cmd/beta/alb/quotas/quotas.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/alb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) type inputModel struct { diff --git a/internal/cmd/beta/alb/template/template.go b/internal/cmd/beta/alb/template/template.go index 67819b173..c91289a2c 100644 --- a/internal/cmd/beta/alb/template/template.go +++ b/internal/cmd/beta/alb/template/template.go @@ -10,6 +10,8 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) const ( diff --git a/internal/cmd/beta/alb/update/update.go b/internal/cmd/beta/alb/update/update.go index 910c78773..006c027d4 100644 --- a/internal/cmd/beta/alb/update/update.go +++ b/internal/cmd/beta/alb/update/update.go @@ -11,6 +11,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/beta/alb/update/update_test.go b/internal/cmd/beta/alb/update/update_test.go index d4ccb0788..84220cfdc 100644 --- a/internal/cmd/beta/alb/update/update_test.go +++ b/internal/cmd/beta/alb/update/update_test.go @@ -12,11 +12,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/alb" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/alb" ) //go:embed testdata/testconfig.json diff --git a/internal/cmd/beta/cdn/cdn.go b/internal/cmd/beta/cdn/cdn.go index 257633ef0..09d05af76 100644 --- a/internal/cmd/beta/cdn/cdn.go +++ b/internal/cmd/beta/cdn/cdn.go @@ -2,6 +2,7 @@ package cdn import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/types" diff --git a/internal/cmd/beta/cdn/distribution/create/create.go b/internal/cmd/beta/cdn/distribution/create/create.go index 19c5d3ca8..d372af381 100644 --- a/internal/cmd/beta/cdn/distribution/create/create.go +++ b/internal/cmd/beta/cdn/distribution/create/create.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( cdnUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) const ( diff --git a/internal/cmd/beta/cdn/distribution/create/create_test.go b/internal/cmd/beta/cdn/distribution/create/create_test.go index 4276f34a7..8d2140e6e 100644 --- a/internal/cmd/beta/cdn/distribution/create/create_test.go +++ b/internal/cmd/beta/cdn/distribution/create/create_test.go @@ -10,14 +10,15 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "k8s.io/utils/ptr" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" - "k8s.io/utils/ptr" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/cdn/distribution/delete/delete.go b/internal/cmd/beta/cdn/distribution/delete/delete.go index 78baebdc4..beffc6f48 100644 --- a/internal/cmd/beta/cdn/distribution/delete/delete.go +++ b/internal/cmd/beta/cdn/distribution/delete/delete.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -13,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/client" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) const argDistributionID = "DISTRIBUTION_ID" diff --git a/internal/cmd/beta/cdn/distribution/delete/delete_test.go b/internal/cmd/beta/cdn/distribution/delete/delete_test.go index 03ec87f46..629110c8b 100644 --- a/internal/cmd/beta/cdn/distribution/delete/delete_test.go +++ b/internal/cmd/beta/cdn/distribution/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/cdn/distribution/describe/describe.go b/internal/cmd/beta/cdn/distribution/describe/describe.go index 9d4897f72..7443553ee 100644 --- a/internal/cmd/beta/cdn/distribution/describe/describe.go +++ b/internal/cmd/beta/cdn/distribution/describe/describe.go @@ -7,6 +7,9 @@ import ( "strings" "github.com/spf13/cobra" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) const distributionIDArg = "DISTRIBUTION_ID_ARG" diff --git a/internal/cmd/beta/cdn/distribution/describe/describe_test.go b/internal/cmd/beta/cdn/distribution/describe/describe_test.go index 78037f8d1..640fab303 100644 --- a/internal/cmd/beta/cdn/distribution/describe/describe_test.go +++ b/internal/cmd/beta/cdn/distribution/describe/describe_test.go @@ -10,12 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/cdn/distribution/distribution.go b/internal/cmd/beta/cdn/distribution/distribution.go index defb471c2..c6cb8e018 100644 --- a/internal/cmd/beta/cdn/distribution/distribution.go +++ b/internal/cmd/beta/cdn/distribution/distribution.go @@ -2,6 +2,7 @@ package distribution import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/cdn/distribution/describe" diff --git a/internal/cmd/beta/cdn/distribution/list/list.go b/internal/cmd/beta/cdn/distribution/list/list.go index aae2b0db0..41117b279 100644 --- a/internal/cmd/beta/cdn/distribution/list/list.go +++ b/internal/cmd/beta/cdn/distribution/list/list.go @@ -7,6 +7,9 @@ import ( "strings" "github.com/spf13/cobra" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) type inputModel struct { diff --git a/internal/cmd/beta/cdn/distribution/list/list_test.go b/internal/cmd/beta/cdn/distribution/list/list_test.go index 8e5d71aa9..7eae777a6 100644 --- a/internal/cmd/beta/cdn/distribution/list/list_test.go +++ b/internal/cmd/beta/cdn/distribution/list/list_test.go @@ -13,13 +13,14 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/cdn/distribution/update/update.go b/internal/cmd/beta/cdn/distribution/update/update.go index 0c6662e60..5bb66942f 100644 --- a/internal/cmd/beta/cdn/distribution/update/update.go +++ b/internal/cmd/beta/cdn/distribution/update/update.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( cdnUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/cdn/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkUtils "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) const ( diff --git a/internal/cmd/beta/cdn/distribution/update/update_test.go b/internal/cmd/beta/cdn/distribution/update/update_test.go index bf3dd11f5..915f908d7 100644 --- a/internal/cmd/beta/cdn/distribution/update/update_test.go +++ b/internal/cmd/beta/cdn/distribution/update/update_test.go @@ -9,13 +9,14 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "k8s.io/utils/ptr" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" - "k8s.io/utils/ptr" ) const testCacheDuration = "P1DT12H" diff --git a/internal/cmd/beta/edge/edge.go b/internal/cmd/beta/edge/edge.go index 11d1b1e16..35b5e0575 100644 --- a/internal/cmd/beta/edge/edge.go +++ b/internal/cmd/beta/edge/edge.go @@ -5,6 +5,7 @@ package edge import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/instance" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/kubeconfig" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/edge/plans" diff --git a/internal/cmd/beta/edge/instance/create/create.go b/internal/cmd/beta/edge/instance/create/create.go index b6b3d4e7c..6faac9cc0 100755 --- a/internal/cmd/beta/edge/instance/create/create.go +++ b/internal/cmd/beta/edge/instance/create/create.go @@ -8,6 +8,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,8 +24,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" - "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" ) // Command constructor diff --git a/internal/cmd/beta/edge/instance/create/create_test.go b/internal/cmd/beta/edge/instance/create/create_test.go index e4ce1482d..7861a87c8 100755 --- a/internal/cmd/beta/edge/instance/create/create_test.go +++ b/internal/cmd/beta/edge/instance/create/create_test.go @@ -11,6 +11,8 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -19,7 +21,6 @@ import ( commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/instance/delete/delete.go b/internal/cmd/beta/edge/instance/delete/delete.go index 4bf5e44ad..c6998e782 100755 --- a/internal/cmd/beta/edge/instance/delete/delete.go +++ b/internal/cmd/beta/edge/instance/delete/delete.go @@ -8,6 +8,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,8 +23,6 @@ import ( commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/edge" - "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" ) // Struct to model user input (arguments and/or flags) diff --git a/internal/cmd/beta/edge/instance/delete/delete_test.go b/internal/cmd/beta/edge/instance/delete/delete_test.go index c15a3e7d7..3e72a71d1 100755 --- a/internal/cmd/beta/edge/instance/delete/delete_test.go +++ b/internal/cmd/beta/edge/instance/delete/delete_test.go @@ -11,6 +11,9 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -19,8 +22,6 @@ import ( commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/instance/describe/describe.go b/internal/cmd/beta/edge/instance/describe/describe.go index 5a7d85ed6..d4ac397b5 100755 --- a/internal/cmd/beta/edge/instance/describe/describe.go +++ b/internal/cmd/beta/edge/instance/describe/describe.go @@ -8,6 +8,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,7 +22,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type inputModel struct { diff --git a/internal/cmd/beta/edge/instance/describe/describe_test.go b/internal/cmd/beta/edge/instance/describe/describe_test.go index 913a9c221..a660532f9 100755 --- a/internal/cmd/beta/edge/instance/describe/describe_test.go +++ b/internal/cmd/beta/edge/instance/describe/describe_test.go @@ -11,6 +11,9 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -20,8 +23,6 @@ import ( commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/instance/list/list.go b/internal/cmd/beta/edge/instance/list/list.go index 6a589bfdd..3b728ee2d 100755 --- a/internal/cmd/beta/edge/instance/list/list.go +++ b/internal/cmd/beta/edge/instance/list/list.go @@ -8,6 +8,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) const ( diff --git a/internal/cmd/beta/edge/instance/list/list_test.go b/internal/cmd/beta/edge/instance/list/list_test.go index 3b5adc6dc..cf346b7fb 100755 --- a/internal/cmd/beta/edge/instance/list/list_test.go +++ b/internal/cmd/beta/edge/instance/list/list_test.go @@ -10,6 +10,8 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -17,7 +19,6 @@ import ( testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/instance/update/update.go b/internal/cmd/beta/edge/instance/update/update.go index 4faf512ef..2a6d3f6dd 100755 --- a/internal/cmd/beta/edge/instance/update/update.go +++ b/internal/cmd/beta/edge/instance/update/update.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,9 +22,10 @@ import ( commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-sdk-go/services/edge" "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" + + "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" ) // Struct to model user input (arguments and/or flags) diff --git a/internal/cmd/beta/edge/instance/update/update_test.go b/internal/cmd/beta/edge/instance/update/update_test.go index 61e78d50d..c5e3e92a8 100755 --- a/internal/cmd/beta/edge/instance/update/update_test.go +++ b/internal/cmd/beta/edge/instance/update/update_test.go @@ -11,6 +11,9 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -19,8 +22,6 @@ import ( commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/kubeconfig/create/create.go b/internal/cmd/beta/edge/kubeconfig/create/create.go index b22b7a1b3..dd38b8322 100755 --- a/internal/cmd/beta/edge/kubeconfig/create/create.go +++ b/internal/cmd/beta/edge/kubeconfig/create/create.go @@ -10,6 +10,10 @@ import ( "github.com/goccy/go-yaml" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -22,9 +26,6 @@ import ( commonKubeconfig "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/kubeconfig" commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" - "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" ) type inputModel struct { diff --git a/internal/cmd/beta/edge/kubeconfig/create/create_test.go b/internal/cmd/beta/edge/kubeconfig/create/create_test.go index 1a353e303..65ef09fda 100755 --- a/internal/cmd/beta/edge/kubeconfig/create/create_test.go +++ b/internal/cmd/beta/edge/kubeconfig/create/create_test.go @@ -12,6 +12,9 @@ import ( "github.com/goccy/go-yaml" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -23,8 +26,6 @@ import ( testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/plans/list/list.go b/internal/cmd/beta/edge/plans/list/list.go index ad4c3e178..e8b8607fd 100755 --- a/internal/cmd/beta/edge/plans/list/list.go +++ b/internal/cmd/beta/edge/plans/list/list.go @@ -8,6 +8,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) // User input struct for the command diff --git a/internal/cmd/beta/edge/plans/list/list_test.go b/internal/cmd/beta/edge/plans/list/list_test.go index d2fcb595f..084e7e8e8 100755 --- a/internal/cmd/beta/edge/plans/list/list_test.go +++ b/internal/cmd/beta/edge/plans/list/list_test.go @@ -10,6 +10,8 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -17,7 +19,6 @@ import ( testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/edge/token/create/create.go b/internal/cmd/beta/edge/token/create/create.go index f28e196ab..cec854bcc 100755 --- a/internal/cmd/beta/edge/token/create/create.go +++ b/internal/cmd/beta/edge/token/create/create.go @@ -8,6 +8,10 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/utils" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,9 +24,6 @@ import ( commonKubeconfig "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/kubeconfig" commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/core/utils" - "github.com/stackitcloud/stackit-sdk-go/services/edge" - "github.com/stackitcloud/stackit-sdk-go/services/edge/wait" ) type inputModel struct { diff --git a/internal/cmd/beta/edge/token/create/create_test.go b/internal/cmd/beta/edge/token/create/create_test.go index c41e62044..c380da959 100755 --- a/internal/cmd/beta/edge/token/create/create_test.go +++ b/internal/cmd/beta/edge/token/create/create_test.go @@ -11,6 +11,9 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/core/oapierror" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" @@ -21,8 +24,6 @@ import ( commonValidation "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/validation" testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/core/oapierror" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/create/create.go b/internal/cmd/beta/intake/create/create.go index 4ce75fd94..00d54349e 100644 --- a/internal/cmd/beta/intake/create/create.go +++ b/internal/cmd/beta/intake/create/create.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" ) const ( diff --git a/internal/cmd/beta/intake/create/create_test.go b/internal/cmd/beta/intake/create/create_test.go index 38a0febe3..9c6c37213 100644 --- a/internal/cmd/beta/intake/create/create_test.go +++ b/internal/cmd/beta/intake/create/create_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // Define a unique key for the context to avoid collisions diff --git a/internal/cmd/beta/intake/delete/delete.go b/internal/cmd/beta/intake/delete/delete.go index 6aeb77ee2..f49118dfe 100644 --- a/internal/cmd/beta/intake/delete/delete.go +++ b/internal/cmd/beta/intake/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) const ( diff --git a/internal/cmd/beta/intake/delete/delete_test.go b/internal/cmd/beta/intake/delete/delete_test.go index 641c74866..ce673fabc 100644 --- a/internal/cmd/beta/intake/delete/delete_test.go +++ b/internal/cmd/beta/intake/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // Define a unique key for the context to avoid collisions diff --git a/internal/cmd/beta/intake/describe/describe_test.go b/internal/cmd/beta/intake/describe/describe_test.go index 37c6d3c47..c2961c5b4 100644 --- a/internal/cmd/beta/intake/describe/describe_test.go +++ b/internal/cmd/beta/intake/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/intake.go b/internal/cmd/beta/intake/intake.go index 0a38cb9e1..8e90bddd6 100644 --- a/internal/cmd/beta/intake/intake.go +++ b/internal/cmd/beta/intake/intake.go @@ -2,6 +2,7 @@ package intake import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/describe" diff --git a/internal/cmd/beta/intake/list/list_test.go b/internal/cmd/beta/intake/list/list_test.go index e57e733e8..15b5e714a 100644 --- a/internal/cmd/beta/intake/list/list_test.go +++ b/internal/cmd/beta/intake/list/list_test.go @@ -9,12 +9,13 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/runner/create/create_test.go b/internal/cmd/beta/intake/runner/create/create_test.go index c4f16995b..852e7339b 100644 --- a/internal/cmd/beta/intake/runner/create/create_test.go +++ b/internal/cmd/beta/intake/runner/create/create_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // Define a unique key for the context to avoid collisions diff --git a/internal/cmd/beta/intake/runner/delete/delete.go b/internal/cmd/beta/intake/runner/delete/delete.go index a8f3d6a88..5c7277bff 100644 --- a/internal/cmd/beta/intake/runner/delete/delete.go +++ b/internal/cmd/beta/intake/runner/delete/delete.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" ) const ( diff --git a/internal/cmd/beta/intake/runner/delete/delete_test.go b/internal/cmd/beta/intake/runner/delete/delete_test.go index b99edac92..ec5dc76f9 100644 --- a/internal/cmd/beta/intake/runner/delete/delete_test.go +++ b/internal/cmd/beta/intake/runner/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // Define a unique key for the context to avoid collisions diff --git a/internal/cmd/beta/intake/runner/describe/describe_test.go b/internal/cmd/beta/intake/runner/describe/describe_test.go index 1cb034e04..a9f6ff778 100644 --- a/internal/cmd/beta/intake/runner/describe/describe_test.go +++ b/internal/cmd/beta/intake/runner/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/runner/list/list.go b/internal/cmd/beta/intake/runner/list/list.go index c9bdc9acd..81d1afa2d 100644 --- a/internal/cmd/beta/intake/runner/list/list.go +++ b/internal/cmd/beta/intake/runner/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) const ( diff --git a/internal/cmd/beta/intake/runner/list/list_test.go b/internal/cmd/beta/intake/runner/list/list_test.go index bbce39c3e..eed227010 100644 --- a/internal/cmd/beta/intake/runner/list/list_test.go +++ b/internal/cmd/beta/intake/runner/list/list_test.go @@ -11,11 +11,12 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/runner/runner.go b/internal/cmd/beta/intake/runner/runner.go index dcb610d95..4c6d58607 100644 --- a/internal/cmd/beta/intake/runner/runner.go +++ b/internal/cmd/beta/intake/runner/runner.go @@ -2,6 +2,7 @@ package runner import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/runner/describe" diff --git a/internal/cmd/beta/intake/runner/update/update.go b/internal/cmd/beta/intake/runner/update/update.go index bd2c637e9..f59020818 100644 --- a/internal/cmd/beta/intake/runner/update/update.go +++ b/internal/cmd/beta/intake/runner/update/update.go @@ -8,6 +8,9 @@ import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,8 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/intake/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" ) const ( diff --git a/internal/cmd/beta/intake/runner/update/update_test.go b/internal/cmd/beta/intake/runner/update/update_test.go index b702ede40..3b1161ee1 100644 --- a/internal/cmd/beta/intake/runner/update/update_test.go +++ b/internal/cmd/beta/intake/runner/update/update_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/update/update_test.go b/internal/cmd/beta/intake/update/update_test.go index 6d6635cb0..94602f885 100644 --- a/internal/cmd/beta/intake/update/update_test.go +++ b/internal/cmd/beta/intake/update/update_test.go @@ -7,12 +7,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/user/create/create.go b/internal/cmd/beta/intake/user/create/create.go index 23175487f..436560060 100644 --- a/internal/cmd/beta/intake/user/create/create.go +++ b/internal/cmd/beta/intake/user/create/create.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" ) const ( diff --git a/internal/cmd/beta/intake/user/create/create_test.go b/internal/cmd/beta/intake/user/create/create_test.go index 4ddcaaee4..4d28c92c7 100644 --- a/internal/cmd/beta/intake/user/create/create_test.go +++ b/internal/cmd/beta/intake/user/create/create_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // Define a unique key for the context to avoid collisions diff --git a/internal/cmd/beta/intake/user/delete/delete.go b/internal/cmd/beta/intake/user/delete/delete.go index 3dbb5670d..f6d43b51d 100644 --- a/internal/cmd/beta/intake/user/delete/delete.go +++ b/internal/cmd/beta/intake/user/delete/delete.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" ) const ( diff --git a/internal/cmd/beta/intake/user/delete/delete_test.go b/internal/cmd/beta/intake/user/delete/delete_test.go index 714678bb1..9aa042552 100644 --- a/internal/cmd/beta/intake/user/delete/delete_test.go +++ b/internal/cmd/beta/intake/user/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // Define a unique key for the context to avoid collisions diff --git a/internal/cmd/beta/intake/user/describe/describe.go b/internal/cmd/beta/intake/user/describe/describe.go index 7a6cae10c..5a12896aa 100644 --- a/internal/cmd/beta/intake/user/describe/describe.go +++ b/internal/cmd/beta/intake/user/describe/describe.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) const ( diff --git a/internal/cmd/beta/intake/user/describe/describe_test.go b/internal/cmd/beta/intake/user/describe/describe_test.go index 2e2628c2e..b3aacd8bb 100644 --- a/internal/cmd/beta/intake/user/describe/describe_test.go +++ b/internal/cmd/beta/intake/user/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/user/list/list.go b/internal/cmd/beta/intake/user/list/list.go index cb6d56ca8..3c1f57520 100644 --- a/internal/cmd/beta/intake/user/list/list.go +++ b/internal/cmd/beta/intake/user/list/list.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) const ( diff --git a/internal/cmd/beta/intake/user/list/list_test.go b/internal/cmd/beta/intake/user/list/list_test.go index 9d60462c1..f83246a44 100644 --- a/internal/cmd/beta/intake/user/list/list_test.go +++ b/internal/cmd/beta/intake/user/list/list_test.go @@ -9,12 +9,13 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/user/update/update.go b/internal/cmd/beta/intake/user/update/update.go index ba57c4a22..a2b1b881c 100644 --- a/internal/cmd/beta/intake/user/update/update.go +++ b/internal/cmd/beta/intake/user/update/update.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" - "github.com/stackitcloud/stackit-sdk-go/services/intake/wait" ) const ( diff --git a/internal/cmd/beta/intake/user/update/update_test.go b/internal/cmd/beta/intake/user/update/update_test.go index cd95b5bde..f887ac4a0 100644 --- a/internal/cmd/beta/intake/user/update/update_test.go +++ b/internal/cmd/beta/intake/user/update/update_test.go @@ -7,12 +7,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/intake/user/user.go b/internal/cmd/beta/intake/user/user.go index 79ad83d79..6e53c457b 100644 --- a/internal/cmd/beta/intake/user/user.go +++ b/internal/cmd/beta/intake/user/user.go @@ -2,6 +2,7 @@ package user import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/create" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/beta/intake/user/describe" diff --git a/internal/cmd/beta/sfs/export-policy/create/create.go b/internal/cmd/beta/sfs/export-policy/create/create.go index 8732825aa..e640862df 100644 --- a/internal/cmd/beta/sfs/export-policy/create/create.go +++ b/internal/cmd/beta/sfs/export-policy/create/create.go @@ -6,6 +6,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/export-policy/create/create_test.go b/internal/cmd/beta/sfs/export-policy/create/create_test.go index f94074b1a..d019f6bd4 100644 --- a/internal/cmd/beta/sfs/export-policy/create/create_test.go +++ b/internal/cmd/beta/sfs/export-policy/create/create_test.go @@ -7,12 +7,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/export-policy/delete/delete.go b/internal/cmd/beta/sfs/export-policy/delete/delete.go index 8ae903d23..a02a994fc 100644 --- a/internal/cmd/beta/sfs/export-policy/delete/delete.go +++ b/internal/cmd/beta/sfs/export-policy/delete/delete.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const exportPolicyIdArg = "EXPORT_POLICY_ID" diff --git a/internal/cmd/beta/sfs/export-policy/delete/delete_test.go b/internal/cmd/beta/sfs/export-policy/delete/delete_test.go index c38c47ae6..77ea7870a 100644 --- a/internal/cmd/beta/sfs/export-policy/delete/delete_test.go +++ b/internal/cmd/beta/sfs/export-policy/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/export-policy/describe/describe.go b/internal/cmd/beta/sfs/export-policy/describe/describe.go index a9bc7b9b3..4cbed0c22 100644 --- a/internal/cmd/beta/sfs/export-policy/describe/describe.go +++ b/internal/cmd/beta/sfs/export-policy/describe/describe.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const exportPolicyIdArg = "EXPORT_POLICY_ID" diff --git a/internal/cmd/beta/sfs/export-policy/describe/describe_test.go b/internal/cmd/beta/sfs/export-policy/describe/describe_test.go index 73e711879..6b991a0b0 100644 --- a/internal/cmd/beta/sfs/export-policy/describe/describe_test.go +++ b/internal/cmd/beta/sfs/export-policy/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/export-policy/list/list.go b/internal/cmd/beta/sfs/export-policy/list/list.go index 7620dfc33..186f07106 100644 --- a/internal/cmd/beta/sfs/export-policy/list/list.go +++ b/internal/cmd/beta/sfs/export-policy/list/list.go @@ -6,6 +6,8 @@ import ( "strconv" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/export-policy/list/list_test.go b/internal/cmd/beta/sfs/export-policy/list/list_test.go index e2a73ace0..d9e463a46 100644 --- a/internal/cmd/beta/sfs/export-policy/list/list_test.go +++ b/internal/cmd/beta/sfs/export-policy/list/list_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/export-policy/update/update.go b/internal/cmd/beta/sfs/export-policy/update/update.go index a0ab0a6dc..5b0e1457a 100644 --- a/internal/cmd/beta/sfs/export-policy/update/update.go +++ b/internal/cmd/beta/sfs/export-policy/update/update.go @@ -6,6 +6,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/export-policy/update/update_test.go b/internal/cmd/beta/sfs/export-policy/update/update_test.go index 0ca322850..b3c37080c 100644 --- a/internal/cmd/beta/sfs/export-policy/update/update_test.go +++ b/internal/cmd/beta/sfs/export-policy/update/update_test.go @@ -7,12 +7,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/performance-class/list/list.go b/internal/cmd/beta/sfs/performance-class/list/list.go index 0ca22c392..c16ed52e9 100644 --- a/internal/cmd/beta/sfs/performance-class/list/list.go +++ b/internal/cmd/beta/sfs/performance-class/list/list.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) type inputModel struct { diff --git a/internal/cmd/beta/sfs/performance-class/list/list_test.go b/internal/cmd/beta/sfs/performance-class/list/list_test.go index 655159342..696b47e53 100644 --- a/internal/cmd/beta/sfs/performance-class/list/list_test.go +++ b/internal/cmd/beta/sfs/performance-class/list/list_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/resource-pool/create/create.go b/internal/cmd/beta/sfs/resource-pool/create/create.go index 526ef296f..38df9acf1 100644 --- a/internal/cmd/beta/sfs/resource-pool/create/create.go +++ b/internal/cmd/beta/sfs/resource-pool/create/create.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" - "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" ) const ( diff --git a/internal/cmd/beta/sfs/resource-pool/create/create_test.go b/internal/cmd/beta/sfs/resource-pool/create/create_test.go index 4b096c97d..c9ac9ee8a 100644 --- a/internal/cmd/beta/sfs/resource-pool/create/create_test.go +++ b/internal/cmd/beta/sfs/resource-pool/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete.go b/internal/cmd/beta/sfs/resource-pool/delete/delete.go index 17f8a6187..f67d92976 100644 --- a/internal/cmd/beta/sfs/resource-pool/delete/delete.go +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" - "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" ) const ( diff --git a/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go b/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go index ebdb37dd1..439726ffd 100644 --- a/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go +++ b/internal/cmd/beta/sfs/resource-pool/delete/delete_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sfs/resource-pool/describe/describe.go b/internal/cmd/beta/sfs/resource-pool/describe/describe.go index 0567b950e..c428b53e1 100644 --- a/internal/cmd/beta/sfs/resource-pool/describe/describe.go +++ b/internal/cmd/beta/sfs/resource-pool/describe/describe.go @@ -6,6 +6,8 @@ import ( "strings" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go b/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go index 8fddcd529..8f5b832ab 100644 --- a/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go +++ b/internal/cmd/beta/sfs/resource-pool/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sfs/resource-pool/list/list.go b/internal/cmd/beta/sfs/resource-pool/list/list.go index d62dbd7b6..d70ebf5a8 100644 --- a/internal/cmd/beta/sfs/resource-pool/list/list.go +++ b/internal/cmd/beta/sfs/resource-pool/list/list.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/resource-pool/list/list_test.go b/internal/cmd/beta/sfs/resource-pool/list/list_test.go index 4670a7856..082022e68 100644 --- a/internal/cmd/beta/sfs/resource-pool/list/list_test.go +++ b/internal/cmd/beta/sfs/resource-pool/list/list_test.go @@ -7,12 +7,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sfs/resource-pool/update/update.go b/internal/cmd/beta/sfs/resource-pool/update/update.go index 4c471440f..f70b6d7da 100644 --- a/internal/cmd/beta/sfs/resource-pool/update/update.go +++ b/internal/cmd/beta/sfs/resource-pool/update/update.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" - "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" ) const ( diff --git a/internal/cmd/beta/sfs/resource-pool/update/update_test.go b/internal/cmd/beta/sfs/resource-pool/update/update_test.go index bc47336c5..0ed674765 100644 --- a/internal/cmd/beta/sfs/resource-pool/update/update_test.go +++ b/internal/cmd/beta/sfs/resource-pool/update/update_test.go @@ -10,12 +10,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sfs/share/create/create.go b/internal/cmd/beta/sfs/share/create/create.go index b455f173d..3a565f197 100644 --- a/internal/cmd/beta/sfs/share/create/create.go +++ b/internal/cmd/beta/sfs/share/create/create.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" - "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" ) const ( diff --git a/internal/cmd/beta/sfs/share/create/create_test.go b/internal/cmd/beta/sfs/share/create/create_test.go index f535093e3..bbbf1ba42 100644 --- a/internal/cmd/beta/sfs/share/create/create_test.go +++ b/internal/cmd/beta/sfs/share/create/create_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/share/delete/delete.go b/internal/cmd/beta/sfs/share/delete/delete.go index 1b98b0473..c9086fe77 100644 --- a/internal/cmd/beta/sfs/share/delete/delete.go +++ b/internal/cmd/beta/sfs/share/delete/delete.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" - "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" ) const ( diff --git a/internal/cmd/beta/sfs/share/delete/delete_test.go b/internal/cmd/beta/sfs/share/delete/delete_test.go index 60040fc44..a6526653b 100644 --- a/internal/cmd/beta/sfs/share/delete/delete_test.go +++ b/internal/cmd/beta/sfs/share/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/share/describe/describe.go b/internal/cmd/beta/sfs/share/describe/describe.go index f593f9122..9fb2b1f06 100644 --- a/internal/cmd/beta/sfs/share/describe/describe.go +++ b/internal/cmd/beta/sfs/share/describe/describe.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/share/describe/describe_test.go b/internal/cmd/beta/sfs/share/describe/describe_test.go index 889117485..4a5cc4d37 100644 --- a/internal/cmd/beta/sfs/share/describe/describe_test.go +++ b/internal/cmd/beta/sfs/share/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/share/list/list.go b/internal/cmd/beta/sfs/share/list/list.go index e8945cd04..9f0aa1386 100644 --- a/internal/cmd/beta/sfs/share/list/list.go +++ b/internal/cmd/beta/sfs/share/list/list.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/share/list/list_test.go b/internal/cmd/beta/sfs/share/list/list_test.go index 7cff82a0d..8c5ba498a 100644 --- a/internal/cmd/beta/sfs/share/list/list_test.go +++ b/internal/cmd/beta/sfs/share/list/list_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/share/update/update.go b/internal/cmd/beta/sfs/share/update/update.go index 785d672cc..a13257c81 100644 --- a/internal/cmd/beta/sfs/share/update/update.go +++ b/internal/cmd/beta/sfs/share/update/update.go @@ -5,6 +5,9 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" - "github.com/stackitcloud/stackit-sdk-go/services/sfs/wait" ) const ( diff --git a/internal/cmd/beta/sfs/share/update/update_test.go b/internal/cmd/beta/sfs/share/update/update_test.go index 99494e905..5a108d9c4 100644 --- a/internal/cmd/beta/sfs/share/update/update_test.go +++ b/internal/cmd/beta/sfs/share/update/update_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/snapshot/create/create.go b/internal/cmd/beta/sfs/snapshot/create/create.go index c531009de..5344ec33a 100644 --- a/internal/cmd/beta/sfs/snapshot/create/create.go +++ b/internal/cmd/beta/sfs/snapshot/create/create.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/snapshot/create/create_test.go b/internal/cmd/beta/sfs/snapshot/create/create_test.go index 9ac34a9a8..209e11c18 100644 --- a/internal/cmd/beta/sfs/snapshot/create/create_test.go +++ b/internal/cmd/beta/sfs/snapshot/create/create_test.go @@ -7,12 +7,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/snapshot/delete/delete.go b/internal/cmd/beta/sfs/snapshot/delete/delete.go index 15e0cec17..fcc74be46 100644 --- a/internal/cmd/beta/sfs/snapshot/delete/delete.go +++ b/internal/cmd/beta/sfs/snapshot/delete/delete.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/client" sfsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sfs/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/snapshot/delete/delete_test.go b/internal/cmd/beta/sfs/snapshot/delete/delete_test.go index 3a3048b64..db010e22a 100644 --- a/internal/cmd/beta/sfs/snapshot/delete/delete_test.go +++ b/internal/cmd/beta/sfs/snapshot/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/snapshot/describe/describe.go b/internal/cmd/beta/sfs/snapshot/describe/describe.go index 4d45233fd..123e60172 100644 --- a/internal/cmd/beta/sfs/snapshot/describe/describe.go +++ b/internal/cmd/beta/sfs/snapshot/describe/describe.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/snapshot/describe/describe_test.go b/internal/cmd/beta/sfs/snapshot/describe/describe_test.go index f307c1f19..c477bceb7 100644 --- a/internal/cmd/beta/sfs/snapshot/describe/describe_test.go +++ b/internal/cmd/beta/sfs/snapshot/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sfs/snapshot/list/list.go b/internal/cmd/beta/sfs/snapshot/list/list.go index d2caf7b58..cfc0347b8 100644 --- a/internal/cmd/beta/sfs/snapshot/list/list.go +++ b/internal/cmd/beta/sfs/snapshot/list/list.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) const ( diff --git a/internal/cmd/beta/sfs/snapshot/list/list_test.go b/internal/cmd/beta/sfs/snapshot/list/list_test.go index 3c63ed05c..5678f3a55 100644 --- a/internal/cmd/beta/sfs/snapshot/list/list_test.go +++ b/internal/cmd/beta/sfs/snapshot/list/list_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/beta/sqlserverflex/database/create/create.go b/internal/cmd/beta/sqlserverflex/database/create/create.go index 00ae39bf2..6539b79e1 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" "github.com/spf13/cobra" ) diff --git a/internal/cmd/beta/sqlserverflex/database/create/create_test.go b/internal/cmd/beta/sqlserverflex/database/create/create_test.go index f33b7623c..e951a1506 100644 --- a/internal/cmd/beta/sqlserverflex/database/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/database/create/create_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go index ab137dcd0..449731141 100644 --- a/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go +++ b/internal/cmd/beta/sqlserverflex/database/delete/delete_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe.go b/internal/cmd/beta/sqlserverflex/database/describe/describe.go index 7ad000553..6fa5394fe 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) const ( diff --git a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go index 2a4bc2b01..176741037 100644 --- a/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/database/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/database/list/list.go b/internal/cmd/beta/sqlserverflex/database/list/list.go index 439b069df..3287a7981 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) const ( diff --git a/internal/cmd/beta/sqlserverflex/database/list/list_test.go b/internal/cmd/beta/sqlserverflex/database/list/list_test.go index 236f64f78..bd9e6678b 100644 --- a/internal/cmd/beta/sqlserverflex/database/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/database/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go index 8168cecc6..5916b6b34 100644 --- a/internal/cmd/beta/sqlserverflex/instance/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/create/create_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go index 4fb05fb0a..c653217bf 100644 --- a/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list.go b/internal/cmd/beta/sqlserverflex/instance/list/list.go index 7fe756750..379622006 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) const ( diff --git a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go index d730fa056..966d4f14f 100644 --- a/internal/cmd/beta/sqlserverflex/instance/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go index 894839d93..925b80494 100644 --- a/internal/cmd/beta/sqlserverflex/instance/update/update_test.go +++ b/internal/cmd/beta/sqlserverflex/instance/update/update_test.go @@ -10,10 +10,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/options/options_test.go b/internal/cmd/beta/sqlserverflex/options/options_test.go index 3a43e1668..716f9a5bd 100644 --- a/internal/cmd/beta/sqlserverflex/options/options_test.go +++ b/internal/cmd/beta/sqlserverflex/options/options_test.go @@ -8,11 +8,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/user/create/create.go b/internal/cmd/beta/sqlserverflex/user/create/create.go index 1f3887390..109a0cab6 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/client" sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) const ( diff --git a/internal/cmd/beta/sqlserverflex/user/create/create_test.go b/internal/cmd/beta/sqlserverflex/user/create/create_test.go index d8e9a8836..fc32a2312 100644 --- a/internal/cmd/beta/sqlserverflex/user/create/create_test.go +++ b/internal/cmd/beta/sqlserverflex/user/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go index 77123e300..0145cd339 100644 --- a/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go +++ b/internal/cmd/beta/sqlserverflex/user/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/user/list/list.go b/internal/cmd/beta/sqlserverflex/user/list/list.go index 24a216bbd..6218b5d15 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( sqlserverflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/sqlserverflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) const ( diff --git a/internal/cmd/beta/sqlserverflex/user/list/list_test.go b/internal/cmd/beta/sqlserverflex/user/list/list_test.go index fd7e31df7..37fa59f32 100644 --- a/internal/cmd/beta/sqlserverflex/user/list/list_test.go +++ b/internal/cmd/beta/sqlserverflex/user/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go index 921e39758..7be0952a8 100644 --- a/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/beta/sqlserverflex/user/reset-password/reset_password_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex" ) type testCtxKey struct{} diff --git a/internal/cmd/config/list/list.go b/internal/cmd/config/list/list.go index 71e115b29..99112637a 100644 --- a/internal/cmd/config/list/list.go +++ b/internal/cmd/config/list/list.go @@ -12,6 +12,7 @@ import ( "strings" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/config/profile/import/import.go b/internal/cmd/config/profile/import/import.go index aede97304..3761ec3fa 100644 --- a/internal/cmd/config/profile/import/import.go +++ b/internal/cmd/config/profile/import/import.go @@ -2,6 +2,7 @@ package importProfile import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" diff --git a/internal/cmd/curl/curl_test.go b/internal/cmd/curl/curl_test.go index ce2cd3c37..279e52153 100644 --- a/internal/cmd/curl/curl_test.go +++ b/internal/cmd/curl/curl_test.go @@ -15,6 +15,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/cmd/dns/record-set/create/create.go b/internal/cmd/dns/record-set/create/create.go index ef20922b5..1cf8c448b 100644 --- a/internal/cmd/dns/record-set/create/create.go +++ b/internal/cmd/dns/record-set/create/create.go @@ -4,10 +4,13 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-sdk-go/services/dns/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +21,6 @@ import ( dnsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/dns/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) const ( diff --git a/internal/cmd/dns/record-set/create/create_test.go b/internal/cmd/dns/record-set/create/create_test.go index 633d7ec60..43186e1f5 100644 --- a/internal/cmd/dns/record-set/create/create_test.go +++ b/internal/cmd/dns/record-set/create/create_test.go @@ -11,11 +11,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/dns/record-set/describe/describe_test.go b/internal/cmd/dns/record-set/describe/describe_test.go index 8f7214918..41d38ff69 100644 --- a/internal/cmd/dns/record-set/describe/describe_test.go +++ b/internal/cmd/dns/record-set/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/dns/record-set/list/list.go b/internal/cmd/dns/record-set/list/list.go index 88a7f5324..dfd02612c 100644 --- a/internal/cmd/dns/record-set/list/list.go +++ b/internal/cmd/dns/record-set/list/list.go @@ -9,6 +9,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( dnsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/dns/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) const ( diff --git a/internal/cmd/dns/record-set/list/list_test.go b/internal/cmd/dns/record-set/list/list_test.go index af2dc852b..a4751a5b8 100644 --- a/internal/cmd/dns/record-set/list/list_test.go +++ b/internal/cmd/dns/record-set/list/list_test.go @@ -13,12 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/dns/zone/clone/clone_test.go b/internal/cmd/dns/zone/clone/clone_test.go index 4479eea6e..84154b80f 100644 --- a/internal/cmd/dns/zone/clone/clone_test.go +++ b/internal/cmd/dns/zone/clone/clone_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/dns/zone/create/create_test.go b/internal/cmd/dns/zone/create/create_test.go index bf26e688a..f4fd21ec6 100644 --- a/internal/cmd/dns/zone/create/create_test.go +++ b/internal/cmd/dns/zone/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/dns/zone/describe/describe_test.go b/internal/cmd/dns/zone/describe/describe_test.go index a5704bfed..4a3340b47 100644 --- a/internal/cmd/dns/zone/describe/describe_test.go +++ b/internal/cmd/dns/zone/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/dns/zone/list/list_test.go b/internal/cmd/dns/zone/list/list_test.go index e270d69f7..a29d86714 100644 --- a/internal/cmd/dns/zone/list/list_test.go +++ b/internal/cmd/dns/zone/list/list_test.go @@ -13,12 +13,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/dns" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" - "github.com/stackitcloud/stackit-sdk-go/services/dns" ) type testCtxKey struct{} diff --git a/internal/cmd/git/flavor/list/list.go b/internal/cmd/git/flavor/list/list.go index d28448b6c..29f88573f 100644 --- a/internal/cmd/git/flavor/list/list.go +++ b/internal/cmd/git/flavor/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type inputModel struct { diff --git a/internal/cmd/git/flavor/list/list_test.go b/internal/cmd/git/flavor/list/list_test.go index 66c4ad264..81b4d7553 100644 --- a/internal/cmd/git/flavor/list/list_test.go +++ b/internal/cmd/git/flavor/list/list_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type testCtxKey struct{} diff --git a/internal/cmd/git/instance/create/create.go b/internal/cmd/git/instance/create/create.go index 70693a546..94adf0b52 100644 --- a/internal/cmd/git/instance/create/create.go +++ b/internal/cmd/git/instance/create/create.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-sdk-go/services/git/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/git" - "github.com/stackitcloud/stackit-sdk-go/services/git/wait" ) const ( diff --git a/internal/cmd/git/instance/create/create_test.go b/internal/cmd/git/instance/create/create_test.go index ba2b24a1e..b1056d786 100644 --- a/internal/cmd/git/instance/create/create_test.go +++ b/internal/cmd/git/instance/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type testCtxKey struct{} diff --git a/internal/cmd/git/instance/delete/delete.go b/internal/cmd/git/instance/delete/delete.go index b1aee9a2c..b3d18146c 100644 --- a/internal/cmd/git/instance/delete/delete.go +++ b/internal/cmd/git/instance/delete/delete.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-sdk-go/services/git/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( gitUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" - "github.com/stackitcloud/stackit-sdk-go/services/git/wait" ) type inputModel struct { diff --git a/internal/cmd/git/instance/describe/describe.go b/internal/cmd/git/instance/describe/describe.go index e90dd0905..1ee2af24d 100644 --- a/internal/cmd/git/instance/describe/describe.go +++ b/internal/cmd/git/instance/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type inputModel struct { diff --git a/internal/cmd/git/instance/describe/describe_test.go b/internal/cmd/git/instance/describe/describe_test.go index 6a0260f92..9b21d375a 100644 --- a/internal/cmd/git/instance/describe/describe_test.go +++ b/internal/cmd/git/instance/describe/describe_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type testCtxKey struct{} diff --git a/internal/cmd/git/instance/list/list.go b/internal/cmd/git/instance/list/list.go index 0f7095199..4e8ec548b 100644 --- a/internal/cmd/git/instance/list/list.go +++ b/internal/cmd/git/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/git/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type inputModel struct { diff --git a/internal/cmd/git/instance/list/list_test.go b/internal/cmd/git/instance/list/list_test.go index 459165b87..c065bb8da 100644 --- a/internal/cmd/git/instance/list/list_test.go +++ b/internal/cmd/git/instance/list/list_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/git" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/git" ) type testCtxKey struct{} diff --git a/internal/cmd/image/create/create.go b/internal/cmd/image/create/create.go index e463bf41e..fd1a20975 100644 --- a/internal/cmd/image/create/create.go +++ b/internal/cmd/image/create/create.go @@ -13,6 +13,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,7 +23,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/image/create/create_test.go b/internal/cmd/image/create/create_test.go index aeefdcdaa..bb437946a 100644 --- a/internal/cmd/image/create/create_test.go +++ b/internal/cmd/image/create/create_test.go @@ -11,11 +11,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/image/delete/delete.go b/internal/cmd/image/delete/delete.go index c41746f58..b41431710 100644 --- a/internal/cmd/image/delete/delete.go +++ b/internal/cmd/image/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/image/describe/describe.go b/internal/cmd/image/describe/describe.go index a1801be49..9bcdd4ca5 100644 --- a/internal/cmd/image/describe/describe.go +++ b/internal/cmd/image/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index f30ed8a85..7a472e178 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/image/update/update.go b/internal/cmd/image/update/update.go index 26d8ca088..f039a1fac 100644 --- a/internal/cmd/image/update/update.go +++ b/internal/cmd/image/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type imageConfig struct { diff --git a/internal/cmd/key-pair/delete/delete_test.go b/internal/cmd/key-pair/delete/delete_test.go index bb45798c9..47f75577a 100644 --- a/internal/cmd/key-pair/delete/delete_test.go +++ b/internal/cmd/key-pair/delete/delete_test.go @@ -6,9 +6,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/key-pair/key-pair.go b/internal/cmd/key-pair/key-pair.go index e435a27df..0ac0c7015 100644 --- a/internal/cmd/key-pair/key-pair.go +++ b/internal/cmd/key-pair/key-pair.go @@ -2,6 +2,7 @@ package keypair import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/cmd/key-pair/create" diff --git a/internal/cmd/kms/key/create/create.go b/internal/cmd/kms/key/create/create.go index 801f389a1..740deffa9 100644 --- a/internal/cmd/kms/key/create/create.go +++ b/internal/cmd/kms/key/create/create.go @@ -7,18 +7,20 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" - "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" ) const ( diff --git a/internal/cmd/kms/key/create/create_test.go b/internal/cmd/kms/key/create/create_test.go index 76c04dc6b..ce125a298 100644 --- a/internal/cmd/kms/key/create/create_test.go +++ b/internal/cmd/kms/key/create/create_test.go @@ -10,10 +10,11 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/delete/delete.go b/internal/cmd/kms/key/delete/delete.go index b4001df2a..63bc78763 100644 --- a/internal/cmd/kms/key/delete/delete.go +++ b/internal/cmd/kms/key/delete/delete.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +17,9 @@ import ( kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-sdk-go/services/kms" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" ) const ( diff --git a/internal/cmd/kms/key/delete/delete_test.go b/internal/cmd/kms/key/delete/delete_test.go index 78a2fee98..8f387a048 100644 --- a/internal/cmd/kms/key/delete/delete_test.go +++ b/internal/cmd/kms/key/delete/delete_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/describe/describe.go b/internal/cmd/kms/key/describe/describe.go index 7b728c06a..1ddec4c7a 100644 --- a/internal/cmd/kms/key/describe/describe.go +++ b/internal/cmd/kms/key/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/describe/describe_test.go b/internal/cmd/kms/key/describe/describe_test.go index 6a34e5c74..62d8b45ab 100644 --- a/internal/cmd/kms/key/describe/describe_test.go +++ b/internal/cmd/kms/key/describe/describe_test.go @@ -12,11 +12,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) type testCtxKey struct{} diff --git a/internal/cmd/kms/key/importKey/importKey.go b/internal/cmd/kms/key/importKey/importKey.go index 01896fed6..8e83b9681 100644 --- a/internal/cmd/kms/key/importKey/importKey.go +++ b/internal/cmd/kms/key/importKey/importKey.go @@ -8,17 +8,19 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/importKey/importKey_test.go b/internal/cmd/kms/key/importKey/importKey_test.go index 378f34ea0..6e19027c3 100644 --- a/internal/cmd/kms/key/importKey/importKey_test.go +++ b/internal/cmd/kms/key/importKey/importKey_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/list/list.go b/internal/cmd/kms/key/list/list.go index d437bff59..244fb40a0 100644 --- a/internal/cmd/kms/key/list/list.go +++ b/internal/cmd/kms/key/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/list/list_test.go b/internal/cmd/kms/key/list/list_test.go index 74491ae07..9f7b83b18 100644 --- a/internal/cmd/kms/key/list/list_test.go +++ b/internal/cmd/kms/key/list/list_test.go @@ -10,9 +10,10 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/restore/restore.go b/internal/cmd/kms/key/restore/restore.go index 8fb333e98..e6825cb92 100644 --- a/internal/cmd/kms/key/restore/restore.go +++ b/internal/cmd/kms/key/restore/restore.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +17,9 @@ import ( kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-sdk-go/services/kms" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" ) const ( diff --git a/internal/cmd/kms/key/restore/restore_test.go b/internal/cmd/kms/key/restore/restore_test.go index 9c75b8ec0..d15db6938 100644 --- a/internal/cmd/kms/key/restore/restore_test.go +++ b/internal/cmd/kms/key/restore/restore_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/rotate/rotate.go b/internal/cmd/kms/key/rotate/rotate.go index 8b6619a4a..1f2332572 100644 --- a/internal/cmd/kms/key/rotate/rotate.go +++ b/internal/cmd/kms/key/rotate/rotate.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,9 +16,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/key/rotate/rotate_test.go b/internal/cmd/kms/key/rotate/rotate_test.go index 18965764d..6211e8fa5 100644 --- a/internal/cmd/kms/key/rotate/rotate_test.go +++ b/internal/cmd/kms/key/rotate/rotate_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/keyring/create/create.go b/internal/cmd/kms/keyring/create/create.go index e51822dff..2d031e85e 100644 --- a/internal/cmd/kms/keyring/create/create.go +++ b/internal/cmd/kms/keyring/create/create.go @@ -7,18 +7,20 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" - "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" ) const ( diff --git a/internal/cmd/kms/keyring/create/create_test.go b/internal/cmd/kms/keyring/create/create_test.go index c4b307859..ae7111505 100644 --- a/internal/cmd/kms/keyring/create/create_test.go +++ b/internal/cmd/kms/keyring/create/create_test.go @@ -10,10 +10,11 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/keyring/delete/delete.go b/internal/cmd/kms/keyring/delete/delete.go index 8aa00db2b..03393c270 100644 --- a/internal/cmd/kms/keyring/delete/delete.go +++ b/internal/cmd/kms/keyring/delete/delete.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,9 +15,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/keyring/delete/delete_test.go b/internal/cmd/kms/keyring/delete/delete_test.go index 4881e63e0..0d950b0d8 100644 --- a/internal/cmd/kms/keyring/delete/delete_test.go +++ b/internal/cmd/kms/keyring/delete/delete_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/keyring/describe/describe.go b/internal/cmd/kms/keyring/describe/describe.go index b378ddd6c..c5c54cc7d 100644 --- a/internal/cmd/kms/keyring/describe/describe.go +++ b/internal/cmd/kms/keyring/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/keyring/describe/describe_test.go b/internal/cmd/kms/keyring/describe/describe_test.go index 8c0a309f5..cc0a8abdb 100644 --- a/internal/cmd/kms/keyring/describe/describe_test.go +++ b/internal/cmd/kms/keyring/describe/describe_test.go @@ -12,11 +12,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) type testCtxKey struct{} diff --git a/internal/cmd/kms/keyring/list/list.go b/internal/cmd/kms/keyring/list/list.go index 01153a6d4..4b3b09d67 100644 --- a/internal/cmd/kms/keyring/list/list.go +++ b/internal/cmd/kms/keyring/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) type inputModel struct { diff --git a/internal/cmd/kms/keyring/list/list_test.go b/internal/cmd/kms/keyring/list/list_test.go index d4e74c414..7fc3122fc 100644 --- a/internal/cmd/kms/keyring/list/list_test.go +++ b/internal/cmd/kms/keyring/list/list_test.go @@ -10,9 +10,10 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/destroy/destroy.go b/internal/cmd/kms/version/destroy/destroy.go index 48b40d469..bc56351c0 100644 --- a/internal/cmd/kms/version/destroy/destroy.go +++ b/internal/cmd/kms/version/destroy/destroy.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/destroy/destroy_test.go b/internal/cmd/kms/version/destroy/destroy_test.go index 2dde6cd9b..0b2816315 100644 --- a/internal/cmd/kms/version/destroy/destroy_test.go +++ b/internal/cmd/kms/version/destroy/destroy_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/disable/disable.go b/internal/cmd/kms/version/disable/disable.go index 2a57afd36..00d92b3f9 100644 --- a/internal/cmd/kms/version/disable/disable.go +++ b/internal/cmd/kms/version/disable/disable.go @@ -8,6 +8,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" - "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" ) const ( diff --git a/internal/cmd/kms/version/disable/disable_test.go b/internal/cmd/kms/version/disable/disable_test.go index c7ecf0825..ad81db570 100644 --- a/internal/cmd/kms/version/disable/disable_test.go +++ b/internal/cmd/kms/version/disable/disable_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/enable/enable.go b/internal/cmd/kms/version/enable/enable.go index 8f83cccb2..909cf3a32 100644 --- a/internal/cmd/kms/version/enable/enable.go +++ b/internal/cmd/kms/version/enable/enable.go @@ -8,6 +8,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" - "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" ) const ( diff --git a/internal/cmd/kms/version/enable/enable_test.go b/internal/cmd/kms/version/enable/enable_test.go index fe0edda01..3e176d217 100644 --- a/internal/cmd/kms/version/enable/enable_test.go +++ b/internal/cmd/kms/version/enable/enable_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/list/list.go b/internal/cmd/kms/version/list/list.go index 80361455a..bae8aa2e2 100644 --- a/internal/cmd/kms/version/list/list.go +++ b/internal/cmd/kms/version/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/list/list_test.go b/internal/cmd/kms/version/list/list_test.go index e8e97d40c..eaede273b 100644 --- a/internal/cmd/kms/version/list/list_test.go +++ b/internal/cmd/kms/version/list/list_test.go @@ -10,9 +10,10 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/restore/restore.go b/internal/cmd/kms/version/restore/restore.go index b87b6165c..c8a850a62 100644 --- a/internal/cmd/kms/version/restore/restore.go +++ b/internal/cmd/kms/version/restore/restore.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/version/restore/restore_test.go b/internal/cmd/kms/version/restore/restore_test.go index 7454fc5a5..e51c94316 100644 --- a/internal/cmd/kms/version/restore/restore_test.go +++ b/internal/cmd/kms/version/restore/restore_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/wrappingkey/create/create.go b/internal/cmd/kms/wrappingkey/create/create.go index 3a751b59e..3397f112f 100644 --- a/internal/cmd/kms/wrappingkey/create/create.go +++ b/internal/cmd/kms/wrappingkey/create/create.go @@ -7,18 +7,20 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" - "github.com/stackitcloud/stackit-sdk-go/services/kms/wait" ) const ( diff --git a/internal/cmd/kms/wrappingkey/create/create_test.go b/internal/cmd/kms/wrappingkey/create/create_test.go index 2b7d356de..737b88ef2 100644 --- a/internal/cmd/kms/wrappingkey/create/create_test.go +++ b/internal/cmd/kms/wrappingkey/create/create_test.go @@ -10,10 +10,11 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/wrappingkey/delete/delete.go b/internal/cmd/kms/wrappingkey/delete/delete.go index 2f572d58c..cd1ce3f6a 100644 --- a/internal/cmd/kms/wrappingkey/delete/delete.go +++ b/internal/cmd/kms/wrappingkey/delete/delete.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +17,9 @@ import ( kmsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-sdk-go/services/kms" + + "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" ) const ( diff --git a/internal/cmd/kms/wrappingkey/delete/delete_test.go b/internal/cmd/kms/wrappingkey/delete/delete_test.go index c8d3a2ee2..8b6460695 100644 --- a/internal/cmd/kms/wrappingkey/delete/delete_test.go +++ b/internal/cmd/kms/wrappingkey/delete/delete_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/wrappingkey/describe/describe.go b/internal/cmd/kms/wrappingkey/describe/describe.go index d7ec6a2f8..e58e9fa81 100644 --- a/internal/cmd/kms/wrappingkey/describe/describe.go +++ b/internal/cmd/kms/wrappingkey/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/wrappingkey/describe/describe_test.go b/internal/cmd/kms/wrappingkey/describe/describe_test.go index 579f27f3d..6855c27bd 100644 --- a/internal/cmd/kms/wrappingkey/describe/describe_test.go +++ b/internal/cmd/kms/wrappingkey/describe/describe_test.go @@ -12,11 +12,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) type testCtxKey struct{} diff --git a/internal/cmd/kms/wrappingkey/list/list.go b/internal/cmd/kms/wrappingkey/list/list.go index 6f1498f76..6d64940ed 100644 --- a/internal/cmd/kms/wrappingkey/list/list.go +++ b/internal/cmd/kms/wrappingkey/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/kms/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/kms/wrappingkey/list/list_test.go b/internal/cmd/kms/wrappingkey/list/list_test.go index 05c571ed3..36c6b647d 100644 --- a/internal/cmd/kms/wrappingkey/list/list_test.go +++ b/internal/cmd/kms/wrappingkey/list/list_test.go @@ -10,9 +10,10 @@ import ( "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/kms" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/kms" ) const ( diff --git a/internal/cmd/load-balancer/create/create.go b/internal/cmd/load-balancer/create/create.go index fa7e8658f..47d479c8a 100644 --- a/internal/cmd/load-balancer/create/create.go +++ b/internal/cmd/load-balancer/create/create.go @@ -9,6 +9,9 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,8 +22,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/wait" ) const ( diff --git a/internal/cmd/load-balancer/describe/describe_test.go b/internal/cmd/load-balancer/describe/describe_test.go index 5dcbfe446..6254d9e93 100644 --- a/internal/cmd/load-balancer/describe/describe_test.go +++ b/internal/cmd/load-balancer/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload.go b/internal/cmd/load-balancer/generate-payload/generate_payload.go index 1149ae311..0170fcbe9 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/spf13/cobra" ) diff --git a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go index ca20bc950..1f0fefcdf 100644 --- a/internal/cmd/load-balancer/generate-payload/generate_payload_test.go +++ b/internal/cmd/load-balancer/generate-payload/generate_payload_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/list/list_test.go b/internal/cmd/load-balancer/list/list_test.go index 4d6decfa3..e400b0d6a 100644 --- a/internal/cmd/load-balancer/list/list_test.go +++ b/internal/cmd/load-balancer/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/observability-credentials/add/add.go b/internal/cmd/load-balancer/observability-credentials/add/add.go index edb3f447e..89435c3fc 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/load-balancer/observability-credentials/add/add_test.go b/internal/cmd/load-balancer/observability-credentials/add/add_test.go index f36d7e00c..d5b1fe7c8 100644 --- a/internal/cmd/load-balancer/observability-credentials/add/add_test.go +++ b/internal/cmd/load-balancer/observability-credentials/add/add_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go index 338dcaa08..a081af49c 100644 --- a/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go +++ b/internal/cmd/load-balancer/observability-credentials/cleanup/cleanup_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go index c53114075..3a8675d10 100644 --- a/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go +++ b/internal/cmd/load-balancer/observability-credentials/delete/delete_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go index 1060baeab..e553e0e3a 100644 --- a/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go +++ b/internal/cmd/load-balancer/observability-credentials/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/observability-credentials/list/list.go b/internal/cmd/load-balancer/observability-credentials/list/list.go index 1b58291a6..740c94b98 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +20,6 @@ import ( lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/observability-credentials/list/list_test.go b/internal/cmd/load-balancer/observability-credentials/list/list_test.go index 85b3650fa..c5ad1d770 100644 --- a/internal/cmd/load-balancer/observability-credentials/list/list_test.go +++ b/internal/cmd/load-balancer/observability-credentials/list/list_test.go @@ -9,12 +9,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/quota/quota_test.go b/internal/cmd/load-balancer/quota/quota_test.go index 1a3ccae0a..bee2dc9dc 100644 --- a/internal/cmd/load-balancer/quota/quota_test.go +++ b/internal/cmd/load-balancer/quota/quota_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target.go b/internal/cmd/load-balancer/target-pool/add-target/add_target.go index 4cc41d4ef..716c273a3 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/client" "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/spf13/cobra" ) diff --git a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go index 16ebc3096..c4fec49c0 100644 --- a/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go +++ b/internal/cmd/load-balancer/target-pool/add-target/add_target_test.go @@ -7,10 +7,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/load-balancer/target-pool/describe/describe.go b/internal/cmd/load-balancer/target-pool/describe/describe.go index dadfab47d..99b267962 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe.go @@ -9,6 +9,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( lbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) const ( diff --git a/internal/cmd/load-balancer/target-pool/describe/describe_test.go b/internal/cmd/load-balancer/target-pool/describe/describe_test.go index 7c1a7535a..f16e3deaf 100644 --- a/internal/cmd/load-balancer/target-pool/describe/describe_test.go +++ b/internal/cmd/load-balancer/target-pool/describe/describe_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" ) type testCtxKey struct{} diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go index 4cb053eff..129ca8773 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/client" "github.com/stackitcloud/stackit-cli/internal/pkg/services/load-balancer/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/spf13/cobra" ) diff --git a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go index e09747421..57d47df6f 100644 --- a/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go +++ b/internal/cmd/load-balancer/target-pool/remove-target/remove_target_test.go @@ -7,10 +7,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/logme/credentials/create/create.go b/internal/cmd/logme/credentials/create/create.go index 79d5577c4..aab7a20ae 100644 --- a/internal/cmd/logme/credentials/create/create.go +++ b/internal/cmd/logme/credentials/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/logme" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/logme/client" logmeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logme/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logme" ) const ( diff --git a/internal/cmd/logme/instance/list/list.go b/internal/cmd/logme/instance/list/list.go index 20efce498..b3b15ce1c 100644 --- a/internal/cmd/logme/instance/list/list.go +++ b/internal/cmd/logme/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/logme" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/logme/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logme" ) const ( diff --git a/internal/cmd/logme/plans/plans.go b/internal/cmd/logme/plans/plans.go index 5b1597bf4..76d762a1d 100644 --- a/internal/cmd/logme/plans/plans.go +++ b/internal/cmd/logme/plans/plans.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/logme" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/logme/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logme" ) const ( diff --git a/internal/cmd/logs/access_token/create/create.go b/internal/cmd/logs/access_token/create/create.go index 452342b3d..852810a85 100644 --- a/internal/cmd/logs/access_token/create/create.go +++ b/internal/cmd/logs/access_token/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" logsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/spf13/cobra" ) diff --git a/internal/cmd/logs/access_token/delete/delete.go b/internal/cmd/logs/access_token/delete/delete.go index 77b4777dc..d55c8d3a2 100644 --- a/internal/cmd/logs/access_token/delete/delete.go +++ b/internal/cmd/logs/access_token/delete/delete.go @@ -4,9 +4,10 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" diff --git a/internal/cmd/logs/access_token/delete_all/delete_all.go b/internal/cmd/logs/access_token/delete_all/delete_all.go index 337010be8..e12e89804 100644 --- a/internal/cmd/logs/access_token/delete_all/delete_all.go +++ b/internal/cmd/logs/access_token/delete_all/delete_all.go @@ -4,11 +4,12 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go b/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go index a4673a073..fbad9528a 100644 --- a/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go +++ b/internal/cmd/logs/access_token/delete_all_expired/delete_all_expired.go @@ -4,11 +4,12 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/logs/access_token/describe/describe.go b/internal/cmd/logs/access_token/describe/describe.go index 21f734a51..d81a8b258 100644 --- a/internal/cmd/logs/access_token/describe/describe.go +++ b/internal/cmd/logs/access_token/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/spf13/cobra" ) diff --git a/internal/cmd/logs/access_token/list/list.go b/internal/cmd/logs/access_token/list/list.go index 309fd073f..27967bdc8 100644 --- a/internal/cmd/logs/access_token/list/list.go +++ b/internal/cmd/logs/access_token/list/list.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/spf13/cobra" ) diff --git a/internal/cmd/logs/access_token/update/update.go b/internal/cmd/logs/access_token/update/update.go index 85952136a..6fe999dba 100644 --- a/internal/cmd/logs/access_token/update/update.go +++ b/internal/cmd/logs/access_token/update/update.go @@ -4,9 +4,10 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/logs/instance/create/create.go b/internal/cmd/logs/instance/create/create.go index 3ea20c774..a7fca44c3 100644 --- a/internal/cmd/logs/instance/create/create.go +++ b/internal/cmd/logs/instance/create/create.go @@ -4,22 +4,25 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" + "github.com/stackitcloud/stackit-sdk-go/services/logs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs/wait" ) const ( diff --git a/internal/cmd/logs/instance/create/create_test.go b/internal/cmd/logs/instance/create/create_test.go index a1835d54c..f533b16ec 100644 --- a/internal/cmd/logs/instance/create/create_test.go +++ b/internal/cmd/logs/instance/create/create_test.go @@ -5,13 +5,15 @@ import ( "strconv" "testing" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/cmd/logs/instance/delete/delete.go b/internal/cmd/logs/instance/delete/delete.go index 6b889e54d..d00f33fc8 100644 --- a/internal/cmd/logs/instance/delete/delete.go +++ b/internal/cmd/logs/instance/delete/delete.go @@ -4,12 +4,14 @@ import ( "context" "fmt" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,9 +19,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-sdk-go/services/logs/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" logsUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs/wait" ) const ( diff --git a/internal/cmd/logs/instance/delete/delete_test.go b/internal/cmd/logs/instance/delete/delete_test.go index 7b89cccb0..64501bf2e 100644 --- a/internal/cmd/logs/instance/delete/delete_test.go +++ b/internal/cmd/logs/instance/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" ) const ( diff --git a/internal/cmd/logs/instance/describe/describe.go b/internal/cmd/logs/instance/describe/describe.go index dc084eaeb..b145e6e66 100644 --- a/internal/cmd/logs/instance/describe/describe.go +++ b/internal/cmd/logs/instance/describe/describe.go @@ -4,10 +4,12 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/logs/instance/describe/describe_test.go b/internal/cmd/logs/instance/describe/describe_test.go index 661ce4aa5..ed6afc9d4 100644 --- a/internal/cmd/logs/instance/describe/describe_test.go +++ b/internal/cmd/logs/instance/describe/describe_test.go @@ -7,11 +7,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/logs" ) type testCtxKey struct{} diff --git a/internal/cmd/logs/instance/list/list.go b/internal/cmd/logs/instance/list/list.go index 571cb98b2..153a4c2a9 100644 --- a/internal/cmd/logs/instance/list/list.go +++ b/internal/cmd/logs/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/logs/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/logs" ) type inputModel struct { diff --git a/internal/cmd/logs/instance/update/update_test.go b/internal/cmd/logs/instance/update/update_test.go index b885d5677..07e43ea28 100644 --- a/internal/cmd/logs/instance/update/update_test.go +++ b/internal/cmd/logs/instance/update/update_test.go @@ -4,9 +4,10 @@ import ( "context" "testing" + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/cmd/mariadb/credentials/list/list.go b/internal/cmd/mariadb/credentials/list/list.go index aa79aadf7..339891e99 100644 --- a/internal/cmd/mariadb/credentials/list/list.go +++ b/internal/cmd/mariadb/credentials/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mariadb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( mariadbUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mariadb/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) const ( diff --git a/internal/cmd/mariadb/instance/list/list.go b/internal/cmd/mariadb/instance/list/list.go index 5c13db105..a009ed2ee 100644 --- a/internal/cmd/mariadb/instance/list/list.go +++ b/internal/cmd/mariadb/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mariadb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/mariadb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) const ( diff --git a/internal/cmd/mariadb/plans/plans.go b/internal/cmd/mariadb/plans/plans.go index 5a6d9f017..5c5819695 100644 --- a/internal/cmd/mariadb/plans/plans.go +++ b/internal/cmd/mariadb/plans/plans.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mariadb" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/mariadb/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mariadb" ) const ( diff --git a/internal/cmd/mongodbflex/backup/describe/describe.go b/internal/cmd/mongodbflex/backup/describe/describe.go index 17bbe9b40..1e34a88ee 100644 --- a/internal/cmd/mongodbflex/backup/describe/describe.go +++ b/internal/cmd/mongodbflex/backup/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( mongoUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) const ( diff --git a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go index 1822b4583..ad3bf61de 100644 --- a/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go +++ b/internal/cmd/mongodbflex/backup/restore-jobs/restore_jobs.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( mongodbflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) const ( diff --git a/internal/cmd/mongodbflex/backup/schedule/schedule.go b/internal/cmd/mongodbflex/backup/schedule/schedule.go index 614b42082..32d22a094 100644 --- a/internal/cmd/mongodbflex/backup/schedule/schedule.go +++ b/internal/cmd/mongodbflex/backup/schedule/schedule.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) const ( diff --git a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go index 6934fb862..9730a8621 100644 --- a/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/mongodbflex/backup/update-schedule/update_schedule.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/client" mongoDBflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) const ( diff --git a/internal/cmd/mongodbflex/instance/create/create.go b/internal/cmd/mongodbflex/instance/create/create.go index 17cce56a3..26e65e9a0 100644 --- a/internal/cmd/mongodbflex/instance/create/create.go +++ b/internal/cmd/mongodbflex/instance/create/create.go @@ -8,6 +8,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,8 +22,6 @@ import ( mongodbflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/wait" ) const ( diff --git a/internal/cmd/mongodbflex/options/options.go b/internal/cmd/mongodbflex/options/options.go index 73febf6cf..a49d3bc84 100644 --- a/internal/cmd/mongodbflex/options/options.go +++ b/internal/cmd/mongodbflex/options/options.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) const ( diff --git a/internal/cmd/mongodbflex/user/create/create.go b/internal/cmd/mongodbflex/user/create/create.go index 9fc9def6d..c25309c64 100644 --- a/internal/cmd/mongodbflex/user/create/create.go +++ b/internal/cmd/mongodbflex/user/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/client" mongodbflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/mongodbflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) const ( diff --git a/internal/cmd/network-area/create/create.go b/internal/cmd/network-area/create/create.go index a99fafb57..b75fa6634 100644 --- a/internal/cmd/network-area/create/create.go +++ b/internal/cmd/network-area/create/create.go @@ -8,6 +8,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,8 +22,6 @@ import ( rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/delete/delete.go b/internal/cmd/network-area/delete/delete.go index e1dbca35e..f9c20e3a9 100644 --- a/internal/cmd/network-area/delete/delete.go +++ b/internal/cmd/network-area/delete/delete.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" ) const ( diff --git a/internal/cmd/network-area/describe/describe.go b/internal/cmd/network-area/describe/describe.go index f51fa40a5..0c467f2c7 100644 --- a/internal/cmd/network-area/describe/describe.go +++ b/internal/cmd/network-area/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -17,7 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/list/list.go b/internal/cmd/network-area/list/list.go index a7688648e..cf8d9975d 100644 --- a/internal/cmd/network-area/list/list.go +++ b/internal/cmd/network-area/list/list.go @@ -9,6 +9,8 @@ import ( rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/network-range/create/create.go b/internal/cmd/network-area/network-range/create/create.go index 0502663d8..0767cc9ea 100644 --- a/internal/cmd/network-area/network-range/create/create.go +++ b/internal/cmd/network-area/network-range/create/create.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/network-range/delete/delete.go b/internal/cmd/network-area/network-range/delete/delete.go index 84ceb85c7..eb0daa88d 100644 --- a/internal/cmd/network-area/network-range/delete/delete.go +++ b/internal/cmd/network-area/network-range/delete/delete.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/network-range/describe/describe.go b/internal/cmd/network-area/network-range/describe/describe.go index 1abd718b9..6ba53cb83 100644 --- a/internal/cmd/network-area/network-range/describe/describe.go +++ b/internal/cmd/network-area/network-range/describe/describe.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/network-range/list/list.go b/internal/cmd/network-area/network-range/list/list.go index 42d57c669..4ad161d30 100644 --- a/internal/cmd/network-area/network-range/list/list.go +++ b/internal/cmd/network-area/network-range/list/list.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/region/create/create.go b/internal/cmd/network-area/region/create/create.go index 41ec64c0d..791c8fabe 100644 --- a/internal/cmd/network-area/region/create/create.go +++ b/internal/cmd/network-area/region/create/create.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,8 +20,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" ) const ( diff --git a/internal/cmd/network-area/region/create/create_test.go b/internal/cmd/network-area/region/create/create_test.go index cff70a377..d04b8dc23 100644 --- a/internal/cmd/network-area/region/create/create_test.go +++ b/internal/cmd/network-area/region/create/create_test.go @@ -11,11 +11,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/region/delete/delete.go b/internal/cmd/network-area/region/delete/delete.go index 9c8586a94..d016aff73 100644 --- a/internal/cmd/network-area/region/delete/delete.go +++ b/internal/cmd/network-area/region/delete/delete.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" ) const ( diff --git a/internal/cmd/network-area/region/delete/delete_test.go b/internal/cmd/network-area/region/delete/delete_test.go index 919e86cb8..5a47b2b49 100644 --- a/internal/cmd/network-area/region/delete/delete_test.go +++ b/internal/cmd/network-area/region/delete/delete_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/region/describe/describe.go b/internal/cmd/network-area/region/describe/describe.go index 131d0f031..4694d1db5 100644 --- a/internal/cmd/network-area/region/describe/describe.go +++ b/internal/cmd/network-area/region/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +20,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/region/describe/describe_test.go b/internal/cmd/network-area/region/describe/describe_test.go index ea4beee77..18a040739 100644 --- a/internal/cmd/network-area/region/describe/describe_test.go +++ b/internal/cmd/network-area/region/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/region/list/list.go b/internal/cmd/network-area/region/list/list.go index c74f79848..4988c87cc 100644 --- a/internal/cmd/network-area/region/list/list.go +++ b/internal/cmd/network-area/region/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -17,7 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/region/list/list_test.go b/internal/cmd/network-area/region/list/list_test.go index f3cbc6ec8..34cd219e0 100644 --- a/internal/cmd/network-area/region/list/list_test.go +++ b/internal/cmd/network-area/region/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type testCtxKey struct{} diff --git a/internal/cmd/network-area/region/update/update.go b/internal/cmd/network-area/region/update/update.go index 8b68195ff..151c83a50 100644 --- a/internal/cmd/network-area/region/update/update.go +++ b/internal/cmd/network-area/region/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/region/update/update_test.go b/internal/cmd/network-area/region/update/update_test.go index 90535d384..11494fbf0 100644 --- a/internal/cmd/network-area/region/update/update_test.go +++ b/internal/cmd/network-area/region/update/update_test.go @@ -11,11 +11,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/route/create/create.go b/internal/cmd/network-area/route/create/create.go index 72c9fe006..7728da988 100644 --- a/internal/cmd/network-area/route/create/create.go +++ b/internal/cmd/network-area/route/create/create.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/route/delete/delete.go b/internal/cmd/network-area/route/delete/delete.go index dbad67c03..55ec64472 100644 --- a/internal/cmd/network-area/route/delete/delete.go +++ b/internal/cmd/network-area/route/delete/delete.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/route/describe/describe.go b/internal/cmd/network-area/route/describe/describe.go index 2a7e7e4f1..070b47738 100644 --- a/internal/cmd/network-area/route/describe/describe.go +++ b/internal/cmd/network-area/route/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-area/route/list/list.go b/internal/cmd/network-area/route/list/list.go index d85ac49db..8cadbdef7 100644 --- a/internal/cmd/network-area/route/list/list.go +++ b/internal/cmd/network-area/route/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/route/update/update.go b/internal/cmd/network-area/route/update/update.go index c20c86601..2a422a1d4 100644 --- a/internal/cmd/network-area/route/update/update.go +++ b/internal/cmd/network-area/route/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/route/update/update_test.go b/internal/cmd/network-area/route/update/update_test.go index 855d36513..11a47b15c 100644 --- a/internal/cmd/network-area/route/update/update_test.go +++ b/internal/cmd/network-area/route/update/update_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/create/create.go b/internal/cmd/network-area/routingtable/create/create.go index 708737c87..aed268466 100644 --- a/internal/cmd/network-area/routingtable/create/create.go +++ b/internal/cmd/network-area/routingtable/create/create.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -13,7 +15,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/create/create_test.go b/internal/cmd/network-area/routingtable/create/create_test.go index a4becd7fb..2ff9fa52b 100644 --- a/internal/cmd/network-area/routingtable/create/create_test.go +++ b/internal/cmd/network-area/routingtable/create/create_test.go @@ -9,12 +9,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type testCtxKey struct{} diff --git a/internal/cmd/network-area/routingtable/delete/delete.go b/internal/cmd/network-area/routingtable/delete/delete.go index 67aaf08af..1ae94658c 100644 --- a/internal/cmd/network-area/routingtable/delete/delete.go +++ b/internal/cmd/network-area/routingtable/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" diff --git a/internal/cmd/network-area/routingtable/delete/delete_test.go b/internal/cmd/network-area/routingtable/delete/delete_test.go index 1b34d702b..0bf08b186 100644 --- a/internal/cmd/network-area/routingtable/delete/delete_test.go +++ b/internal/cmd/network-area/routingtable/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) diff --git a/internal/cmd/network-area/routingtable/describe/describe.go b/internal/cmd/network-area/routingtable/describe/describe.go index 883fc00da..8292e3f9b 100644 --- a/internal/cmd/network-area/routingtable/describe/describe.go +++ b/internal/cmd/network-area/routingtable/describe/describe.go @@ -6,6 +6,8 @@ import ( "strings" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/describe/describe_test.go b/internal/cmd/network-area/routingtable/describe/describe_test.go index 5e8f76ea4..295b394a2 100644 --- a/internal/cmd/network-area/routingtable/describe/describe_test.go +++ b/internal/cmd/network-area/routingtable/describe/describe_test.go @@ -5,12 +5,13 @@ import ( "time" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const testRegion = "eu01" diff --git a/internal/cmd/network-area/routingtable/list/list.go b/internal/cmd/network-area/routingtable/list/list.go index e0993d5a0..82553f83c 100644 --- a/internal/cmd/network-area/routingtable/list/list.go +++ b/internal/cmd/network-area/routingtable/list/list.go @@ -6,6 +6,8 @@ import ( "strings" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/list/list_test.go b/internal/cmd/network-area/routingtable/list/list_test.go index ef7ec9849..3bccad11c 100644 --- a/internal/cmd/network-area/routingtable/list/list_test.go +++ b/internal/cmd/network-area/routingtable/list/list_test.go @@ -9,12 +9,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const testRegion = "eu01" diff --git a/internal/cmd/network-area/routingtable/route/create/create.go b/internal/cmd/network-area/routingtable/route/create/create.go index fea46c5d8..d3455087d 100644 --- a/internal/cmd/network-area/routingtable/route/create/create.go +++ b/internal/cmd/network-area/routingtable/route/create/create.go @@ -7,6 +7,8 @@ import ( "strings" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -16,7 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/route/create/create_test.go b/internal/cmd/network-area/routingtable/route/create/create_test.go index 548a40d1f..a5b99aff0 100644 --- a/internal/cmd/network-area/routingtable/route/create/create_test.go +++ b/internal/cmd/network-area/routingtable/route/create/create_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type testCtxKey struct{} diff --git a/internal/cmd/network-area/routingtable/route/delete/delete.go b/internal/cmd/network-area/routingtable/route/delete/delete.go index 1d07556ec..ba4ea28cb 100644 --- a/internal/cmd/network-area/routingtable/route/delete/delete.go +++ b/internal/cmd/network-area/routingtable/route/delete/delete.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" diff --git a/internal/cmd/network-area/routingtable/route/delete/delete_test.go b/internal/cmd/network-area/routingtable/route/delete/delete_test.go index 22e137698..eb956ef98 100644 --- a/internal/cmd/network-area/routingtable/route/delete/delete_test.go +++ b/internal/cmd/network-area/routingtable/route/delete/delete_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" ) diff --git a/internal/cmd/network-area/routingtable/route/describe/describe.go b/internal/cmd/network-area/routingtable/route/describe/describe.go index fd4e76489..128394538 100644 --- a/internal/cmd/network-area/routingtable/route/describe/describe.go +++ b/internal/cmd/network-area/routingtable/route/describe/describe.go @@ -6,6 +6,8 @@ import ( "strings" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/route/describe/describe_test.go b/internal/cmd/network-area/routingtable/route/describe/describe_test.go index 8be0698c9..4459a2fb8 100644 --- a/internal/cmd/network-area/routingtable/route/describe/describe_test.go +++ b/internal/cmd/network-area/routingtable/route/describe/describe_test.go @@ -5,12 +5,13 @@ import ( "time" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const testRegion = "eu01" diff --git a/internal/cmd/network-area/routingtable/route/list/list.go b/internal/cmd/network-area/routingtable/route/list/list.go index 36317b652..4fe9f1122 100644 --- a/internal/cmd/network-area/routingtable/route/list/list.go +++ b/internal/cmd/network-area/routingtable/route/list/list.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/route/list/list_test.go b/internal/cmd/network-area/routingtable/route/list/list_test.go index 9834e9bae..18930a4a2 100644 --- a/internal/cmd/network-area/routingtable/route/list/list_test.go +++ b/internal/cmd/network-area/routingtable/route/list/list_test.go @@ -6,12 +6,13 @@ import ( "time" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const testRegion = "eu01" diff --git a/internal/cmd/network-area/routingtable/route/route.go b/internal/cmd/network-area/routingtable/route/route.go index 158881952..7b2d05559 100644 --- a/internal/cmd/network-area/routingtable/route/route.go +++ b/internal/cmd/network-area/routingtable/route/route.go @@ -2,6 +2,7 @@ package route import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/create" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/route/describe" diff --git a/internal/cmd/network-area/routingtable/route/update/update.go b/internal/cmd/network-area/routingtable/route/update/update.go index e2fb4d2c8..719043be2 100644 --- a/internal/cmd/network-area/routingtable/route/update/update.go +++ b/internal/cmd/network-area/routingtable/route/update/update.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/route/update/update_test.go b/internal/cmd/network-area/routingtable/route/update/update_test.go index 5f987734d..1e1e0a19b 100644 --- a/internal/cmd/network-area/routingtable/route/update/update_test.go +++ b/internal/cmd/network-area/routingtable/route/update/update_test.go @@ -8,12 +8,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type testCtxKey struct{} diff --git a/internal/cmd/network-area/routingtable/routingtable.go b/internal/cmd/network-area/routingtable/routingtable.go index 64e86403a..514d8146a 100644 --- a/internal/cmd/network-area/routingtable/routingtable.go +++ b/internal/cmd/network-area/routingtable/routingtable.go @@ -2,6 +2,7 @@ package routingtable import ( "github.com/spf13/cobra" + rtCreate "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/create" rtDelete "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/delete" rtDescribe "github.com/stackitcloud/stackit-cli/internal/cmd/network-area/routingtable/describe" diff --git a/internal/cmd/network-area/routingtable/update/update.go b/internal/cmd/network-area/routingtable/update/update.go index 7d83543a4..0d01f5e81 100644 --- a/internal/cmd/network-area/routingtable/update/update.go +++ b/internal/cmd/network-area/routingtable/update/update.go @@ -5,6 +5,8 @@ import ( "fmt" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-area/routingtable/update/update_test.go b/internal/cmd/network-area/routingtable/update/update_test.go index 7ed4f47dd..790782124 100644 --- a/internal/cmd/network-area/routingtable/update/update_test.go +++ b/internal/cmd/network-area/routingtable/update/update_test.go @@ -9,12 +9,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type testCtxKey struct{} diff --git a/internal/cmd/network-area/update/update.go b/internal/cmd/network-area/update/update.go index 98f778bc3..08d1f825c 100644 --- a/internal/cmd/network-area/update/update.go +++ b/internal/cmd/network-area/update/update.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -17,7 +19,6 @@ import ( rmClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" rmUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network-interface/create/create.go b/internal/cmd/network-interface/create/create.go index 5939d712d..5a1f5b8c3 100644 --- a/internal/cmd/network-interface/create/create.go +++ b/internal/cmd/network-interface/create/create.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/create/create_test.go b/internal/cmd/network-interface/create/create_test.go index 5ebe70d2b..50dd643d0 100644 --- a/internal/cmd/network-interface/create/create_test.go +++ b/internal/cmd/network-interface/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/delete/delete.go b/internal/cmd/network-interface/delete/delete.go index de6d972cb..af8a49eee 100644 --- a/internal/cmd/network-interface/delete/delete.go +++ b/internal/cmd/network-interface/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/delete/delete_test.go b/internal/cmd/network-interface/delete/delete_test.go index e541c34a7..2f50c9511 100644 --- a/internal/cmd/network-interface/delete/delete_test.go +++ b/internal/cmd/network-interface/delete/delete_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/describe/describe.go b/internal/cmd/network-interface/describe/describe.go index 52a47532a..49e93d690 100644 --- a/internal/cmd/network-interface/describe/describe.go +++ b/internal/cmd/network-interface/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/describe/describe_test.go b/internal/cmd/network-interface/describe/describe_test.go index be6d7f317..6403f68bf 100644 --- a/internal/cmd/network-interface/describe/describe_test.go +++ b/internal/cmd/network-interface/describe/describe_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/list/list.go b/internal/cmd/network-interface/list/list.go index b3ac79c9d..33941d1de 100644 --- a/internal/cmd/network-interface/list/list.go +++ b/internal/cmd/network-interface/list/list.go @@ -10,6 +10,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -20,7 +22,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network-interface/network-interface.go b/internal/cmd/network-interface/network-interface.go index d9cb6214d..3b9c2fb48 100644 --- a/internal/cmd/network-interface/network-interface.go +++ b/internal/cmd/network-interface/network-interface.go @@ -2,6 +2,7 @@ package networkinterface import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/create" "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/network-interface/describe" diff --git a/internal/cmd/network-interface/update/update.go b/internal/cmd/network-interface/update/update.go index eeae44774..e1b9b6e1e 100644 --- a/internal/cmd/network-interface/update/update.go +++ b/internal/cmd/network-interface/update/update.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/network/create/create.go b/internal/cmd/network/create/create.go index 0c1f8d75d..46e9e0e57 100644 --- a/internal/cmd/network/create/create.go +++ b/internal/cmd/network/create/create.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network/delete/delete.go b/internal/cmd/network/delete/delete.go index 998506a0a..3b3cc2177 100644 --- a/internal/cmd/network/delete/delete.go +++ b/internal/cmd/network/delete/delete.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network/describe/describe.go b/internal/cmd/network/describe/describe.go index 5a0a27969..4f2a20319 100644 --- a/internal/cmd/network/describe/describe.go +++ b/internal/cmd/network/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network/list/list.go b/internal/cmd/network/list/list.go index ba55e8869..6bc0a8b67 100644 --- a/internal/cmd/network/list/list.go +++ b/internal/cmd/network/list/list.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/network/update/update.go b/internal/cmd/network/update/update.go index b85b7e6ab..add37c6fa 100644 --- a/internal/cmd/network/update/update.go +++ b/internal/cmd/network/update/update.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/object-storage/bucket/list/list.go b/internal/cmd/object-storage/bucket/list/list.go index ebb3c70a0..352841fa6 100644 --- a/internal/cmd/object-storage/bucket/list/list.go +++ b/internal/cmd/object-storage/bucket/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( diff --git a/internal/cmd/object-storage/credentials-group/create/create.go b/internal/cmd/object-storage/credentials-group/create/create.go index 1b6651444..07623da46 100644 --- a/internal/cmd/object-storage/credentials-group/create/create.go +++ b/internal/cmd/object-storage/credentials-group/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( diff --git a/internal/cmd/object-storage/credentials-group/create/create_test.go b/internal/cmd/object-storage/credentials-group/create/create_test.go index 1b3fc9216..6068e5fc0 100644 --- a/internal/cmd/object-storage/credentials-group/create/create_test.go +++ b/internal/cmd/object-storage/credentials-group/create/create_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) type testCtxKey struct{} diff --git a/internal/cmd/object-storage/credentials-group/list/list.go b/internal/cmd/object-storage/credentials-group/list/list.go index 153a9b25f..6c777f0ca 100644 --- a/internal/cmd/object-storage/credentials-group/list/list.go +++ b/internal/cmd/object-storage/credentials-group/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( diff --git a/internal/cmd/object-storage/credentials/create/create.go b/internal/cmd/object-storage/credentials/create/create.go index 4f4861b8f..a9ce8fe47 100644 --- a/internal/cmd/object-storage/credentials/create/create.go +++ b/internal/cmd/object-storage/credentials/create/create.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( diff --git a/internal/cmd/object-storage/credentials/delete/delete.go b/internal/cmd/object-storage/credentials/delete/delete.go index 99307dca1..bc707923a 100644 --- a/internal/cmd/object-storage/credentials/delete/delete.go +++ b/internal/cmd/object-storage/credentials/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( diff --git a/internal/cmd/object-storage/credentials/list/list.go b/internal/cmd/object-storage/credentials/list/list.go index 73aa91dca..119de7c76 100644 --- a/internal/cmd/object-storage/credentials/list/list.go +++ b/internal/cmd/object-storage/credentials/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/client" objectStorageUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/object-storage/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" ) const ( diff --git a/internal/cmd/observability/credentials/create/create.go b/internal/cmd/observability/credentials/create/create.go index 12ff53649..6c2f8289f 100644 --- a/internal/cmd/observability/credentials/create/create.go +++ b/internal/cmd/observability/credentials/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/observability" ) const ( diff --git a/internal/cmd/observability/credentials/create/create_test.go b/internal/cmd/observability/credentials/create/create_test.go index c00d81989..0bd9c6ea6 100644 --- a/internal/cmd/observability/credentials/create/create_test.go +++ b/internal/cmd/observability/credentials/create/create_test.go @@ -6,10 +6,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable.go b/internal/cmd/observability/grafana/public-read-access/disable/disable.go index 70a3ff85b..0b6b3fcc5 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/spf13/cobra" ) diff --git a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go index 58fdfd098..89cbf05e9 100644 --- a/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/disable/disable_test.go @@ -12,8 +12,9 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" + + observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable.go b/internal/cmd/observability/grafana/public-read-access/enable/enable.go index 04f9eabf2..88f58227d 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable.go @@ -15,8 +15,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" + + observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) const ( diff --git a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go index 1f3d0fb89..e81ed3bc4 100644 --- a/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go +++ b/internal/cmd/observability/grafana/public-read-access/enable/enable_test.go @@ -12,8 +12,9 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" + + observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go index 57d7d7b8b..a2023c789 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable.go @@ -15,8 +15,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" + + observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) const ( diff --git a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go index 224c73cca..704b7a199 100644 --- a/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go +++ b/internal/cmd/observability/grafana/single-sign-on/disable/disable_test.go @@ -12,8 +12,9 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" + + observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/observability/instance/create/create.go b/internal/cmd/observability/instance/create/create.go index 769160b7b..72d53ebfe 100644 --- a/internal/cmd/observability/instance/create/create.go +++ b/internal/cmd/observability/instance/create/create.go @@ -19,9 +19,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" - observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/stackitcloud/stackit-sdk-go/services/observability/wait" + + observabilityUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/utils" ) const ( diff --git a/internal/cmd/observability/instance/list/list.go b/internal/cmd/observability/instance/list/list.go index 2d31e348c..8712e2fcd 100644 --- a/internal/cmd/observability/instance/list/list.go +++ b/internal/cmd/observability/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/observability" ) const ( diff --git a/internal/cmd/observability/scrape-config/describe/describe.go b/internal/cmd/observability/scrape-config/describe/describe.go index 91dc0d064..5dc11a619 100644 --- a/internal/cmd/observability/scrape-config/describe/describe.go +++ b/internal/cmd/observability/scrape-config/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/observability/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/observability" ) const ( diff --git a/internal/cmd/opensearch/credentials/create/create.go b/internal/cmd/opensearch/credentials/create/create.go index 06c5b87dd..cfc9bd5f3 100644 --- a/internal/cmd/opensearch/credentials/create/create.go +++ b/internal/cmd/opensearch/credentials/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/opensearch" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/opensearch/client" opensearchUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/opensearch/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) const ( diff --git a/internal/cmd/opensearch/credentials/create/create_test.go b/internal/cmd/opensearch/credentials/create/create_test.go index 0c768de74..b70f26ed2 100644 --- a/internal/cmd/opensearch/credentials/create/create_test.go +++ b/internal/cmd/opensearch/credentials/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/opensearch" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) type testCtxKey struct{} diff --git a/internal/cmd/opensearch/instance/list/list.go b/internal/cmd/opensearch/instance/list/list.go index 0dacbcf6d..48f7e986b 100644 --- a/internal/cmd/opensearch/instance/list/list.go +++ b/internal/cmd/opensearch/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/opensearch" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/opensearch/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) const ( diff --git a/internal/cmd/opensearch/plans/plans.go b/internal/cmd/opensearch/plans/plans.go index 3f644c000..f5705879e 100644 --- a/internal/cmd/opensearch/plans/plans.go +++ b/internal/cmd/opensearch/plans/plans.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/opensearch" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/opensearch/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/opensearch" ) const ( diff --git a/internal/cmd/organization/describe/describe.go b/internal/cmd/organization/describe/describe.go index d17179c8e..74ad1a2dc 100644 --- a/internal/cmd/organization/describe/describe.go +++ b/internal/cmd/organization/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) const ( diff --git a/internal/cmd/organization/list/list.go b/internal/cmd/organization/list/list.go index 07a85c10b..050d265f0 100644 --- a/internal/cmd/organization/list/list.go +++ b/internal/cmd/organization/list/list.go @@ -9,6 +9,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) const ( diff --git a/internal/cmd/organization/member/add/add.go b/internal/cmd/organization/member/add/add.go index db8754c5f..325669ae3 100644 --- a/internal/cmd/organization/member/add/add.go +++ b/internal/cmd/organization/member/add/add.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/authorization/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) const ( diff --git a/internal/cmd/organization/member/list/list.go b/internal/cmd/organization/member/list/list.go index 7e17796c6..fef787e39 100644 --- a/internal/cmd/organization/member/list/list.go +++ b/internal/cmd/organization/member/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/authorization/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) const ( diff --git a/internal/cmd/organization/role/list/list.go b/internal/cmd/organization/role/list/list.go index bb59b28c5..f9e7e4bf7 100644 --- a/internal/cmd/organization/role/list/list.go +++ b/internal/cmd/organization/role/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/authorization/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) const ( diff --git a/internal/cmd/postgresflex/backup/describe/describe.go b/internal/cmd/postgresflex/backup/describe/describe.go index 891b78888..ee3e3753e 100644 --- a/internal/cmd/postgresflex/backup/describe/describe.go +++ b/internal/cmd/postgresflex/backup/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/backup/describe/describe_test.go b/internal/cmd/postgresflex/backup/describe/describe_test.go index cd44d829e..4d9016ca5 100644 --- a/internal/cmd/postgresflex/backup/describe/describe_test.go +++ b/internal/cmd/postgresflex/backup/describe/describe_test.go @@ -10,10 +10,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/backup/list/list_test.go b/internal/cmd/postgresflex/backup/list/list_test.go index 39c9d8f53..3f6384ae8 100644 --- a/internal/cmd/postgresflex/backup/list/list_test.go +++ b/internal/cmd/postgresflex/backup/list/list_test.go @@ -12,10 +12,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go index 16bb967fe..447fe0864 100644 --- a/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go +++ b/internal/cmd/postgresflex/backup/update-schedule/update_schedule.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" postgresflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/instance/clone/clone_test.go b/internal/cmd/postgresflex/instance/clone/clone_test.go index 657670aa2..ebe60a424 100644 --- a/internal/cmd/postgresflex/instance/clone/clone_test.go +++ b/internal/cmd/postgresflex/instance/clone/clone_test.go @@ -11,11 +11,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/instance/create/create_test.go b/internal/cmd/postgresflex/instance/create/create_test.go index f3fa498c2..5e7f58cd8 100644 --- a/internal/cmd/postgresflex/instance/create/create_test.go +++ b/internal/cmd/postgresflex/instance/create/create_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/instance/describe/describe.go b/internal/cmd/postgresflex/instance/describe/describe.go index a50f3f167..c97762a76 100644 --- a/internal/cmd/postgresflex/instance/describe/describe.go +++ b/internal/cmd/postgresflex/instance/describe/describe.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( postgresflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "golang.org/x/text/cases" - "golang.org/x/text/language" "github.com/spf13/cobra" "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" diff --git a/internal/cmd/postgresflex/instance/describe/describe_test.go b/internal/cmd/postgresflex/instance/describe/describe_test.go index 80ce6c262..fef025e6e 100644 --- a/internal/cmd/postgresflex/instance/describe/describe_test.go +++ b/internal/cmd/postgresflex/instance/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/instance/list/list.go b/internal/cmd/postgresflex/instance/list/list.go index 2b20dc3e2..9f1b0f690 100644 --- a/internal/cmd/postgresflex/instance/list/list.go +++ b/internal/cmd/postgresflex/instance/list/list.go @@ -7,6 +7,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,9 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" - "golang.org/x/text/cases" - "golang.org/x/text/language" ) const ( diff --git a/internal/cmd/postgresflex/instance/list/list_test.go b/internal/cmd/postgresflex/instance/list/list_test.go index dfde2729a..0af825a2a 100644 --- a/internal/cmd/postgresflex/instance/list/list_test.go +++ b/internal/cmd/postgresflex/instance/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/instance/update/update_test.go b/internal/cmd/postgresflex/instance/update/update_test.go index 17cfb46c8..8a3a0e61e 100644 --- a/internal/cmd/postgresflex/instance/update/update_test.go +++ b/internal/cmd/postgresflex/instance/update/update_test.go @@ -10,10 +10,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/options/options.go b/internal/cmd/postgresflex/options/options.go index ad57495d3..e569b331e 100644 --- a/internal/cmd/postgresflex/options/options.go +++ b/internal/cmd/postgresflex/options/options.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/options/options_test.go b/internal/cmd/postgresflex/options/options_test.go index bd47b14ba..9d56b28ea 100644 --- a/internal/cmd/postgresflex/options/options_test.go +++ b/internal/cmd/postgresflex/options/options_test.go @@ -8,11 +8,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/user/create/create.go b/internal/cmd/postgresflex/user/create/create.go index fc53b1f07..97dc0c520 100644 --- a/internal/cmd/postgresflex/user/create/create.go +++ b/internal/cmd/postgresflex/user/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" postgresflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/user/create/create_test.go b/internal/cmd/postgresflex/user/create/create_test.go index 2ab611d42..cc630472c 100644 --- a/internal/cmd/postgresflex/user/create/create_test.go +++ b/internal/cmd/postgresflex/user/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/user/describe/describe.go b/internal/cmd/postgresflex/user/describe/describe.go index 01ab5fce1..4bf92198a 100644 --- a/internal/cmd/postgresflex/user/describe/describe.go +++ b/internal/cmd/postgresflex/user/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/user/describe/describe_test.go b/internal/cmd/postgresflex/user/describe/describe_test.go index 92b83cc99..214df4ff3 100644 --- a/internal/cmd/postgresflex/user/describe/describe_test.go +++ b/internal/cmd/postgresflex/user/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/user/list/list.go b/internal/cmd/postgresflex/user/list/list.go index a8dc23773..d0c9dbd36 100644 --- a/internal/cmd/postgresflex/user/list/list.go +++ b/internal/cmd/postgresflex/user/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( postgresflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/user/list/list_test.go b/internal/cmd/postgresflex/user/list/list_test.go index 2695296c7..d84fd6706 100644 --- a/internal/cmd/postgresflex/user/list/list_test.go +++ b/internal/cmd/postgresflex/user/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password.go b/internal/cmd/postgresflex/user/reset-password/reset_password.go index c899b5659..19e34dd2e 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/client" postgresflexUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/postgresflex/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) const ( diff --git a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go index 920c78b93..9b13c8b42 100644 --- a/internal/cmd/postgresflex/user/reset-password/reset_password_test.go +++ b/internal/cmd/postgresflex/user/reset-password/reset_password_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/postgresflex" ) type testCtxKey struct{} diff --git a/internal/cmd/project/create/create_test.go b/internal/cmd/project/create/create_test.go index 095469298..d96d3b475 100644 --- a/internal/cmd/project/create/create_test.go +++ b/internal/cmd/project/create/create_test.go @@ -9,13 +9,14 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + "github.com/zalando/go-keyring" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" - "github.com/zalando/go-keyring" ) type testCtxKey struct{} diff --git a/internal/cmd/project/describe/describe_test.go b/internal/cmd/project/describe/describe_test.go index b5f3ddcff..218f36671 100644 --- a/internal/cmd/project/describe/describe_test.go +++ b/internal/cmd/project/describe/describe_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/project/list/list.go b/internal/cmd/project/list/list.go index d4ef99b63..497aefb2e 100644 --- a/internal/cmd/project/list/list.go +++ b/internal/cmd/project/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" @@ -18,7 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/resourcemanager/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" ) const ( diff --git a/internal/cmd/project/list/list_test.go b/internal/cmd/project/list/list_test.go index 8050a0f27..7e26d6f8c 100644 --- a/internal/cmd/project/list/list_test.go +++ b/internal/cmd/project/list/list_test.go @@ -16,13 +16,14 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + "github.com/zalando/go-keyring" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" - "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" - "github.com/zalando/go-keyring" ) type testCtxKey struct{} diff --git a/internal/cmd/project/member/list/list.go b/internal/cmd/project/member/list/list.go index 66df41524..97b3003ef 100644 --- a/internal/cmd/project/member/list/list.go +++ b/internal/cmd/project/member/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/authorization/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) const ( diff --git a/internal/cmd/project/member/list/list_test.go b/internal/cmd/project/member/list/list_test.go index af050ba78..942a3096b 100644 --- a/internal/cmd/project/member/list/list_test.go +++ b/internal/cmd/project/member/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/project/role/list/list.go b/internal/cmd/project/role/list/list.go index 7be67dc6b..292cad0d2 100644 --- a/internal/cmd/project/role/list/list.go +++ b/internal/cmd/project/role/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/authorization/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) const ( diff --git a/internal/cmd/project/role/list/list_test.go b/internal/cmd/project/role/list/list_test.go index 3bc59db9a..0c70eed79 100644 --- a/internal/cmd/project/role/list/list_test.go +++ b/internal/cmd/project/role/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/authorization" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/authorization" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/public-ip/associate/associate.go b/internal/cmd/public-ip/associate/associate.go index 357a6c87f..9b86d2f61 100644 --- a/internal/cmd/public-ip/associate/associate.go +++ b/internal/cmd/public-ip/associate/associate.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/public-ip/associate/associate_test.go b/internal/cmd/public-ip/associate/associate_test.go index 8d40c1a6a..113ddc50c 100644 --- a/internal/cmd/public-ip/associate/associate_test.go +++ b/internal/cmd/public-ip/associate/associate_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/public-ip/create/create.go b/internal/cmd/public-ip/create/create.go index a13574190..9da469d1e 100644 --- a/internal/cmd/public-ip/create/create.go +++ b/internal/cmd/public-ip/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/public-ip/delete/delete.go b/internal/cmd/public-ip/delete/delete.go index 2bf9c234f..8663ab334 100644 --- a/internal/cmd/public-ip/delete/delete.go +++ b/internal/cmd/public-ip/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/public-ip/describe/describe.go b/internal/cmd/public-ip/describe/describe.go index fbcc2b15b..a4334b421 100644 --- a/internal/cmd/public-ip/describe/describe.go +++ b/internal/cmd/public-ip/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/public-ip/disassociate/disassociate.go b/internal/cmd/public-ip/disassociate/disassociate.go index 7df01b637..fae9afa0e 100644 --- a/internal/cmd/public-ip/disassociate/disassociate.go +++ b/internal/cmd/public-ip/disassociate/disassociate.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/public-ip/disassociate/disassociate_test.go b/internal/cmd/public-ip/disassociate/disassociate_test.go index 41c8d26e8..42bb505d6 100644 --- a/internal/cmd/public-ip/disassociate/disassociate_test.go +++ b/internal/cmd/public-ip/disassociate/disassociate_test.go @@ -11,8 +11,9 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" ) const ( diff --git a/internal/cmd/public-ip/list/list.go b/internal/cmd/public-ip/list/list.go index b2acfff92..1888e2d1d 100644 --- a/internal/cmd/public-ip/list/list.go +++ b/internal/cmd/public-ip/list/list.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/public-ip/ranges/list/list.go b/internal/cmd/public-ip/ranges/list/list.go index 918cb2041..cf01450cf 100644 --- a/internal/cmd/public-ip/ranges/list/list.go +++ b/internal/cmd/public-ip/ranges/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/public-ip/ranges/list/list_test.go b/internal/cmd/public-ip/ranges/list/list_test.go index 9a50dfeb1..1e0379a91 100644 --- a/internal/cmd/public-ip/ranges/list/list_test.go +++ b/internal/cmd/public-ip/ranges/list/list_test.go @@ -8,10 +8,11 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) func TestParseInput(t *testing.T) { diff --git a/internal/cmd/public-ip/update/update.go b/internal/cmd/public-ip/update/update.go index 8fb1d8a77..bdecb7dfc 100644 --- a/internal/cmd/public-ip/update/update.go +++ b/internal/cmd/public-ip/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/quota/list/list.go b/internal/cmd/quota/list/list.go index d16da37d0..ebb1ca353 100644 --- a/internal/cmd/quota/list/list.go +++ b/internal/cmd/quota/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/rabbitmq/credentials/create/create.go b/internal/cmd/rabbitmq/credentials/create/create.go index 3aeea6efe..8fcf54748 100644 --- a/internal/cmd/rabbitmq/credentials/create/create.go +++ b/internal/cmd/rabbitmq/credentials/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/rabbitmq/client" rabbitmqUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/rabbitmq/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) const ( diff --git a/internal/cmd/rabbitmq/credentials/create/create_test.go b/internal/cmd/rabbitmq/credentials/create/create_test.go index 3286d4931..186556aa4 100644 --- a/internal/cmd/rabbitmq/credentials/create/create_test.go +++ b/internal/cmd/rabbitmq/credentials/create/create_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/rabbitmq/credentials/describe/describe_test.go b/internal/cmd/rabbitmq/credentials/describe/describe_test.go index b92353fb9..5372405e2 100644 --- a/internal/cmd/rabbitmq/credentials/describe/describe_test.go +++ b/internal/cmd/rabbitmq/credentials/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/rabbitmq/credentials/list/list.go b/internal/cmd/rabbitmq/credentials/list/list.go index 218b4a97f..3c8b44a3c 100644 --- a/internal/cmd/rabbitmq/credentials/list/list.go +++ b/internal/cmd/rabbitmq/credentials/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( rabbitmqUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/rabbitmq/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) const ( diff --git a/internal/cmd/rabbitmq/credentials/list/list_test.go b/internal/cmd/rabbitmq/credentials/list/list_test.go index d2593b39b..8dda0a05d 100644 --- a/internal/cmd/rabbitmq/credentials/list/list_test.go +++ b/internal/cmd/rabbitmq/credentials/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/rabbitmq/instance/create/create_test.go b/internal/cmd/rabbitmq/instance/create/create_test.go index 8a267ca2a..726bcacb3 100644 --- a/internal/cmd/rabbitmq/instance/create/create_test.go +++ b/internal/cmd/rabbitmq/instance/create/create_test.go @@ -12,10 +12,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/rabbitmq/instance/describe/describe_test.go b/internal/cmd/rabbitmq/instance/describe/describe_test.go index c92834466..d48cb0a36 100644 --- a/internal/cmd/rabbitmq/instance/describe/describe_test.go +++ b/internal/cmd/rabbitmq/instance/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/rabbitmq/instance/list/list.go b/internal/cmd/rabbitmq/instance/list/list.go index 715f6fa45..70e47500e 100644 --- a/internal/cmd/rabbitmq/instance/list/list.go +++ b/internal/cmd/rabbitmq/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/rabbitmq/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) const ( diff --git a/internal/cmd/rabbitmq/instance/list/list_test.go b/internal/cmd/rabbitmq/instance/list/list_test.go index 18bfa1817..10e461d71 100644 --- a/internal/cmd/rabbitmq/instance/list/list_test.go +++ b/internal/cmd/rabbitmq/instance/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/rabbitmq/plans/plans_test.go b/internal/cmd/rabbitmq/plans/plans_test.go index f98191e88..e83a33072 100644 --- a/internal/cmd/rabbitmq/plans/plans_test.go +++ b/internal/cmd/rabbitmq/plans/plans_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/rabbitmq" ) type testCtxKey struct{} diff --git a/internal/cmd/redis/credentials/create/create_test.go b/internal/cmd/redis/credentials/create/create_test.go index 79d571121..ddb64fac1 100644 --- a/internal/cmd/redis/credentials/create/create_test.go +++ b/internal/cmd/redis/credentials/create/create_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/redis/credentials/describe/describe_test.go b/internal/cmd/redis/credentials/describe/describe_test.go index 7ee94e50c..0697f37c8 100644 --- a/internal/cmd/redis/credentials/describe/describe_test.go +++ b/internal/cmd/redis/credentials/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/redis/credentials/list/list.go b/internal/cmd/redis/credentials/list/list.go index 332ef35e0..536ef13c7 100644 --- a/internal/cmd/redis/credentials/list/list.go +++ b/internal/cmd/redis/credentials/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( redisUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/redis/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) const ( diff --git a/internal/cmd/redis/credentials/list/list_test.go b/internal/cmd/redis/credentials/list/list_test.go index fdf207e55..ee8b74679 100644 --- a/internal/cmd/redis/credentials/list/list_test.go +++ b/internal/cmd/redis/credentials/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/redis/instance/create/create_test.go b/internal/cmd/redis/instance/create/create_test.go index cc6baaeed..c133ec83e 100644 --- a/internal/cmd/redis/instance/create/create_test.go +++ b/internal/cmd/redis/instance/create/create_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/redis/instance/describe/describe_test.go b/internal/cmd/redis/instance/describe/describe_test.go index 16a99ab65..2a1cb3acc 100644 --- a/internal/cmd/redis/instance/describe/describe_test.go +++ b/internal/cmd/redis/instance/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/redis/instance/list/list.go b/internal/cmd/redis/instance/list/list.go index 2051f471e..b0d207907 100644 --- a/internal/cmd/redis/instance/list/list.go +++ b/internal/cmd/redis/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/redis/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) const ( diff --git a/internal/cmd/redis/instance/list/list_test.go b/internal/cmd/redis/instance/list/list_test.go index 81053ecdd..15250c774 100644 --- a/internal/cmd/redis/instance/list/list_test.go +++ b/internal/cmd/redis/instance/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/redis/plans/plans.go b/internal/cmd/redis/plans/plans.go index f7ecfe5cf..923006376 100644 --- a/internal/cmd/redis/plans/plans.go +++ b/internal/cmd/redis/plans/plans.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/redis/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) const ( diff --git a/internal/cmd/redis/plans/plans_test.go b/internal/cmd/redis/plans/plans_test.go index a18048cd6..a85d010dc 100644 --- a/internal/cmd/redis/plans/plans_test.go +++ b/internal/cmd/redis/plans/plans_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/redis" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/redis" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/root_test.go b/internal/cmd/root_test.go index 71861a46f..1becca94e 100644 --- a/internal/cmd/root_test.go +++ b/internal/cmd/root_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/spf13/cobra" + pkgErrors "github.com/stackitcloud/stackit-cli/internal/pkg/errors" ) diff --git a/internal/cmd/secrets-manager/instance/create/create.go b/internal/cmd/secrets-manager/instance/create/create.go index 12e9b2099..83662cf44 100644 --- a/internal/cmd/secrets-manager/instance/create/create.go +++ b/internal/cmd/secrets-manager/instance/create/create.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" "github.com/spf13/cobra" ) diff --git a/internal/cmd/secrets-manager/instance/create/create_test.go b/internal/cmd/secrets-manager/instance/create/create_test.go index e4c6cedda..437da9492 100644 --- a/internal/cmd/secrets-manager/instance/create/create_test.go +++ b/internal/cmd/secrets-manager/instance/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/secrets-manager/instance/delete/delete.go b/internal/cmd/secrets-manager/instance/delete/delete.go index 94ed3385a..c4c2d1602 100644 --- a/internal/cmd/secrets-manager/instance/delete/delete.go +++ b/internal/cmd/secrets-manager/instance/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/client" secretsmanagerUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) const ( diff --git a/internal/cmd/secrets-manager/instance/list/list.go b/internal/cmd/secrets-manager/instance/list/list.go index e32f99ed0..a8f7b9391 100644 --- a/internal/cmd/secrets-manager/instance/list/list.go +++ b/internal/cmd/secrets-manager/instance/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) const ( diff --git a/internal/cmd/secrets-manager/user/list/list.go b/internal/cmd/secrets-manager/user/list/list.go index 9b601d47a..163c523c9 100644 --- a/internal/cmd/secrets-manager/user/list/list.go +++ b/internal/cmd/secrets-manager/user/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( secretsManagerUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/secrets-manager/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" ) const ( diff --git a/internal/cmd/secrets-manager/user/user.go b/internal/cmd/secrets-manager/user/user.go index 738426858..6f14e07dd 100644 --- a/internal/cmd/secrets-manager/user/user.go +++ b/internal/cmd/secrets-manager/user/user.go @@ -6,6 +6,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/create" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/secrets-manager/user/describe" diff --git a/internal/cmd/security-group/create/create.go b/internal/cmd/security-group/create/create.go index 5c52d133a..dfbbc258c 100644 --- a/internal/cmd/security-group/create/create.go +++ b/internal/cmd/security-group/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/create/create_test.go b/internal/cmd/security-group/create/create_test.go index b025e7419..0a082ee15 100644 --- a/internal/cmd/security-group/create/create_test.go +++ b/internal/cmd/security-group/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/delete/delete.go b/internal/cmd/security-group/delete/delete.go index 1950d712b..da840337c 100644 --- a/internal/cmd/security-group/delete/delete.go +++ b/internal/cmd/security-group/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/security-group/describe/describe_test.go b/internal/cmd/security-group/describe/describe_test.go index 9342e946e..84c928b0e 100644 --- a/internal/cmd/security-group/describe/describe_test.go +++ b/internal/cmd/security-group/describe/describe_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/list/list.go b/internal/cmd/security-group/list/list.go index a368152a6..d3788ee9c 100644 --- a/internal/cmd/security-group/list/list.go +++ b/internal/cmd/security-group/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/security-group/list/list_test.go b/internal/cmd/security-group/list/list_test.go index 22c588604..18cfa967e 100644 --- a/internal/cmd/security-group/list/list_test.go +++ b/internal/cmd/security-group/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/rule/create/create.go b/internal/cmd/security-group/rule/create/create.go index b2f443ace..9b836dd81 100644 --- a/internal/cmd/security-group/rule/create/create.go +++ b/internal/cmd/security-group/rule/create/create.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/security-group/rule/create/create_test.go b/internal/cmd/security-group/rule/create/create_test.go index 5099c7ca3..02a29fe95 100644 --- a/internal/cmd/security-group/rule/create/create_test.go +++ b/internal/cmd/security-group/rule/create/create_test.go @@ -11,10 +11,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/rule/delete/delete.go b/internal/cmd/security-group/rule/delete/delete.go index 388e3b0b7..837a94b9c 100644 --- a/internal/cmd/security-group/rule/delete/delete.go +++ b/internal/cmd/security-group/rule/delete/delete.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/rule/delete/delete_test.go b/internal/cmd/security-group/rule/delete/delete_test.go index 0d6a9b4cb..73ae4e466 100644 --- a/internal/cmd/security-group/rule/delete/delete_test.go +++ b/internal/cmd/security-group/rule/delete/delete_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/rule/describe/describe.go b/internal/cmd/security-group/rule/describe/describe.go index 82486d989..c4e421fa6 100644 --- a/internal/cmd/security-group/rule/describe/describe.go +++ b/internal/cmd/security-group/rule/describe/describe.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/security-group/rule/describe/describe_test.go b/internal/cmd/security-group/rule/describe/describe_test.go index f1af54485..924b0dced 100644 --- a/internal/cmd/security-group/rule/describe/describe_test.go +++ b/internal/cmd/security-group/rule/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/rule/list/list_test.go b/internal/cmd/security-group/rule/list/list_test.go index 166b58e58..b617a1b80 100644 --- a/internal/cmd/security-group/rule/list/list_test.go +++ b/internal/cmd/security-group/rule/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/security-group/update/update.go b/internal/cmd/security-group/update/update.go index 6f612f744..d73590631 100644 --- a/internal/cmd/security-group/update/update.go +++ b/internal/cmd/security-group/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type inputModel struct { diff --git a/internal/cmd/server/backup/list/list.go b/internal/cmd/server/backup/list/list.go index 7f60f6a70..86e2ac155 100644 --- a/internal/cmd/server/backup/list/list.go +++ b/internal/cmd/server/backup/list/list.go @@ -9,6 +9,8 @@ import ( iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) const ( diff --git a/internal/cmd/server/backup/schedule/describe/describe_test.go b/internal/cmd/server/backup/schedule/describe/describe_test.go index e5808e545..7ce57f910 100644 --- a/internal/cmd/server/backup/schedule/describe/describe_test.go +++ b/internal/cmd/server/backup/schedule/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) type testCtxKey struct{} diff --git a/internal/cmd/server/backup/schedule/list/list.go b/internal/cmd/server/backup/schedule/list/list.go index 58f8f7ac9..7c573fcc9 100644 --- a/internal/cmd/server/backup/schedule/list/list.go +++ b/internal/cmd/server/backup/schedule/list/list.go @@ -9,6 +9,8 @@ import ( iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverbackup/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serverbackup" ) const ( diff --git a/internal/cmd/server/command/create/create.go b/internal/cmd/server/command/create/create.go index 6ac6fed6d..9259e3046 100644 --- a/internal/cmd/server/command/create/create.go +++ b/internal/cmd/server/command/create/create.go @@ -9,6 +9,8 @@ import ( iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/runcommand" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" runcommandUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) const ( diff --git a/internal/cmd/server/command/describe/describe.go b/internal/cmd/server/command/describe/describe.go index 8ca9b6aa3..520ead530 100644 --- a/internal/cmd/server/command/describe/describe.go +++ b/internal/cmd/server/command/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/runcommand" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) const ( diff --git a/internal/cmd/server/command/list/list.go b/internal/cmd/server/command/list/list.go index e5607abd0..21a96bae1 100644 --- a/internal/cmd/server/command/list/list.go +++ b/internal/cmd/server/command/list/list.go @@ -9,6 +9,8 @@ import ( iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/runcommand" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) const ( diff --git a/internal/cmd/server/command/template/describe/describe.go b/internal/cmd/server/command/template/describe/describe.go index 99c6f4941..486e5c6ac 100644 --- a/internal/cmd/server/command/template/describe/describe.go +++ b/internal/cmd/server/command/template/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/runcommand" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) const ( diff --git a/internal/cmd/server/command/template/list/list.go b/internal/cmd/server/command/template/list/list.go index 723772b45..90ce846ca 100644 --- a/internal/cmd/server/command/template/list/list.go +++ b/internal/cmd/server/command/template/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/runcommand" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/runcommand/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/runcommand" ) const ( diff --git a/internal/cmd/server/console/console.go b/internal/cmd/server/console/console.go index 23e7f5c10..48e061615 100644 --- a/internal/cmd/server/console/console.go +++ b/internal/cmd/server/console/console.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/create/create.go b/internal/cmd/server/create/create.go index c4f0450d9..1efaac4f4 100644 --- a/internal/cmd/server/create/create.go +++ b/internal/cmd/server/create/create.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/deallocate/deallocate.go b/internal/cmd/server/deallocate/deallocate.go index f10fb670b..41886042d 100644 --- a/internal/cmd/server/deallocate/deallocate.go +++ b/internal/cmd/server/deallocate/deallocate.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/delete/delete.go b/internal/cmd/server/delete/delete.go index d24acf388..cbedd5a29 100644 --- a/internal/cmd/server/delete/delete.go +++ b/internal/cmd/server/delete/delete.go @@ -4,10 +4,13 @@ import ( "context" "fmt" - "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +20,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/log/log.go b/internal/cmd/server/log/log.go index a211a44c1..086e228b4 100644 --- a/internal/cmd/server/log/log.go +++ b/internal/cmd/server/log/log.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/machine-type/describe/describe.go b/internal/cmd/server/machine-type/describe/describe.go index d496d5a83..4bd07771e 100644 --- a/internal/cmd/server/machine-type/describe/describe.go +++ b/internal/cmd/server/machine-type/describe/describe.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/network-interface/attach/attach.go b/internal/cmd/server/network-interface/attach/attach.go index 5bcf7ed6d..9d1da9752 100644 --- a/internal/cmd/server/network-interface/attach/attach.go +++ b/internal/cmd/server/network-interface/attach/attach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/network-interface/detach/detach.go b/internal/cmd/server/network-interface/detach/detach.go index ed891e912..41e9cf194 100644 --- a/internal/cmd/server/network-interface/detach/detach.go +++ b/internal/cmd/server/network-interface/detach/detach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/network-interface/list/list.go b/internal/cmd/server/network-interface/list/list.go index 607798a89..c154f89b3 100644 --- a/internal/cmd/server/network-interface/list/list.go +++ b/internal/cmd/server/network-interface/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/os-update/describe/describe.go b/internal/cmd/server/os-update/describe/describe.go index 026cec137..8d349791b 100644 --- a/internal/cmd/server/os-update/describe/describe.go +++ b/internal/cmd/server/os-update/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) const ( diff --git a/internal/cmd/server/os-update/schedule/describe/describe.go b/internal/cmd/server/os-update/schedule/describe/describe.go index 4e68b04bd..0e810343d 100644 --- a/internal/cmd/server/os-update/schedule/describe/describe.go +++ b/internal/cmd/server/os-update/schedule/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) const ( diff --git a/internal/cmd/server/os-update/schedule/list/list.go b/internal/cmd/server/os-update/schedule/list/list.go index 0e300e547..c2d6153f6 100644 --- a/internal/cmd/server/os-update/schedule/list/list.go +++ b/internal/cmd/server/os-update/schedule/list/list.go @@ -9,6 +9,8 @@ import ( iaasClient "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -19,7 +21,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) const ( diff --git a/internal/cmd/server/os-update/schedule/update/update.go b/internal/cmd/server/os-update/schedule/update/update.go index 72c3f92f4..f14429e2c 100644 --- a/internal/cmd/server/os-update/schedule/update/update.go +++ b/internal/cmd/server/os-update/schedule/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/serverosupdate/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serverupdate" ) const ( diff --git a/internal/cmd/server/public-ip/attach/attach.go b/internal/cmd/server/public-ip/attach/attach.go index 7532eac13..af300bb19 100644 --- a/internal/cmd/server/public-ip/attach/attach.go +++ b/internal/cmd/server/public-ip/attach/attach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/public-ip/attach/attach_test.go b/internal/cmd/server/public-ip/attach/attach_test.go index 4aef71f1f..11e894f33 100644 --- a/internal/cmd/server/public-ip/attach/attach_test.go +++ b/internal/cmd/server/public-ip/attach/attach_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/public-ip/detach/detach.go b/internal/cmd/server/public-ip/detach/detach.go index 8c85195e9..4e53bdf0c 100644 --- a/internal/cmd/server/public-ip/detach/detach.go +++ b/internal/cmd/server/public-ip/detach/detach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/reboot/reboot.go b/internal/cmd/server/reboot/reboot.go index bf689cfcc..fcc57bc08 100644 --- a/internal/cmd/server/reboot/reboot.go +++ b/internal/cmd/server/reboot/reboot.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/rescue/rescue.go b/internal/cmd/server/rescue/rescue.go index ee5d9b68c..9dbd1aa73 100644 --- a/internal/cmd/server/rescue/rescue.go +++ b/internal/cmd/server/rescue/rescue.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/resize/resize.go b/internal/cmd/server/resize/resize.go index 34eb1bddb..582341781 100644 --- a/internal/cmd/server/resize/resize.go +++ b/internal/cmd/server/resize/resize.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/security-group/attach/attach.go b/internal/cmd/server/security-group/attach/attach.go index a5942bce9..f6324237c 100644 --- a/internal/cmd/server/security-group/attach/attach.go +++ b/internal/cmd/server/security-group/attach/attach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/security-group/attach/attach_test.go b/internal/cmd/server/security-group/attach/attach_test.go index 74261c56b..9056e3f8e 100644 --- a/internal/cmd/server/security-group/attach/attach_test.go +++ b/internal/cmd/server/security-group/attach/attach_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/security-group/detach/detach.go b/internal/cmd/server/security-group/detach/detach.go index ef8217385..81fe5b30a 100644 --- a/internal/cmd/server/security-group/detach/detach.go +++ b/internal/cmd/server/security-group/detach/detach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/security-group/detach/detach_test.go b/internal/cmd/server/security-group/detach/detach_test.go index 3860bc1ac..dbf4cc8f3 100644 --- a/internal/cmd/server/security-group/detach/detach_test.go +++ b/internal/cmd/server/security-group/detach/detach_test.go @@ -7,9 +7,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/service-account/attach/attach_test.go b/internal/cmd/server/service-account/attach/attach_test.go index b34109960..c4bcdaeaa 100644 --- a/internal/cmd/server/service-account/attach/attach_test.go +++ b/internal/cmd/server/service-account/attach/attach_test.go @@ -6,9 +6,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/server/service-account/detach/detach_test.go b/internal/cmd/server/service-account/detach/detach_test.go index 0867408f1..f421c504d 100644 --- a/internal/cmd/server/service-account/detach/detach_test.go +++ b/internal/cmd/server/service-account/detach/detach_test.go @@ -6,9 +6,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/server/service-account/service-account.go b/internal/cmd/server/service-account/service-account.go index 6bb4576ba..1f61348a4 100644 --- a/internal/cmd/server/service-account/service-account.go +++ b/internal/cmd/server/service-account/service-account.go @@ -2,6 +2,7 @@ package serviceaccount import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/stackitcloud/stackit-cli/internal/cmd/server/service-account/attach" diff --git a/internal/cmd/server/start/start.go b/internal/cmd/server/start/start.go index 9d0c3e056..69ea27c96 100644 --- a/internal/cmd/server/start/start.go +++ b/internal/cmd/server/start/start.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/stop/stop.go b/internal/cmd/server/stop/stop.go index 936d2ae6c..3b74699c5 100644 --- a/internal/cmd/server/stop/stop.go +++ b/internal/cmd/server/stop/stop.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/unrescue/unrescue.go b/internal/cmd/server/unrescue/unrescue.go index 16f9d5351..0dbc71319 100644 --- a/internal/cmd/server/unrescue/unrescue.go +++ b/internal/cmd/server/unrescue/unrescue.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/server/update/update.go b/internal/cmd/server/update/update.go index 7349d1c28..570c45019 100644 --- a/internal/cmd/server/update/update.go +++ b/internal/cmd/server/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/attach/attach.go b/internal/cmd/server/volume/attach/attach.go index 27c734f8d..a1b1695a7 100644 --- a/internal/cmd/server/volume/attach/attach.go +++ b/internal/cmd/server/volume/attach/attach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/describe/describe.go b/internal/cmd/server/volume/describe/describe.go index 385b585bf..bd1328de8 100644 --- a/internal/cmd/server/volume/describe/describe.go +++ b/internal/cmd/server/volume/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/describe/describe_test.go b/internal/cmd/server/volume/describe/describe_test.go index 2e88ae1c4..3a0a631d9 100644 --- a/internal/cmd/server/volume/describe/describe_test.go +++ b/internal/cmd/server/volume/describe/describe_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/detach/detach.go b/internal/cmd/server/volume/detach/detach.go index 0c8081a5d..4e46187ee 100644 --- a/internal/cmd/server/volume/detach/detach.go +++ b/internal/cmd/server/volume/detach/detach.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/detach/detach_test.go b/internal/cmd/server/volume/detach/detach_test.go index a9b5843b1..59d93a547 100644 --- a/internal/cmd/server/volume/detach/detach_test.go +++ b/internal/cmd/server/volume/detach/detach_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/list/list.go b/internal/cmd/server/volume/list/list.go index 10df56261..995303bd7 100644 --- a/internal/cmd/server/volume/list/list.go +++ b/internal/cmd/server/volume/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/list/list_test.go b/internal/cmd/server/volume/list/list_test.go index ea65dc2cb..c8c7339ab 100644 --- a/internal/cmd/server/volume/list/list_test.go +++ b/internal/cmd/server/volume/list/list_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/server/volume/update/update.go b/internal/cmd/server/volume/update/update.go index 4ba1a9342..389ad26a6 100644 --- a/internal/cmd/server/volume/update/update.go +++ b/internal/cmd/server/volume/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/service-account/key/list/list.go b/internal/cmd/service-account/key/list/list.go index e450ef021..2cb1d3288 100644 --- a/internal/cmd/service-account/key/list/list.go +++ b/internal/cmd/service-account/key/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-account/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) const ( diff --git a/internal/cmd/service-account/list/list.go b/internal/cmd/service-account/list/list.go index f444e83b3..692ea90c8 100644 --- a/internal/cmd/service-account/list/list.go +++ b/internal/cmd/service-account/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-account/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) const ( diff --git a/internal/cmd/service-account/token/create/create.go b/internal/cmd/service-account/token/create/create.go index a3286219b..c5e8f9a18 100644 --- a/internal/cmd/service-account/token/create/create.go +++ b/internal/cmd/service-account/token/create/create.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-account/client" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serviceaccount" ) const ( diff --git a/internal/cmd/ske/cluster/create/create.go b/internal/cmd/ske/cluster/create/create.go index 38263ec9e..eafcdc349 100644 --- a/internal/cmd/ske/cluster/create/create.go +++ b/internal/cmd/ske/cluster/create/create.go @@ -8,6 +8,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -21,8 +24,6 @@ import ( skeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( diff --git a/internal/cmd/ske/cluster/describe/describe.go b/internal/cmd/ske/cluster/describe/describe.go index 6c9316bd3..bde8763f7 100644 --- a/internal/cmd/ske/cluster/describe/describe.go +++ b/internal/cmd/ske/cluster/describe/describe.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( diff --git a/internal/cmd/ske/cluster/hibernate/hibernate.go b/internal/cmd/ske/cluster/hibernate/hibernate.go index a409c4890..b2a345175 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( diff --git a/internal/cmd/ske/cluster/hibernate/hibernate_test.go b/internal/cmd/ske/cluster/hibernate/hibernate_test.go index dfdeb5c10..0e532170f 100644 --- a/internal/cmd/ske/cluster/hibernate/hibernate_test.go +++ b/internal/cmd/ske/cluster/hibernate/hibernate_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} diff --git a/internal/cmd/ske/cluster/maintenance/maintenance.go b/internal/cmd/ske/cluster/maintenance/maintenance.go index 444e22117..fbf0f16f4 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( diff --git a/internal/cmd/ske/cluster/maintenance/maintenance_test.go b/internal/cmd/ske/cluster/maintenance/maintenance_test.go index b174d4c1d..5d374d75d 100644 --- a/internal/cmd/ske/cluster/maintenance/maintenance_test.go +++ b/internal/cmd/ske/cluster/maintenance/maintenance_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} diff --git a/internal/cmd/ske/cluster/reconcile/reconcile.go b/internal/cmd/ske/cluster/reconcile/reconcile.go index 00bc11a9e..8e499c418 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,8 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( diff --git a/internal/cmd/ske/cluster/reconcile/reconcile_test.go b/internal/cmd/ske/cluster/reconcile/reconcile_test.go index 500c408e5..ce5e15bc9 100644 --- a/internal/cmd/ske/cluster/reconcile/reconcile_test.go +++ b/internal/cmd/ske/cluster/reconcile/reconcile_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} diff --git a/internal/cmd/ske/cluster/wakeup/wakeup.go b/internal/cmd/ske/cluster/wakeup/wakeup.go index b53077ef3..2ed99d8ad 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup.go @@ -7,6 +7,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -14,8 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" - wait "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api/wait" ) const ( diff --git a/internal/cmd/ske/cluster/wakeup/wakeup_test.go b/internal/cmd/ske/cluster/wakeup/wakeup_test.go index 0caf850d0..a729af751 100644 --- a/internal/cmd/ske/cluster/wakeup/wakeup_test.go +++ b/internal/cmd/ske/cluster/wakeup/wakeup_test.go @@ -9,9 +9,10 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type testCtxKey struct{} diff --git a/internal/cmd/ske/describe/describe.go b/internal/cmd/ske/describe/describe.go index 414525335..07fedda34 100644 --- a/internal/cmd/ske/describe/describe.go +++ b/internal/cmd/ske/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( skeUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" ) type inputModel struct { diff --git a/internal/cmd/ske/describe/describe_test.go b/internal/cmd/ske/describe/describe_test.go index 53dd3afc8..0af19c957 100644 --- a/internal/cmd/ske/describe/describe_test.go +++ b/internal/cmd/ske/describe/describe_test.go @@ -6,11 +6,12 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" serviceEnablementUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/service-enablement/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/serviceenablement" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" diff --git a/internal/cmd/ske/kubeconfig/create/create.go b/internal/cmd/ske/kubeconfig/create/create.go index b417e0bbc..96093f901 100644 --- a/internal/cmd/ske/kubeconfig/create/create.go +++ b/internal/cmd/ske/kubeconfig/create/create.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/goccy/go-yaml" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/ske/kubeconfig/create/create_test.go b/internal/cmd/ske/kubeconfig/create/create_test.go index 3c3f2cae7..a7772f6c8 100644 --- a/internal/cmd/ske/kubeconfig/create/create_test.go +++ b/internal/cmd/ske/kubeconfig/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) var projectIdFlag = globalflags.ProjectIdFlag diff --git a/internal/cmd/ske/kubeconfig/login/login.go b/internal/cmd/ske/kubeconfig/login/login.go index 2d2c88070..268831202 100644 --- a/internal/cmd/ske/kubeconfig/login/login.go +++ b/internal/cmd/ske/kubeconfig/login/login.go @@ -21,6 +21,8 @@ import ( "k8s.io/client-go/tools/auth/exec" "k8s.io/client-go/tools/clientcmd" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/cache" @@ -31,7 +33,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/types" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( diff --git a/internal/cmd/ske/kubeconfig/login/login_test.go b/internal/cmd/ske/kubeconfig/login/login_test.go index cf9c3a756..683171b95 100644 --- a/internal/cmd/ske/kubeconfig/login/login_test.go +++ b/internal/cmd/ske/kubeconfig/login/login_test.go @@ -10,11 +10,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" clientauthenticationv1 "k8s.io/client-go/pkg/apis/clientauthentication/v1" "k8s.io/client-go/rest" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) type testCtxKey struct{} diff --git a/internal/cmd/ske/options/availability_zones/availability_zones.go b/internal/cmd/ske/options/availability_zones/availability_zones.go index 0b50574b2..272da1eeb 100644 --- a/internal/cmd/ske/options/availability_zones/availability_zones.go +++ b/internal/cmd/ske/options/availability_zones/availability_zones.go @@ -8,13 +8,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { diff --git a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go index afe03bd2e..65b21b4b8 100644 --- a/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go +++ b/internal/cmd/ske/options/kubernetes_versions/kubernetes_versions.go @@ -11,13 +11,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( diff --git a/internal/cmd/ske/options/machine_images/machine_images.go b/internal/cmd/ske/options/machine_images/machine_images.go index 4c7c9523a..94110cf6f 100644 --- a/internal/cmd/ske/options/machine_images/machine_images.go +++ b/internal/cmd/ske/options/machine_images/machine_images.go @@ -9,6 +9,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { diff --git a/internal/cmd/ske/options/machine_types/machine_types.go b/internal/cmd/ske/options/machine_types/machine_types.go index 5d66cade5..7fce1c279 100644 --- a/internal/cmd/ske/options/machine_types/machine_types.go +++ b/internal/cmd/ske/options/machine_types/machine_types.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -14,7 +16,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { diff --git a/internal/cmd/ske/options/options.go b/internal/cmd/ske/options/options.go index 58d7db759..8eb90ae9c 100644 --- a/internal/cmd/ske/options/options.go +++ b/internal/cmd/ske/options/options.go @@ -15,6 +15,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" @@ -22,7 +24,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) const ( diff --git a/internal/cmd/ske/options/volume_types/volume_types.go b/internal/cmd/ske/options/volume_types/volume_types.go index 35aa8dbb9..1b4943ae4 100644 --- a/internal/cmd/ske/options/volume_types/volume_types.go +++ b/internal/cmd/ske/options/volume_types/volume_types.go @@ -8,13 +8,14 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/spf13/cobra" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/services/ske/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" - ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" ) type inputModel struct { diff --git a/internal/cmd/volume/backup/delete/delete.go b/internal/cmd/volume/backup/delete/delete.go index e5b113075..fdb2fe458 100644 --- a/internal/cmd/volume/backup/delete/delete.go +++ b/internal/cmd/volume/backup/delete/delete.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,9 +17,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + + iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" ) const ( diff --git a/internal/cmd/volume/backup/describe/describe.go b/internal/cmd/volume/backup/describe/describe.go index c8c1b66d1..78cc4790e 100644 --- a/internal/cmd/volume/backup/describe/describe.go +++ b/internal/cmd/volume/backup/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/volume/backup/list/list.go b/internal/cmd/volume/backup/list/list.go index c434b3df5..9da088d13 100644 --- a/internal/cmd/volume/backup/list/list.go +++ b/internal/cmd/volume/backup/list/list.go @@ -8,6 +8,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,7 +20,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/backup/restore/restore.go b/internal/cmd/volume/backup/restore/restore.go index ebcb5f917..d98478dee 100644 --- a/internal/cmd/volume/backup/restore/restore.go +++ b/internal/cmd/volume/backup/restore/restore.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,9 +17,10 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + + iaasutils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" ) const ( diff --git a/internal/cmd/volume/backup/update/update.go b/internal/cmd/volume/backup/update/update.go index 9141f9a2b..4a61e582a 100644 --- a/internal/cmd/volume/backup/update/update.go +++ b/internal/cmd/volume/backup/update/update.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/volume/create/create.go b/internal/cmd/volume/create/create.go index 5b7a21ffd..f0c672602 100644 --- a/internal/cmd/volume/create/create.go +++ b/internal/cmd/volume/create/create.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,8 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/volume/create/create_test.go b/internal/cmd/volume/create/create_test.go index 9628fd508..ad088cdb8 100644 --- a/internal/cmd/volume/create/create_test.go +++ b/internal/cmd/volume/create/create_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/delete/delete.go b/internal/cmd/volume/delete/delete.go index abf99a53f..11984713b 100644 --- a/internal/cmd/volume/delete/delete.go +++ b/internal/cmd/volume/delete/delete.go @@ -6,6 +6,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,8 +18,6 @@ import ( iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/spinner" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" - "github.com/stackitcloud/stackit-sdk-go/services/iaas/wait" "github.com/spf13/cobra" ) diff --git a/internal/cmd/volume/describe/describe.go b/internal/cmd/volume/describe/describe.go index 8ff8dbfab..e8c009a65 100644 --- a/internal/cmd/volume/describe/describe.go +++ b/internal/cmd/volume/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/volume/describe/describe_test.go b/internal/cmd/volume/describe/describe_test.go index eb595b37e..6aa31f41e 100644 --- a/internal/cmd/volume/describe/describe_test.go +++ b/internal/cmd/volume/describe/describe_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/list/list.go b/internal/cmd/volume/list/list.go index 5d82bad1a..fa4b2c1f0 100644 --- a/internal/cmd/volume/list/list.go +++ b/internal/cmd/volume/list/list.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -17,7 +19,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/list/list_test.go b/internal/cmd/volume/list/list_test.go index d81ee310f..924acee29 100644 --- a/internal/cmd/volume/list/list_test.go +++ b/internal/cmd/volume/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/performance-class/describe/describe.go b/internal/cmd/volume/performance-class/describe/describe.go index 23c763e84..c75a3cb50 100644 --- a/internal/cmd/volume/performance-class/describe/describe.go +++ b/internal/cmd/volume/performance-class/describe/describe.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/volume/performance-class/describe/describe_test.go b/internal/cmd/volume/performance-class/describe/describe_test.go index d24d96eaf..aafac6197 100644 --- a/internal/cmd/volume/performance-class/describe/describe_test.go +++ b/internal/cmd/volume/performance-class/describe/describe_test.go @@ -11,9 +11,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/performance-class/list/list.go b/internal/cmd/volume/performance-class/list/list.go index 7062011aa..ae62dd65d 100644 --- a/internal/cmd/volume/performance-class/list/list.go +++ b/internal/cmd/volume/performance-class/list/list.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/volume/performance-class/list/list_test.go b/internal/cmd/volume/performance-class/list/list_test.go index 53004a31b..79a1b29c8 100644 --- a/internal/cmd/volume/performance-class/list/list_test.go +++ b/internal/cmd/volume/performance-class/list/list_test.go @@ -9,11 +9,12 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/resize/resize.go b/internal/cmd/volume/resize/resize.go index 0bfbc0797..1207eee46 100644 --- a/internal/cmd/volume/resize/resize.go +++ b/internal/cmd/volume/resize/resize.go @@ -6,6 +6,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -15,7 +17,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/cobra" ) diff --git a/internal/cmd/volume/snapshot/create/create.go b/internal/cmd/volume/snapshot/create/create.go index da209bf7b..836794612 100644 --- a/internal/cmd/volume/snapshot/create/create.go +++ b/internal/cmd/volume/snapshot/create/create.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/volume/snapshot/create/create_test.go b/internal/cmd/volume/snapshot/create/create_test.go index d2ee79608..7dbc2681f 100644 --- a/internal/cmd/volume/snapshot/create/create_test.go +++ b/internal/cmd/volume/snapshot/create/create_test.go @@ -7,10 +7,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) type testCtxKey struct{} diff --git a/internal/cmd/volume/snapshot/delete/delete.go b/internal/cmd/volume/snapshot/delete/delete.go index fca923a29..9a60e5a13 100644 --- a/internal/cmd/volume/snapshot/delete/delete.go +++ b/internal/cmd/volume/snapshot/delete/delete.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/volume/snapshot/describe/describe.go b/internal/cmd/volume/snapshot/describe/describe.go index c87336496..85e9e0fe2 100644 --- a/internal/cmd/volume/snapshot/describe/describe.go +++ b/internal/cmd/volume/snapshot/describe/describe.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/volume/snapshot/list/list.go b/internal/cmd/volume/snapshot/list/list.go index 70b97edf2..a2d312b26 100644 --- a/internal/cmd/volume/snapshot/list/list.go +++ b/internal/cmd/volume/snapshot/list/list.go @@ -8,6 +8,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -18,8 +19,9 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/tables" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + + "github.com/stackitcloud/stackit-cli/internal/pkg/projectname" ) const ( diff --git a/internal/cmd/volume/snapshot/snapshot.go b/internal/cmd/volume/snapshot/snapshot.go index 579233ca9..09640dc9b 100644 --- a/internal/cmd/volume/snapshot/snapshot.go +++ b/internal/cmd/volume/snapshot/snapshot.go @@ -2,6 +2,7 @@ package snapshot import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/create" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/delete" "github.com/stackitcloud/stackit-cli/internal/cmd/volume/snapshot/describe" diff --git a/internal/cmd/volume/snapshot/update/update.go b/internal/cmd/volume/snapshot/update/update.go index f48649743..5b83aaeaf 100644 --- a/internal/cmd/volume/snapshot/update/update.go +++ b/internal/cmd/volume/snapshot/update/update.go @@ -7,6 +7,7 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" diff --git a/internal/cmd/volume/update/update.go b/internal/cmd/volume/update/update.go index 3c8f447d3..34fd7e31a 100644 --- a/internal/cmd/volume/update/update.go +++ b/internal/cmd/volume/update/update.go @@ -7,6 +7,8 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/types" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/args" cliErr "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/examples" @@ -16,7 +18,6 @@ import ( "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/client" iaasUtils "github.com/stackitcloud/stackit-cli/internal/pkg/services/iaas/utils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/cmd/volume/update/update_test.go b/internal/cmd/volume/update/update_test.go index 0f34841aa..da2d05b7e 100644 --- a/internal/cmd/volume/update/update_test.go +++ b/internal/cmd/volume/update/update_test.go @@ -9,10 +9,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" + "github.com/stackitcloud/stackit-sdk-go/services/iaas" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/iaas" ) const ( diff --git a/internal/pkg/auth/auth_test.go b/internal/pkg/auth/auth_test.go index 6ae4fbfc5..134850263 100644 --- a/internal/pkg/auth/auth_test.go +++ b/internal/pkg/auth/auth_test.go @@ -18,10 +18,11 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/uuid" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-sdk-go/core/clients" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/zalando/go-keyring" + + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) const saKeyStrPattern = `{ diff --git a/internal/pkg/auth/storage_test.go b/internal/pkg/auth/storage_test.go index 37eeee33e..d7320917e 100644 --- a/internal/pkg/auth/storage_test.go +++ b/internal/pkg/auth/storage_test.go @@ -6,8 +6,9 @@ import ( "testing" "time" - "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/zalando/go-keyring" + + "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) func TestSetGetAuthField(t *testing.T) { diff --git a/internal/pkg/auth/user_login.go b/internal/pkg/auth/user_login.go index 9024c4f7d..822b7daff 100644 --- a/internal/pkg/auth/user_login.go +++ b/internal/pkg/auth/user_login.go @@ -16,9 +16,10 @@ import ( "strings" "time" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "golang.org/x/oauth2" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) diff --git a/internal/pkg/auth/user_token_flow.go b/internal/pkg/auth/user_token_flow.go index 622de04cb..2e12b59a4 100644 --- a/internal/pkg/auth/user_token_flow.go +++ b/internal/pkg/auth/user_token_flow.go @@ -10,6 +10,7 @@ import ( "time" "github.com/golang-jwt/jwt/v5" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) diff --git a/internal/pkg/auth/user_token_flow_test.go b/internal/pkg/auth/user_token_flow_test.go index 51c1570e6..d89015ec2 100644 --- a/internal/pkg/auth/user_token_flow_test.go +++ b/internal/pkg/auth/user_token_flow_test.go @@ -10,8 +10,9 @@ import ( "github.com/golang-jwt/jwt/v5" "github.com/spf13/cobra" - "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/zalando/go-keyring" + + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) const ( diff --git a/internal/pkg/auth/utils.go b/internal/pkg/auth/utils.go index a1be5a546..faf24b687 100644 --- a/internal/pkg/auth/utils.go +++ b/internal/pkg/auth/utils.go @@ -7,6 +7,7 @@ import ( "net/http" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" diff --git a/internal/pkg/auth/utils_test.go b/internal/pkg/auth/utils_test.go index 0f3cd1c78..6fd67fc75 100644 --- a/internal/pkg/auth/utils_test.go +++ b/internal/pkg/auth/utils_test.go @@ -5,8 +5,9 @@ import ( "github.com/google/go-cmp/cmp" "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/zalando/go-keyring" + + "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) func TestGetWellKnownConfig(t *testing.T) { diff --git a/internal/pkg/cache/cache_test.go b/internal/pkg/cache/cache_test.go index 4ef45891b..fe0c143cc 100644 --- a/internal/pkg/cache/cache_test.go +++ b/internal/pkg/cache/cache_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/uuid" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" ) diff --git a/internal/pkg/config/profiles.go b/internal/pkg/config/profiles.go index cf96d222e..83d48be2a 100644 --- a/internal/pkg/config/profiles.go +++ b/internal/pkg/config/profiles.go @@ -8,6 +8,7 @@ import ( "regexp" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/fileutils" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/pkg/flags/flag_to_value.go b/internal/pkg/flags/flag_to_value.go index f9d8ebebe..b7d8194ed 100644 --- a/internal/pkg/flags/flag_to_value.go +++ b/internal/pkg/flags/flag_to_value.go @@ -5,6 +5,7 @@ import ( "time" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) diff --git a/internal/pkg/flags/flag_to_value_test.go b/internal/pkg/flags/flag_to_value_test.go index 08d25ed9b..6da23001a 100644 --- a/internal/pkg/flags/flag_to_value_test.go +++ b/internal/pkg/flags/flag_to_value_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) diff --git a/internal/pkg/generic-client/generic_client.go b/internal/pkg/generic-client/generic_client.go index 64ede2600..ba5185dcb 100644 --- a/internal/pkg/generic-client/generic_client.go +++ b/internal/pkg/generic-client/generic_client.go @@ -2,12 +2,13 @@ package genericclient import ( "github.com/spf13/viper" + sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" + "github.com/stackitcloud/stackit-cli/internal/pkg/auth" "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" ) type CreateApiClient[T any] func(opts ...sdkConfig.ConfigurationOption) (T, error) diff --git a/internal/pkg/projectname/project_name_test.go b/internal/pkg/projectname/project_name_test.go index ae6d79251..9b84509ff 100644 --- a/internal/pkg/projectname/project_name_test.go +++ b/internal/pkg/projectname/project_name_test.go @@ -7,6 +7,7 @@ import ( "github.com/google/uuid" "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) diff --git a/internal/pkg/services/cdn/client/client.go b/internal/pkg/services/cdn/client/client.go index afefb7a92..844f077ef 100644 --- a/internal/pkg/services/cdn/client/client.go +++ b/internal/pkg/services/cdn/client/client.go @@ -2,10 +2,11 @@ package client import ( "github.com/spf13/viper" + "github.com/stackitcloud/stackit-sdk-go/services/cdn" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/cdn" ) func ConfigureClient(p *print.Printer, cliVersion string) (*cdn.APIClient, error) { diff --git a/internal/pkg/services/dns/utils/utils.go b/internal/pkg/services/dns/utils/utils.go index 141fb50e0..030c86b55 100644 --- a/internal/pkg/services/dns/utils/utils.go +++ b/internal/pkg/services/dns/utils/utils.go @@ -5,8 +5,9 @@ import ( "fmt" "math" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/dns" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) type DNSClient interface { diff --git a/internal/pkg/services/dns/utils/utils_test.go b/internal/pkg/services/dns/utils/utils_test.go index 12cae8fdc..b7c91bff9 100644 --- a/internal/pkg/services/dns/utils/utils_test.go +++ b/internal/pkg/services/dns/utils/utils_test.go @@ -6,8 +6,9 @@ import ( "testing" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/dns" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) var ( diff --git a/internal/pkg/services/edge/client/client.go b/internal/pkg/services/edge/client/client.go index 88ec7e2c4..77d2677ea 100644 --- a/internal/pkg/services/edge/client/client.go +++ b/internal/pkg/services/edge/client/client.go @@ -7,10 +7,11 @@ import ( "context" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-sdk-go/services/edge" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/edge" ) // APIClient is an interface that consolidates all client functionality to allow for mocking of the API client during testing. diff --git a/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go b/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go index 59bbba0b0..e196052c4 100755 --- a/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go +++ b/internal/pkg/services/edge/common/kubeconfig/kubeconfig_test.go @@ -11,9 +11,10 @@ import ( "strings" "testing" + "k8s.io/client-go/tools/clientcmd" + testUtils "github.com/stackitcloud/stackit-cli/internal/pkg/testutils" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "k8s.io/client-go/tools/clientcmd" ) var ( diff --git a/internal/pkg/services/edge/common/validation/input.go b/internal/pkg/services/edge/common/validation/input.go index 33a2d0c46..c32f8a9be 100644 --- a/internal/pkg/services/edge/common/validation/input.go +++ b/internal/pkg/services/edge/common/validation/input.go @@ -5,6 +5,7 @@ package validation import ( "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/flags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" diff --git a/internal/pkg/services/edge/common/validation/input_test.go b/internal/pkg/services/edge/common/validation/input_test.go index 0ccb2d3b2..b058f1427 100755 --- a/internal/pkg/services/edge/common/validation/input_test.go +++ b/internal/pkg/services/edge/common/validation/input_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" commonErr "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/error" commonInstance "github.com/stackitcloud/stackit-cli/internal/pkg/services/edge/common/instance" diff --git a/internal/pkg/services/git/utils/utils_test.go b/internal/pkg/services/git/utils/utils_test.go index 7ec5dc494..ed388263f 100644 --- a/internal/pkg/services/git/utils/utils_test.go +++ b/internal/pkg/services/git/utils/utils_test.go @@ -5,8 +5,9 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/git" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) type GitClientMocked struct { diff --git a/internal/pkg/services/iaas/utils/utils_test.go b/internal/pkg/services/iaas/utils/utils_test.go index ce97616b8..61ec9b02d 100644 --- a/internal/pkg/services/iaas/utils/utils_test.go +++ b/internal/pkg/services/iaas/utils/utils_test.go @@ -6,8 +6,9 @@ import ( "reflect" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) var _ IaaSClient = &IaaSClientMocked{} diff --git a/internal/pkg/services/intake/client/client.go b/internal/pkg/services/intake/client/client.go index efb8d0cfd..2a0e89400 100644 --- a/internal/pkg/services/intake/client/client.go +++ b/internal/pkg/services/intake/client/client.go @@ -2,10 +2,11 @@ package client import ( "github.com/spf13/viper" + "github.com/stackitcloud/stackit-sdk-go/services/intake" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/intake" ) // ConfigureClient creates and configures a new Intake API client diff --git a/internal/pkg/services/logs/client/client.go b/internal/pkg/services/logs/client/client.go index 6bce9b246..a5297b31a 100644 --- a/internal/pkg/services/logs/client/client.go +++ b/internal/pkg/services/logs/client/client.go @@ -1,10 +1,11 @@ package client import ( + "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/logs" "github.com/spf13/viper" ) diff --git a/internal/pkg/services/logs/utils/utils_test.go b/internal/pkg/services/logs/utils/utils_test.go index 78839fb10..0f780c1d6 100644 --- a/internal/pkg/services/logs/utils/utils_test.go +++ b/internal/pkg/services/logs/utils/utils_test.go @@ -5,9 +5,10 @@ import ( "fmt" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/logs" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/google/uuid" ) diff --git a/internal/pkg/services/mongodbflex/client/client.go b/internal/pkg/services/mongodbflex/client/client.go index 58613728b..7bb81905e 100644 --- a/internal/pkg/services/mongodbflex/client/client.go +++ b/internal/pkg/services/mongodbflex/client/client.go @@ -2,10 +2,11 @@ package client import ( "github.com/spf13/viper" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) func ConfigureClient(p *print.Printer, cliVersion string) (*mongodbflex.APIClient, error) { diff --git a/internal/pkg/services/mongodbflex/utils/utils.go b/internal/pkg/services/mongodbflex/utils/utils.go index a5cbc7016..352cdc948 100644 --- a/internal/pkg/services/mongodbflex/utils/utils.go +++ b/internal/pkg/services/mongodbflex/utils/utils.go @@ -7,9 +7,10 @@ import ( "slices" "strings" - "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "golang.org/x/mod/semver" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" + "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex" ) diff --git a/internal/pkg/services/network-area/routing-table/utils/utils.go b/internal/pkg/services/network-area/routing-table/utils/utils.go index 19e68a551..9783dd918 100644 --- a/internal/pkg/services/network-area/routing-table/utils/utils.go +++ b/internal/pkg/services/network-area/routing-table/utils/utils.go @@ -4,8 +4,9 @@ import ( "fmt" "time" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) type RouteDetails struct { diff --git a/internal/pkg/services/network-area/routing-table/utils/utils_test.go b/internal/pkg/services/network-area/routing-table/utils/utils_test.go index e08c796d6..d5deee061 100644 --- a/internal/pkg/services/network-area/routing-table/utils/utils_test.go +++ b/internal/pkg/services/network-area/routing-table/utils/utils_test.go @@ -5,8 +5,9 @@ import ( "time" "github.com/google/go-cmp/cmp" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ipv4 = "ipv4" diff --git a/internal/pkg/services/object-storage/utils/utils_test.go b/internal/pkg/services/object-storage/utils/utils_test.go index 16c9c6c1b..1a93b9968 100644 --- a/internal/pkg/services/object-storage/utils/utils_test.go +++ b/internal/pkg/services/object-storage/utils/utils_test.go @@ -8,9 +8,10 @@ import ( "testing" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" objectstorage "github.com/stackitcloud/stackit-sdk-go/services/objectstorage/v2api" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) var ( diff --git a/internal/pkg/services/observability/client/client.go b/internal/pkg/services/observability/client/client.go index 83c496121..eae8204d7 100644 --- a/internal/pkg/services/observability/client/client.go +++ b/internal/pkg/services/observability/client/client.go @@ -1,10 +1,11 @@ package client import ( + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/observability" "github.com/spf13/viper" ) diff --git a/internal/pkg/services/observability/utils/utils.go b/internal/pkg/services/observability/utils/utils.go index da4f099bf..7a15180c5 100644 --- a/internal/pkg/services/observability/utils/utils.go +++ b/internal/pkg/services/observability/utils/utils.go @@ -5,9 +5,10 @@ import ( "fmt" "strings" + "github.com/stackitcloud/stackit-sdk-go/services/observability" + "github.com/stackitcloud/stackit-cli/internal/pkg/errors" "github.com/stackitcloud/stackit-cli/internal/pkg/utils" - "github.com/stackitcloud/stackit-sdk-go/services/observability" ) const ( diff --git a/internal/pkg/services/resourcemanager/utils/utils_test.go b/internal/pkg/services/resourcemanager/utils/utils_test.go index bcd0ad2d0..5c79c7354 100644 --- a/internal/pkg/services/resourcemanager/utils/utils_test.go +++ b/internal/pkg/services/resourcemanager/utils/utils_test.go @@ -6,8 +6,9 @@ import ( "testing" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) var ( diff --git a/internal/pkg/services/secrets-manager/utils/utils_test.go b/internal/pkg/services/secrets-manager/utils/utils_test.go index d79ca49f7..f0d926b0b 100644 --- a/internal/pkg/services/secrets-manager/utils/utils_test.go +++ b/internal/pkg/services/secrets-manager/utils/utils_test.go @@ -6,8 +6,9 @@ import ( "testing" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/secretsmanager" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) var ( diff --git a/internal/pkg/services/service-enablement/client/client.go b/internal/pkg/services/service-enablement/client/client.go index e0bced744..6aa7324b1 100644 --- a/internal/pkg/services/service-enablement/client/client.go +++ b/internal/pkg/services/service-enablement/client/client.go @@ -2,6 +2,7 @@ package client import ( "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" diff --git a/internal/pkg/services/sfs/client/client.go b/internal/pkg/services/sfs/client/client.go index 3dc2ef801..0e9057501 100644 --- a/internal/pkg/services/sfs/client/client.go +++ b/internal/pkg/services/sfs/client/client.go @@ -1,10 +1,11 @@ package client import ( + "github.com/stackitcloud/stackit-sdk-go/services/sfs" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" genericclient "github.com/stackitcloud/stackit-cli/internal/pkg/generic-client" "github.com/stackitcloud/stackit-cli/internal/pkg/print" - "github.com/stackitcloud/stackit-sdk-go/services/sfs" "github.com/spf13/viper" ) diff --git a/internal/pkg/services/sfs/utils/utils_test.go b/internal/pkg/services/sfs/utils/utils_test.go index de4dbe11f..0f7ef08bb 100644 --- a/internal/pkg/services/sfs/utils/utils_test.go +++ b/internal/pkg/services/sfs/utils/utils_test.go @@ -6,8 +6,9 @@ import ( "testing" "github.com/google/uuid" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "github.com/stackitcloud/stackit-sdk-go/services/sfs" + + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" ) const ( diff --git a/internal/pkg/services/ske/utils/utils.go b/internal/pkg/services/ske/utils/utils.go index 5b4f46561..11b4b3930 100644 --- a/internal/pkg/services/ske/utils/utils.go +++ b/internal/pkg/services/ske/utils/utils.go @@ -9,9 +9,10 @@ import ( "regexp" "strconv" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "k8s.io/client-go/tools/clientcmd" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" "golang.org/x/mod/semver" ) diff --git a/internal/pkg/services/ske/utils/utils_test.go b/internal/pkg/services/ske/utils/utils_test.go index e6ade49fa..23f8adbac 100644 --- a/internal/pkg/services/ske/utils/utils_test.go +++ b/internal/pkg/services/ske/utils/utils_test.go @@ -7,9 +7,10 @@ import ( "path/filepath" "testing" - "github.com/stackitcloud/stackit-cli/internal/pkg/utils" "k8s.io/client-go/tools/clientcmd" + "github.com/stackitcloud/stackit-cli/internal/pkg/utils" + "github.com/google/go-cmp/cmp" "github.com/google/uuid" ske "github.com/stackitcloud/stackit-sdk-go/services/ske/v2api" diff --git a/internal/pkg/testutils/parse_input.go b/internal/pkg/testutils/parse_input.go index a0deafbc7..df961b8b8 100755 --- a/internal/pkg/testutils/parse_input.go +++ b/internal/pkg/testutils/parse_input.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/types" diff --git a/internal/pkg/testutils/parse_input_test.go b/internal/pkg/testutils/parse_input_test.go index 32008eea3..6b5d6c36b 100755 --- a/internal/pkg/testutils/parse_input_test.go +++ b/internal/pkg/testutils/parse_input_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/print" "github.com/stackitcloud/stackit-cli/internal/pkg/types" ) diff --git a/internal/pkg/testutils/testutils.go b/internal/pkg/testutils/testutils.go index ceecf888a..d11a7ed6d 100644 --- a/internal/pkg/testutils/testutils.go +++ b/internal/pkg/testutils/testutils.go @@ -7,6 +7,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/spf13/cobra" + "github.com/stackitcloud/stackit-cli/internal/pkg/globalflags" "github.com/stackitcloud/stackit-cli/internal/pkg/print" ) diff --git a/internal/pkg/utils/utils.go b/internal/pkg/utils/utils.go index 862b92c8f..0cb50a3d4 100644 --- a/internal/pkg/utils/utils.go +++ b/internal/pkg/utils/utils.go @@ -11,9 +11,10 @@ import ( "github.com/inhies/go-bytesize" "github.com/spf13/cobra" "github.com/spf13/viper" - "github.com/stackitcloud/stackit-cli/internal/pkg/config" sdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/services/iaas" + + "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) // Ptr Returns the pointer to any type T diff --git a/internal/pkg/utils/utils_test.go b/internal/pkg/utils/utils_test.go index 4591c84c9..0b5a656af 100644 --- a/internal/pkg/utils/utils_test.go +++ b/internal/pkg/utils/utils_test.go @@ -9,6 +9,7 @@ import ( "github.com/stackitcloud/stackit-sdk-go/services/iaas" "github.com/spf13/viper" + "github.com/stackitcloud/stackit-cli/internal/pkg/config" ) From 83cf194696a63020487f5016bb10608b591603b0 Mon Sep 17 00:00:00 2001 From: Lukas Hoehl Date: Wed, 8 Apr 2026 08:42:08 +0200 Subject: [PATCH 422/422] feat(image): list all (#1356) * feat(image): list all Signed-off-by: Lukas Hoehl * examples Signed-off-by: Lukas Hoehl * print scope and owner Signed-off-by: Lukas Hoehl * docs Signed-off-by: Lukas Hoehl --------- Signed-off-by: Lukas Hoehl Co-authored-by: cgoetz-inovex --- docs/stackit_image_list.md | 6 +++++- internal/cmd/image/list/list.go | 27 +++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/docs/stackit_image_list.md b/docs/stackit_image_list.md index eae2a3409..28b759eb0 100644 --- a/docs/stackit_image_list.md +++ b/docs/stackit_image_list.md @@ -13,7 +13,7 @@ stackit image list [flags] ### Examples ``` - List all images + List images in your project $ stackit image list List images with label @@ -21,11 +21,15 @@ stackit image list [flags] List the first 10 images $ stackit image list --limit=10 + + List all images + $ stackit image list --all ``` ### Options ``` + --all List all images available -h, --help Help for "stackit image list" --label-selector string Filter by label --limit int Limit the output to the first n elements diff --git a/internal/cmd/image/list/list.go b/internal/cmd/image/list/list.go index 7a472e178..ba21fbe84 100644 --- a/internal/cmd/image/list/list.go +++ b/internal/cmd/image/list/list.go @@ -25,11 +25,13 @@ type inputModel struct { *globalflags.GlobalFlagModel LabelSelector *string Limit *int64 + All *bool } const ( labelSelectorFlag = "label-selector" limitFlag = "limit" + allFlag = "all" ) func NewCmd(params *types.CmdParams) *cobra.Command { @@ -40,7 +42,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { Args: args.NoArgs, Example: examples.Build( examples.NewExample( - `List all images`, + `List images in your project`, `$ stackit image list`, ), examples.NewExample( @@ -51,6 +53,10 @@ func NewCmd(params *types.CmdParams) *cobra.Command { `List the first 10 images`, `$ stackit image list --limit=10`, ), + examples.NewExample( + `List all images`, + `$ stackit image list --all`, + ), ), RunE: func(cmd *cobra.Command, args []string) error { ctx := context.Background() @@ -103,6 +109,7 @@ func NewCmd(params *types.CmdParams) *cobra.Command { func configureFlags(cmd *cobra.Command) { cmd.Flags().String(labelSelectorFlag, "", "Filter by label") cmd.Flags().Int64(limitFlag, 0, "Limit the output to the first n elements") + cmd.Flags().Bool(allFlag, false, "List all images available") } func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, error) { @@ -123,6 +130,7 @@ func parseInput(p *print.Printer, cmd *cobra.Command, _ []string) (*inputModel, GlobalFlagModel: globalFlags, LabelSelector: flags.FlagToStringPointer(p, cmd, labelSelectorFlag), Limit: limit, + All: flags.FlagToBoolPointer(p, cmd, allFlag), } p.DebugInputModel(model) @@ -134,13 +142,17 @@ func buildRequest(ctx context.Context, model *inputModel, apiClient *iaas.APICli if model.LabelSelector != nil { request = request.LabelSelector(*model.LabelSelector) } + if model.All != nil { + request = request.All(*model.All) + } return request } + func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) error { return p.OutputResult(outputFormat, items, func() error { table := tables.NewTable() - table.SetHeader("ID", "NAME", "OS", "ARCHITECTURE", "DISTRIBUTION", "VERSION", "LABELS") + table.SetHeader("ID", "NAME", "OS", "ARCHITECTURE", "DISTRIBUTION", "VERSION", "SCOPE", "OWNER", "LABELS") for i := range items { item := items[i] var ( @@ -148,6 +160,8 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err os = "n/a" distro = "n/a" version = "n/a" + owner = "n/a" + scope = "n/a" ) if cfg := item.Config; cfg != nil { if v := cfg.Architecture; v != nil { @@ -163,12 +177,21 @@ func outputResult(p *print.Printer, outputFormat string, items []iaas.Image) err version = *v.Get() } } + if v := item.GetOwner(); v != "" { + owner = v + } + if v := item.GetScope(); v != "" { + scope = v + } + table.AddRow(utils.PtrString(item.Id), utils.PtrString(item.Name), os, architecture, distro, version, + scope, + owner, utils.JoinStringKeysPtr(*item.Labels, ",")) } err := table.Display(p)